我必须维护一个代码,以比较两个集合的项目
TypeError: currentItem.getText is not a function
我试图简化所有这些迭代,我想知道上面的代码是否等同于下面的代码
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
语句的顺序似乎比pointed out by Knoop更有效。关于第2点,请考虑使用更现实的业务代码
Any
因为这里描述的典型业务问题是比较两个集合并寻找丢失,匹配和不同的记录,而后者(不同但不是丢失的记录)就是问题中报告的内容
答案 0 :(得分:0)
这里描述的典型业务问题是比较2个集合并寻找缺失,匹配和不同的记录,后者(不同但不是缺失的记录)是问题中报告的内容
如果您既想要功能又高效的解决方案,则可以使用Enumerable.Aggregate
LINQ扩展方法,如类似的answer所建议,该方法在第一个集合中包装在外部Where
中list1
。
(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;
完整的代码段fiddle。