dna*_*oli 2 linq vb.net optimization
我一直在阅读有关使用LINQ的性能,而不是使用每个循环的性能,并且从我理解的使用LINQ查询会稍微慢一点,但通常值得为方便和表达.但是,如果你在for循环中使用查询结果,我会感到有点困惑.
假设我有一个名为'Locations'的集合和一组名为'Items'的对象.每个"项目"只能属于一个"位置".我想将相同位置下的项链接到彼此.如果我使用正常的'For Each'循环来执行此操作,它将是这样的:
For Each it as Item in Items
If it.Location.equals(Me.Location)
Me.LinkedItems.Add(it)
End If
Next
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用LINQ,它将改为:
For Each it as Item in Items.Where(Function(i) i.Location.equals(Me.Location))
Me.LinkedItems.Add(it)
Next
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,第二个(LINQ)选项是否会循环遍历整个'Items'集以完成查询,然后遍历结果以将它们添加到列表中,从而导致基本上两个循环,或者它会做什么像第一个(For Each)选项一样的循环?如果答案是前者,那么我认为在这种情况下使用LINQ会很愚蠢.
它将做一个循环 - 它被懒惰评估.
但是,你可能比这更好.这是什么类型的LinkedItems?如果它有适当的AddRange方法,你应该能够做到:
Me.LinkedItems.AddRange(Items.Where(Function(i) i.Location.equals(Me.Location)))
Run Code Online (Sandbox Code Playgroud)
更多关于懒惰评估
基本上Where维护一个迭代器,只在你要求时找到下一个匹配项.在C#中,实现类似于:
// Error handling omitted
public static IEnumerable<T> Where(this IEnumerable<T> source,
Func<T, bool> predicate)
{
foreach (T element in source)
{
if (predicate(element))
{
yield return element;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是在yield return这里使用它会使其懒惰评估.如果您不熟悉C#迭代器块,您可能需要查看这些 更详细解释它们的文章.
当然Where 可以 "手动"实现而不是使用迭代器块,但上面的实现足以显示惰性求值.