如何在LINQ中询问"是否只有一个满足条件的元素"?

Mik*_*ike 17 .net c# linq

快速问题,编程问题的最佳方法是什么?"这个序列中是否只有一个元素满足X条件?" 使用Linq?

// Pretend that the .OneAndOnlyOne() method exists
int[] sequence = new int[] { 1, 1, 2, 3, 5, 8 };
Assert.IsTrue(sequence.OneAndOnlyOne(x => x == 2);
Assert.IsFalse(sequence.OneAndOnlyOne(x => x == 1);
Run Code Online (Sandbox Code Playgroud)

这样的事情可以通过以下方式完成:

sequence.SingleOrDefault(x => x == 2) != null;
Run Code Online (Sandbox Code Playgroud)

但那有点笨重.

我想我可以推出自己的扩展方法,但这似乎是我的代码中常见的模式,我想确保有一个很好的干净方法来做到这一点.有没有办法使用内置的LINQ方法?

Lee*_*Lee 35

你可以这样做:

bool onlyOne = source.Where(/*condition*/).Take(2).Count() == 1
Run Code Online (Sandbox Code Playgroud)

这将防止计数在多次匹配的情况下不必要地枚举大序列.

  • 如果没有.Take(2),Count()将遍历整个集合,计算有多少元素.如果集合中有许多甚至无限数量的项目,则需要很长/无限的时间.使用.Take(2),它将迭代最多2个项目. (4认同)

Mic*_*sen 6

最简单的方法是使用Count.Single不适合你,因为如果不存在单个元素,它会抛出异常.

LBushkin建议(在评论中)使用SequenceEqual来比较序列与另一个序列.您可以通过使用Skip(1)跳过第一个元素并将结果序列与空序列(例如您可以从Empty获得的内容)进行比较来使用它

  • 是的,但如果我的.OneAndOnlyOne()方法在序列上运行并命中满足谓词的第二个元素 - 它可以立即返回false.Count()将枚举整个序列 (2认同)