3

Any、Exists、および Single を LINQ で使用できることは知っていますが、これを機能させることはできません。ID に基づいてルックアップを行い、ID が配列内にあるかどうかを確認し、その値に一致するものが 1 つしかないことを確認する必要があります。2つあると問題が発生するため..私がチェックしている要件は、配列が配列内の各IDを1つだけ持つことです。

これが私が試したものです

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

この状況に合わせて 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() の問題は、要素が 1 つだけ存在しない場合に例外がスローされることです。これを try-catch でラップすることもできますが、一致する要素が複数あるほとんどの場合、これは Count() よりもクリーンで効率的です。残念ながら、配列全体をチェックして、述語に一致する要素が存在しないか、1 つしかないことを確認する方法はありませんが、2 つ以上の要素がある場合、Count() が常に一致する要素が 1 つまたは 50 であるかどうかにかかわらず、Enumerable 全体を評価します。

于 2013-01-11T04:10:43.833 に答える
1

あなたはこれを考えすぎていると思います。

var targetNumber = 3;
var hasExactlyOne = someIntArray.Count(i => i == targetNumber) == 1;
于 2013-01-11T03:05:10.543 に答える
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 に答える