【问题标题】:Chaining IEnumerables in C#?在 C# 中链接 IEnumerables?
【发布时间】:2009-02-08 18:19:05
【问题描述】:

有没有一种简单的内置方法来获取IEnumerables 的有序列表并返回单个IEnumerable,它按顺序生成第一个中的所有元素,然后是第二个,依此类推。

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

【问题讨论】:

    标签: c# iterator ienumerable


    【解决方案1】:

    试试 SelectMany。

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

    这个函数的目的是将一组 IEnumerable> 扁平化为一个 IEnumerable。返回的数据将保留原始顺序。

    【讨论】:

      【解决方案2】:

      进一步了解 JaredPar 的(正确)答案 - 也是查询语法:

      var all = from inner in outer
                from item in inner
                select item;
      

      【讨论】:

        【解决方案3】:

        进一步了解(正确的)基于 LINQ 的答案...

        如果你不想使用 LINQ,你可以发明一个 ChainedEnumerable 类,使用 yield:

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

        【讨论】:

        • +1 这是一个不错且整洁的解决方案。我相信我会把它融入我的东西中!
        猜你喜欢
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-09
        • 1970-01-01
        相关资源
        最近更新 更多