3

我知道您可以将 Any、Exists 和 Single 与 LINQ 一起使用,但不能完全使其正常工作。我需要根据 id 进行查找以查看它是否在数组中,并确保该值只有一个匹配项。因为如果有 2 个它会导致问题..我要检查的要求是该数组只有一个且只有一个数组中的每个 ID。

这是我尝试过的

if(someIntArray.Single(item => item = 3)
    //... we found the value 8 in the array only once so now we can be confident and do something 
4

5 回答 5

3

以下是我将如何解决这个问题:

if (someIntArray.Count(item => item == 3) == 1)
{
    //only one '3' found in the array
    ...
}
于 2013-01-11T03:07:48.240 回答
1

我觉得你想多了。

var targetNumber = 3;
var hasExactlyOne = someIntArray.Count(i => i == targetNumber) == 1;
于 2013-01-11T03:05:10.543 回答
1

我为这种情况创建了一个 One() 扩展方法集:

public static bool One<T>(this IEnumerable<T> sequence)
{
   var enumerator = sequence.GetEnumerator();
   return enumerator.MoveNext() && !enumerator.MoveNext();
}

public static bool One<T>(this IEnumerable<T> sequence, Func<T, bool> predicate)
{
   return sequence.Where(predicate).One();
}

//usage
if (someIntArray.One(item => item == 3)) ...

Single() 的问题在于,如果不完全是一个元素,它会引发异常。您可以将它包装在一个 try-catch 中,但在大多数情况下,它们比 Count() 更清洁,更有效,因为有多个匹配元素。不幸的是,没有办法绕过检查整个数组来验证是否没有元素或只有一个与谓词匹配,但如果有两个或更多,这至少会“快速失败”,其中 Count() 总是评估整个 Enumerable 是否有一个匹配元素或五十个。

于 2013-01-11T04:10:43.833 回答
0

使用 LINQ 表达式:

var duplicates = from i in new int[] { 2,3,4,4,5,5 }
                 group i by i into g
                 where g.Count() > 1
                 select g.Key

结果:

{4,5}

当然,您可以检查duplicates.Count() > 0或记录有问题的问题或您需要做的任何事情。

于 2013-01-11T02:56:03.990 回答
-2

让它工作:

if(someIntArray.Single(item => item = 3) > 0)

多哈

于 2013-01-11T03:11:17.053 回答