这两个linq查询具有相同的性能吗?以及如何实现.any linq查询
本文关键字:查询 linq 何实现 实现 any 两个 性能 | 更新日期: 2023-09-27 18:06:45
例如,下面的复合查询+方法看起来不够好。我正在寻找更好的方法。
foreach (var x in A)
{
foreach (var y in B)
{
if (getLazyList(x, y).Any(z => z == y))
{
blacklist.Add(x);
break;
}
}
}
现在与@Bob Vale
提供的这个相比 var q = from x in A
from y in B
where getLazyList(x,y).Contains(y)
select x;
blacklist.AddRange(q);
第二个方法会做不必要的循环吗?在第一个例子中,我使用。any()和break来逃避内部循环,linq如何处理这个在第二种情况下?
这里有一个稍微不同的循环的LINQ重新实现:
blacklist.AddRange(A.Where(x => B.Any(y => getLazyList(x, y).Any(z => z == y))));
这个怎么样?
var q = from x in A
from y in B
where getLazyList(x,y).Contains(y)
select x;
blacklist.AddRange(q);
如果AddRange不起作用,则将最后一行替换为
foreach (var x in q) blacklist.Add(x);
要处理break,你必须使用any子句
var q = from x in A
where B.Any(y=>getLazyList(x,y).Contains(y))
select x
两个代码片段中的for
循环将执行相同的操作,唯一的区别是使用Contains
和Any
。
这个问题LINQ Ring: Any() vs Contains()用于大集合讨论了这两个操作符之间的区别。
通常Contains
应该不会比Any
慢,但可能在相同的时间执行。
不同之处在于Contains
将使用Equals
的实现来求值,而Any
接受委托。