[英]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)))
这似乎更易于管理,所以我尝试了一些测试用例,初步结果还可以。 您是否认为总体上是正确的,或者您能否发现需要第一个较长代码的情况(=与第二个较短的代码不同)?
评论中的一些有趣的注释。
Cond1
确定list2
的唯一键条件时,上述内容似乎是等价的,但在一般情况下当然不是这样。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.