Enumerable.Except Yöntem

Tanım

İki sıranın küme farkını üretir.

Aşırı Yüklemeler

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

Değerleri karşılaştırmak için varsayılan eşitlik karşılaştırıcısını kullanarak iki dizinin küme farkını üretir.

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)

Değerleri karşılaştırmak için belirtilen IEqualityComparer<T> öğesini kullanarak iki sıranın küme farkını üretir.

Açıklamalar

İki kümenin küme farkı, ikinci kümede görünmeyen ilk kümenin üyeleri olarak tanımlanır.

Bu yöntem içinde first görünmeyen secondöğeleri döndürür. içinde görünmeyen firstöğeleri second döndürmez. Yalnızca benzersiz öğeler döndürülür.

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>)

Kaynak:
Except.cs
Kaynak:
Except.cs
Kaynak:
Except.cs

Değerleri karşılaştırmak için varsayılan eşitlik karşılaştırıcısını kullanarak iki dizinin küme farkını üretir.

C#
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second);

Tür Parametreleri

TSource

Giriş dizilerinin öğelerinin türü.

Parametreler

first
IEnumerable<TSource>

IEnumerable<T> içinde bulunmayan second öğeleri döndürülür.

second
IEnumerable<TSource>

IEnumerable<T> İlk dizide de gerçekleşen öğeleri, bu öğelerin döndürülen diziden kaldırılmasına neden olur.

Döndürülenler

IEnumerable<TSource>

İki dizinin öğelerinin küme farkını içeren bir dizi.

Özel durumlar

first veya second şeklindedir null.

Örnekler

Aşağıdaki kod örneği, iki sayı dizisini karşılaştırmak ve yalnızca ilk sırada görünen öğeleri döndürmek için yönteminin nasıl kullanılacağını Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) gösterir.

C#
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
*/

Bazı özel veri türlerindeki nesne dizilerini karşılaştırmak istiyorsanız, yardımcı sınıfta genel arabirimi uygulamanız IEquatable<T> gerekir. Aşağıdaki kod örneği, bu arabirimin özel bir veri türünde nasıl uygulanıp ve Equals yöntemlerinin nasıl geçersiz kılınacaklarını GetHashCode gösterir.

C#
public class ProductA : IEquatable<ProductA>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(ProductA other)
    {
        if (other is null)
            return false;

        return this.Name == other.Name && this.Code == other.Code;
    }

    public override bool Equals(object obj) => Equals(obj as ProductA);
    public override int GetHashCode() => (Name, Code).GetHashCode();
}

Bu arabirimi uyguladıktan sonra, aşağıdaki örnekte gösterildiği gibi yöntemindeki Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) nesne dizilerini ProductA kullanabilirsiniz:

C#
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
*/

Açıklamalar

Bu yöntem ertelenmiş yürütme kullanılarak uygulanır. Hemen dönüş değeri, eylemi gerçekleştirmek için gereken tüm bilgileri depolayan bir nesnedir. Bu yöntemle temsil edilen sorgu, doğrudan yöntemini çağırarak GetEnumerator veya C# içinde veya For Each Visual Basic'te kullanarak foreach nesne numaralandırılana kadar yürütülür.

Türlerin değerlerini karşılaştırmak için varsayılan eşitlik karşılaştırıcısı Defaultkullanılır. Özel bir veri türünü karşılaştırmak için ve GetHashCode yöntemlerini geçersiz kılmanız Equals ve isteğe bağlı olarak özel türdeki genel arabirimi uygulamanız IEquatable<T> gerekir. Daha fazla bilgi için özelliğine Default bakın.

Şunlara uygulanır

.NET 9 ve diğer sürümler
Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Except<TSource>(IEnumerable<TSource>, IEnumerable<TSource>, IEqualityComparer<TSource>)

Kaynak:
Except.cs
Kaynak:
Except.cs
Kaynak:
Except.cs

Değerleri karşılaştırmak için belirtilen IEqualityComparer<T> öğesini kullanarak iki sıranın küme farkını üretir.

C#
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second, System.Collections.Generic.IEqualityComparer<TSource> comparer);
C#
public static System.Collections.Generic.IEnumerable<TSource> Except<TSource> (this System.Collections.Generic.IEnumerable<TSource> first, System.Collections.Generic.IEnumerable<TSource> second, System.Collections.Generic.IEqualityComparer<TSource>? comparer);

Tür Parametreleri

TSource

Giriş dizilerinin öğelerinin türü.

Parametreler

first
IEnumerable<TSource>

IEnumerable<T> içinde bulunmayan second öğeleri döndürülür.

second
IEnumerable<TSource>

IEnumerable<T> İlk dizide de gerçekleşen öğeleri, bu öğelerin döndürülen diziden kaldırılmasına neden olur.

comparer
IEqualityComparer<TSource>

Değerleri karşılaştırmak için bir IEqualityComparer<T> .

Döndürülenler

IEnumerable<TSource>

İki dizinin öğelerinin küme farkını içeren bir dizi.

Özel durumlar

first veya second şeklindedir null.

Örnekler

Bazı özel veri türlerindeki nesne dizilerini karşılaştırmak istiyorsanız, yardımcı sınıfta genel arabirimi uygulamanız IEqualityComparer<T> gerekir. Aşağıdaki kod örneği, bu arabirimin özel bir veri türünde nasıl uygulanıp ve Equals yöntemleri sağlanıp sağlanıp GetHashCode sağlanmay yapılacağını gösterir. Aşağıdaki örnekte yönteminde kullanılabilecek bir eşitlik karşılaştırıcısının nasıl uygulanacağı gösterilmektedir Except .

C#
public class Product
{
    public string Name { get; set; }
    public int Code { get; set; }
}

// Custom comparer for the Product class
class ProductComparer : IEqualityComparer<Product>
{
    // Products are equal if their names and product numbers are equal.
    public bool Equals(Product x, Product y)
    {

        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        //Check whether the products' properties are equal.
        return x.Code == y.Code && x.Name == y.Name;
    }

    // If Equals() returns true for a pair of objects
    // then GetHashCode() must return the same value for these objects.

    public int GetHashCode(Product product)
    {
        //Check whether the object is null
        if (Object.ReferenceEquals(product, null)) return 0;

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

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

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

Bu karşılaştırıcıyı uyguladıktan sonra, aşağıdaki örnekte gösterildiği gibi yöntemindeki Except nesne dizilerini Product kullanabilirsiniz:

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

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

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

IEnumerable<Product> except =
    fruits1.Except(fruits2, new ProductComparer());

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

/*
  This code produces the following output:

  orange 4
  lemon 12
*/

Açıklamalar

ise comparernull, değerleri karşılaştırmak için varsayılan eşitlik karşılaştırıcısı Defaultkullanılır.

Şunlara uygulanır

.NET 9 ve diğer sürümler
Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0