この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

Enumerable.Except<TSource> メソッド (IEnumerable<TSource>, IEnumerable<TSource>)

 

公開日: 2016年10月

既定の等値比較子を使用して値を比較することには、2 つのシーケンスの差集合を生成します。

名前空間:   System.Linq
アセンブリ:  System.Core (System.Core.dll 内)

public static IEnumerable<TSource> Except<TSource>(
	this IEnumerable<TSource> first,
	IEnumerable<TSource> second
)

パラメーター

first
Type: System.Collections.Generic.IEnumerable<TSource>

IEnumerable<T> 含まれていない要素が second が返されます。

second
Type: System.Collections.Generic.IEnumerable<TSource>

IEnumerable<T> それらの要素が返されるシーケンスから削除すると、最初のシーケンスでも発生する要素を格納します。

戻り値

Type: System.Collections.Generic.IEnumerable<TSource>

2 つのシーケンスの要素の差集合が格納されているシーケンス。

型パラメーター

TSource

入力シーケンスの要素の型。

Exception Condition
ArgumentNullException

first または secondnull です。

このメソッドは遅延実行を使用して実装されます。 すぐに、値は、操作を実行するために必要なすべての情報を格納するオブジェクトを返します。 オブジェクトのいずれかを呼び出すことが列挙されるまで、このメソッドで表されるクエリは実行されません、 GetEnumerator メソッドを使用して直接または foreach で Visual C# または For Each で Visual Basicします。

2 つの差集合は、2 番目のセットに記載されていない最初のセットのメンバーとして定義されます。

System_CAPS_noteメモ

このメソッドは、これらの要素を返します。 first にいないと思われる secondです。 これらの要素にも返されません second にいないと思われる firstです。

既定の等値比較子 Default, 、実装する型の値を比較に使用される、 IEqualityComparer<T> ジェネリック インターフェイスです。 カスタム データ型を比較する必要がありますこのインターフェイスを実装でき、独自 GetHashCodeEquals の型のメソッドです。

次のコード例を使用して、 Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) を 2 つの数値のシーケンスを比較し、要素を返すメソッドが最初のシーケンスにのみ表示されます。

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

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

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

/*
 This code produces the following output:

 2
 2.1
 2.3
 2.4
 2.5
*/

実装する必要があるいくつかのカスタム データ型のオブジェクトのシーケンスを比較する場合、 IEqualityComparer<T> 、helperclass でジェネリック インターフェイスです。 カスタム データ型にこのインターフェイスを実装でき、次のコード例に示します GetHashCodeEquals メソッドです。

public class ProductA
{ 
    public string Name { get; set; }
    public int Code { get; set; }
}

public class ProductComparer : IEqualityComparer<ProductA>
{

    public bool Equals(ProductA x, ProductA y)
    {
        //Check whether the objects are the same object. 
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether the products' properties are equal. 
        return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name);
    }

    public int GetHashCode(ProductA obj)
    {
        //Get hash code for the Name field if it is not null. 
        int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode();

        //Get hash code for the Code field. 
        int hashProductCode = obj.Code.GetHashCode();

        //Calculate the hash code for the product. 
        return hashProductName ^ hashProductCode;
    }
}

このインターフェイスを実装した後は、シーケンスを使用して ProductA 内のオブジェクト、 Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) メソッドを次の例に示すようにします。

ProductA[] fruits1 = { new ProductA { Name = "apple", Code = 9 }, 
                       new ProductA { Name = "orange", Code = 4 },
                        new ProductA { Name = "lemon", Code = 12 } };

ProductA[] fruits2 = { new ProductA { Name = "apple", Code = 9 } };

//Get all the elements from the first array
//except for the elements from the second array.

IEnumerable<ProductA> except =
    fruits1.Except(fruits2);

foreach (var product in except)
    Console.WriteLine(product.Name + " " + product.Code);

/*
  This code produces the following output:

  orange 4
  lemon 12
*/

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
3.5 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能
トップに戻る
表示: