繁体   English   中英

是否可以简化以下 Linq 表达式?

[英]Is it possible to simplify the following Linq expression?

我必须维护一个代码来比较两个 collections 的项目

list1.Where(item1 => list2.Any(item2 => Cond1(item1,item2)) &&
    !list2.Any(item2 => Cond2(item1,item2)) 
)

我试图简化所有这些迭代,我想知道上面的代码是否等同于以下代码

list1.Where(item1 => list2.Any(item2 => Cond1(item1,item2) && !Cond2(item1,item2)))

这似乎更易于管理,所以我尝试了一些测试用例,初步结果还可以。 您是否认为总体上是正确的,或者您能否发现需要第一个较长代码的情况(=与第二个较短的代码不同)?

编辑以反映评论

评论中的一些有趣的注释。

  1. 当且仅当Cond1确定list2的唯一键条件时,上述内容似乎是等价的,但在一般情况下当然不是这样。
  2. 正如Knoop 所指出的,颠倒两个Any语句的顺序似乎更有效。

关于第 2 点,请考虑更现实的业务代码将是

list1.Where(item1 => list2.Any(item2 => Cond1(item1,item2)) &&
    !list2.Any(item2 => Cond1(item1,item2) && Cond2(item1,item2)) 
)

因为这里描述的典型业务问题是比较 2 collections 并寻找缺失、匹配和不同的记录,后者(不同 - 但不缺失 - 记录)是问题中报告的

此处描述的典型业务问题是比较 2 collections 并寻找缺失、匹配和不同的记录,后者(不同 - 但不缺失 - 记录)是问题中报告的内容

如果您想要一个既实用又高效的解决方案,您可以使用Enumerable.Aggregate LINQ 扩展方法,如类似答案中所建议的那样,将其包装在第一个集合list1上的外部Where中。

(bool allVerified, bool anyVerified) = 
    list2.Aggregate( 
        ValueTuple.Create(true, false), 
        (tuple, item) => ValueTuple.Create(
            tuple.Item1 && !(Cond1(item1,item) && Cond2(item1,item)), 
            tuple.Item2 || Cond1(item1, item)) );
return allVerified && anyVerified;

完整的片段小提琴在这里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM