2017-02-03 8 views
3

以下のコードを実行すると、3回目が2回見えますが、Except()メソッドは同じ要素を1回だけ返します。彼らは二組のセットの差が第二セットには表示されません。最初のセットのメンバーとして定義されていると言うドキュメントでC#Enumerable.Except()は一度同じ要素を返します

List<int> x = new List<int>() {1, 2, 3, 3}; 
List<int> y = new List<int>() { 1, 2 }; 

var z = x.Except(y); /* returns 3, only once */ 

。重複した項目を1回だけ返すことは文書化されていません。 https://msdn.microsoft.com/en-us/library/bb300779(v=vs.110).aspx

これはバグですか、ここで何か不足していますか?

Expect()メソッドのコードは、https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,e289e6c98881b2b8です。

"if(!set.Contains(element))yield return element;" "if(set.Add(element))の代わりにreturn要素を返す";

+0

'set 'の定義は重複を含んでいないことを意味するので、これは意図したとおりに動作しています。 –

+0

この例には「2.3」が1回だけ含まれていますか? – TWT

+0

@xanatos - あなたがリンクしているページは、最初の列挙可能な項目( 'double [] numbers1 = {2.0,2.1,2.2,2.3,2.4,2.5};')のユニークな項目しか持たないようです。 – Corak

答えて

4

明らかに、これはバグではありません。 セットの差は、両方のシーケンスがセットとして扱われることを意味し、その結果、結果シーケンスに各エレメントが1回だけ含まれます。しかし、documentationは、倍精度が出力に出現するかどうかを実際に拡大しません。

関連する問題