在C#中链接IEnumerables?

时间:2009-02-08 18:19:06

标签: c# iterator ienumerable

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

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

3 个答案:

答案 0 :(得分:24)

尝试SelectMany。

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

该功能的目的是展平一组IEnumerable&lt; IEnumerable&lt; T&gt;&gt;进入IEnumerable&lt; T&gt;。返回的数据将保留原始订单。

答案 1 :(得分:15)

继JaredPar的(正确的)答案 - 还查询语法:

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

答案 2 :(得分:12)

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

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

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