我知道你可以使用任何,存在,和单一与LINQ,但不能完全得到这个工作。我需要做一个基于id的查找,看看它是否在数组中,并确保只有一个匹配的值。因为如果有两个,就会产生问题我检查的要求是数组中每个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
我将如何解决这个问题:
if (someIntArray.Count(item => item == 3) == 1)
{
//only one '3' found in the array
...
}
我为这种情况创建了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是否有一个或50个匹配元素。
我觉得你想太多了。
var targetNumber = 3;
var hasExactlyOne = someIntArray.Count(i => i == targetNumber) == 1;
使用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
或记录有问题的或任何你需要做的。
让它工作:
if(someIntArray.Single(item => item = 3) > 0)
度