代码之家  ›  专栏  ›  技术社区  ›  recursive

在C#中链接IEnumerables?

  •  19
  • recursive  · 技术社区  · 16 年前

    IEnumerable s并返回一个 数不清

    我当然可以写我自己的,但我想知道是否已经有一种方法来完成这项看似有用的任务之前,我这样做。

    3 回复  |  直到 16 年前
        1
  •  24
  •   JaredPar    16 年前

    IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){
     return e.SelectMany(x => x );
    }
    

    此函数的目的是展平一组IEnumerable<IEnumerable<T>&燃气轮机;变成一个IEnumerable<T>。返回的数据将保留原始顺序。

        2
  •  15
  •   Marc Gravell    16 年前

    除了JaredPar(正确)的回答,还有查询语法:

    var all = from inner in outer
              from item in inner
              select item;
    
        3
  •  13
  •   Roger Lipscombe    16 年前

    除了(正确的)基于LINQ的答案。。。

    public class ChainedEnumerable<T> : IEnumerable<T>
    {
        private readonly IEnumerable<T>[] _inners;
    
        public ChainedEnumerable(params IEnumerable<T>[] inners)
        {
            _inners = inners;
        }
    
        public IEnumerator<T> GetEnumerator()
        {
            foreach (IEnumerable<T> inner in _inners)
            {
                foreach (T t in inner)
                {
                    yield return t;
                }
            }
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
    

    像这样使用它:

    List<string> a = new List<string> { "A1", "A2", "A3" };
    List<string> b = new List<string> { "B1", "B2", "B3" };
    ChainedEnumerable<string> chainedEnumerable =
        new ChainedEnumerable<string>(a, b);
    foreach (string s in chainedEnumerable)
        Console.WriteLine(s);