这两个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查询具有相同的性能吗?以及如何实现.any 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循环将执行相同的操作,唯一的区别是使用ContainsAny

这个问题LINQ Ring: Any() vs Contains()用于大集合讨论了这两个操作符之间的区别。

通常Contains应该不会比Any慢,但可能在相同的时间执行。

不同之处在于Contains将使用Equals的实现来求值,而Any接受委托。