web-dev-qa-db-ja.com

LINQ Exceptはどのように機能しますか?

可能性のある複製:
LINQは2つのリストの違いを見つける

2つのシリーズの違いを見つけたいです。したがって、LINQステートメントでExceptを使用しています。ただし、Exceptは、最初のコレクションが2番目のコレクションよりも長い場合にのみ機能するようです。たとえば、2つのコレクションが異なっていても、これは結果を返しません。

double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers2.Except(numbers1);

これが事実であるかどうかは誰でも確認できますか?その場合、クエリを作成する前にコレクションの長さを確認する必要がありますか。コンパイル時にどのコレクションが大きくなるかわからないからです。

編集

私の質問は明確ではなかったと思います。どのコレクションに何が含まれているかは気にしません。 2つのコレクションの違いを見つけたいだけです。これどうやってするの?

29
gunnerz

101 LINQ Samples から取得:

int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
int[] numbersB = { 1, 3, 5, 7, 8 }; 

IEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB); 

Console.WriteLine("Numbers in first array but not second array:"); 
foreach (var n in aOnlyNumbers) 
{ 
    Console.WriteLine(n); 
}

結果

2番目の配列ではなく最初の配列の数値:0 2 4 6 9

47
Dany Marcoux

たとえば、これは結果を返しません...

そのとおりです。

2.2は最初のコレクションに存在するため、返すものは何もありません。

配列の長さとは関係ありません。

10
Jim G.

他の回答は、別のセットから数字のセットを削除する方法を示しています。あなたの質問を読んで、私はあなたが最初のものにあるが、2番目にはないもの、そしてその逆が欲しいと思う:

var numbers1 = new [] { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
var numbers2 = new [] { 2.2, 2.8 };

var intersect = numbers1.Intersect(numbers2);
var diff = numbers1.Concat(numbers2).Except(intersect);
5
Wasp