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

时间:2020-04-25 08:46:28

标签: c# linq

我必须维护一个代码,以比较两个集合的项目

TypeError: currentItem.getText is not a function

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

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

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

编辑以反映评论

评论中一些有趣的笔记。

  1. 当且仅当list1.Where(item1 => list2.Any(item2 => Cond1(item1,item2) && !Cond2(item1,item2))) Cond1确定唯一键条件时,上述内容才是等效的,但是在通常情况下,这当然是不正确的。
  2. 反转两个list2语句的顺序似乎比pointed out by Knoop更有效。

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

Any

因为这里描述的典型业务问题是比较两个集合并寻找丢失,匹配和不同的记录,而后者(不同但不是丢失的记录)就是问题中报告的内容

1 个答案:

答案 0 :(得分:0)

这里描述的典型业务问题是比较2个集合并寻找缺失,匹配和不同的记录,后者(不同但不是缺失的记录)是问题中报告的内容

如果您既想要功能又高效的解决方案,则可以使用Enumerable.Aggregate LINQ扩展方法,如类似的answer所建议,该方法在第一个集合中包装在外部Wherelist1

(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