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

用C#链接IEnumerous?

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

    是否有一种简单的内置方法来获取有序列表 IEnumerable s并返回单个 IEnumerable 这按顺序产生第一个元素,然后是第二个元素,以此类推。

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

    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的(正确)答案。..

    如果你不想使用LINQ,你可以使用yield创建一个ChaiedEnumerouble类:

    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);