Concat()如何实际加入较低级别的集合?

时间:2010-05-13 15:57:52

标签: c# linq collections

Linq究竟在做什么?

3 个答案:

答案 0 :(得分:9)

(我假设这是用于LINQ to Objects。其他任何东西都将以不同的方式实现:)

它只是从第一个返回所有内容,然后从第二个返回所有内容。所有数据都是流式传输的。像这样:

public static IEnumerable<T> Concat(this IEnumerable<T> source1,
    IEnumerable<T> source2)
{
    if (source1 == null)
    {
        throw new ArgumentNullException("source1");
    }
    if (source2 == null)
    {
        throw new ArgumentNullException("source1");
    }
    return ConcatImpl(source1, source2);
}


private static IEnumerable<T> ConcatImpl(this IEnumerable<T> source1,
    IEnumerable<T> source2)
{
    foreach (T item in source1)
    {
        yield return item;
    }
    foreach (T item in source2)
    {
        yield return item;
    }
}

我已经将它分成两个方法,以便可以急切地执行参数验证,但我仍然可以使用迭代器块。 (在第一次调用结果MoveNext()之前,迭代器块中的代码不会被执行。)

答案 1 :(得分:1)

它依次枚举每个集合,并产生每个元素。这样的事情:

public static IEnumerable<T> Concat<T>(this IEnumerable<T> source, IEnumerable<T> other)
{
    foreach(var item in source) yield return item;
    foreach(var item in other) yield return item;
}

(如果你看看使用Reflector的实际实现,你会看到迭代器实际上是在一个单独的方法中实现的)

答案 2 :(得分:1)

这取决于您使用的LINQ提供程序。 LinqToSql或L2E可能使用数据库UNION,而LINQ to Objects可能只是依次枚举这两个集合。