【发布时间】:2010-05-13 15:57:51
【问题描述】:
Linq 实际上在做什么?
【问题讨论】:
标签: c# linq collections
Linq 实际上在做什么?
【问题讨论】:
标签: c# linq collections
(我假设这是针对 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() 结果,迭代器块中的代码才会被执行。)
【讨论】:
return)。 ConcatImpl 在评估 LINQ 表达式时被调用(因为 yield return)。 @Jon:我很喜欢,但是男孩你快吗。也许我只会在您的时间凌晨 3 点时尝试回答。 :)
它依次枚举每个集合,并产生每个元素。类似的东西:
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 的实际实现,你会发现迭代器实际上是在单独的方法中实现的)
【讨论】:
这取决于您使用的 LINQ 提供程序。 LinqToSql 或 L2E 可能使用数据库 UNION,而 LINQ to Objects 可能只是依次为您枚举这两个集合。
【讨论】: