2016-09-22 13 views
1

linq any演算子の理解に問題があります。実行すると、それは私が期待してい何である次の出力linq等しくない演算子(!=)

b 
c 

を生成し(VS 2010および.NET 4.0を使用して)次のコードスニペット

List<string> sample = new List<string> { "a", "b", "c", "d" }; 
List<string> secondSample = new List<string> { "b", "c" }; 

foreach (string s in sample) 
{ 
    if(secondSample.Any(data=> data.ToString() == s)) 
     Console.WriteLine(s); 
} 

を考えることができます。私は、等価演算子(==)に等しくない(!=)を変更した場合しかし、私は私が

if(!(secondSample.Any(data=> data.ToString() == s))) 
にあれば条件を変更した場合、この

a 
b 
c 
d 

が、これは

a 
d 

すべきではない取得します

私は入手する

a 
d 

私の質問は間違った方法でAny演算子を解釈するのですか?あなたが変更されたときにsecondSampleからの値は、サンプル

答えて

4

あなたは=演算子を使用すると、あなたは、あなたがAllを使用する必要があり、結果としてa dを期待していない場合はAny:!

if(secondSample.All(data=> data.ToString() != s)) 
      Console.WriteLine(s); 

説明secondSample.Any(data=> data.ToString() != s)secondSampleでただ一つの要素が等しくない場合はtrueになります(あなたのsampleリスト内の)指定されたデータ項目に追加してください。そうすれば、常に真実になり、すべての要素がコンソールに書き込まれます。 2、配列AとBを持つ

よりよい解決策、あなたはLINQを使用してBにないものを要素にしたい場合は、Exceptを試すことができますすることができますし、共通の要素を探しているなら、あなたはIntersectを試みることがあります。

List<string> A = new List<string> { "a", "b", "c", "d" }; 
List<string> B= new List<string> { "b", "c" }; 

var AnotInB = A.Except(B).ToList(); //a, d 

var AInB = A.Intersect(B).ToList(); //b, c 
+0

ダウン投票者はコメントを残して説明することを検討する。 –

0

にそれがどれ、すべてではありませんされていない場合

if(secondSample.Any(data=> data.ToString() != s)) 

trueと評価すべきではありません!=

if(secondSample.All(data=> (data.ToString() != s))) 

あなたが表現内部を否定するときまたは、「AまたはB」の否定は「Not A and Bではない」となる。

1

オペレータは基本的に '述語に応答する要素がコレクション内にありますか'を質問します。あなたの場合はそれが存在するので正しい出力です。

2

!=任意の意味で、ALLは等しくない。

等しくないAnyがある場合は、それを読むと印刷できます。 そして、あなたはいつも少なくとも1つは等しくないと思います。だからあなたはすべての答えを得る。

あなたの他の声明で言う:あなたが印刷することができないと等しいもの...

任意の明確な?あなたが==を使用していたときに、最初のケースで

source - List<string> secondSample = new List<string> { "b", "c" }; 

Predicate - List<string> sample = new List<string> { "a", "b", "c", "d" }; 

+0

あなたの説明もとてもよかったです。簡潔でポイントまで。私は答えとしてマークすることしかできません。そうでなければ、私は両方ともにマークしていたでしょう – Muhid

0

マイクロソフトによってAnyソースコードの実装がされた後、今here

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) { 
      if (source == null) throw Error.ArgumentNull("source"); 
      if (predicate == null) throw Error.ArgumentNull("predicate"); 
      foreach (TSource element in source) { 
       if (predicate(element)) return true; 
      } 
      return false; 
     } 

をチェックし、あなたが提供する場合に適用されますそれは全体のコレクション(source)を通り越して、matchを得ることができ、結果が印刷されていた点です。

!=を適用した2番目のケースでは、すべてのケースで一致するものがあります。"a", "b", "c", "d"は存在しないため、すべてが印刷されます。この場合、作品を除き、なぜ

var result = sample.Except(secondSample); 

後はsetを使用することにより、実装、Infactはあり、重複が自動的に削除され

public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) 
     { 
      if (first == null) throw Error.ArgumentNull("first"); 
      if (second == null) throw Error.ArgumentNull("second"); 
      return ExceptIterator<TSource>(first, second, null); 
     } 

static IEnumerable<TSource> ExceptIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer) { 
      Set<TSource> set = new Set<TSource>(comparer); 
      foreach (TSource element in second) set.Add(element); 
      foreach (TSource element in first) 
       if (set.Add(element)) yield return element; 
     } 
1

使用が存在する

List<string> sample = new List<string> { "a", "b", "c", "d" }; 

List<string> secondSample = new List<string> { "b", "c" }; 

foreach (string s in sample) 
     {   
      if (!secondSample.Exists(data => data.ToString() == s))    
       Console.WriteLine(s); 
     } 
+0

Any演算子が間違った選択であった理由を説明すると、あなたの答えはより良くなります。 – Daz

関連する問題