Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Enumerable.Distinct<TSource>-Methode: (IEnumerable<TSource>)

 

Veröffentlicht: Oktober 2016

Gibt Sie mithilfe des Standardgleichheitsvergleichs zum Vergleichen von Werten unterschiedliche Elemente aus einer Sequenz zurück.

Namespace:   System.Linq
Assembly:  System.Core (in System.Core.dll)

public static IEnumerable<TSource> Distinct<TSource>(
	this IEnumerable<TSource> source
)

Parameter

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

Die Sequenz, aus der doppelte Elemente entfernt werden sollen.

Rückgabewert

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

Eine IEnumerable<T> die unterschiedliche Elemente aus der Quellsequenz enthält.

Typparameter

TSource

Der Typ der Elemente von source.

Exception Condition
ArgumentNullException

source ist null.

Diese Methode wird mit verzögerter Ausführung implementiert. Der sofortige Rückgabewert ist ein Objekt, das alle Informationen gespeichert hat, die zum Ausführen der Aktion erforderlich sind. Die von dieser Methode dargestellte Abfrage wird nicht ausgeführt, bis das Objekt aufgelistet wird, entweder durch Aufrufen der GetEnumerator -Methode direkt oder mithilfe von foreach in Visual C# oder For Each in Visual Basic.

Die Distinct<TSource>(IEnumerable<TSource>) -Methode gibt eine ungeordnete Sequenz, die keine doppelten Werte enthält. Der Standardgleichheitsvergleich verwendet Default, um Werte zu vergleichen.

In Visual Basic Abfragen Ausdruckssyntax, ein Distinct -Klausel übersetzt in einen Aufruf von Distinct<TSource>.

Der Standardgleichheitsvergleich Default, wird verwendet, um die Werte der Typen verglichen, die Implementierung der IEquatable<T> generische Schnittstelle. Um einen benutzerdefinierten Datentyp zu vergleichen, müssen Sie diese Schnittstelle implementieren, und geben Sie eigene GetHashCode und Equals Methoden für den Typ.

Ein Beispiel für die IEqualityComparer<T>zum Definieren eines benutzerdefinierten Vergleichs finden Sie unter Distinct<TSource>(IEnumerable<TSource>, IEqualityComparer<TSource>).

Im folgenden Codebeispiel wird veranschaulicht, wie Sie Distinct<TSource>(IEnumerable<TSource>) unterschiedliche Elemente aus einer Sequenz von ganzen Zahlen zurückgegeben.

List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };

IEnumerable<int> distinctAges = ages.Distinct();

Console.WriteLine("Distinct ages:");

foreach (int age in distinctAges)
{
    Console.WriteLine(age);
}

/*
 This code produces the following output:

 Distinct ages:
 21
 46
 55
 17
*/

Wenn Sie unterschiedliche Elemente aus Sequenzen von Objekten von einem benutzerdefinierten Datentyp zurückgeben möchten, müssen Sie implementieren die IEquatable<T> generische Schnittstelle in der Klasse. Im folgenden Codebeispiel wird veranschaulicht, wie implementieren diese Schnittstelle in einem benutzerdefinierten Datentyp aus, und geben Sie GetHashCode und Equals Methoden.

public class Product : IEquatable<Product>
{
    public string Name { get; set; }
    public int Code { get; set; }

    public bool Equals(Product other)
    {

        //Check whether the compared object is null. 
        if (Object.ReferenceEquals(other, null)) return false;

        //Check whether the compared object references the same data. 
        if (Object.ReferenceEquals(this, other)) return true;

        //Check whether the products' properties are equal. 
        return Code.Equals(other.Code) && Name.Equals(other.Name);
    }

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

    public override int GetHashCode()
    {

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

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

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

Nachdem Sie diese Schnittstelle implementieren, können Sie eine Sequenz von Product Objekte in die Distinct<TSource>(IEnumerable<TSource>) Methode, wie im folgenden Beispiel gezeigt.

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

//Exclude duplicates.

IEnumerable<Product> noduplicates =
    products.Distinct();

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

/*
    This code produces the following output:
    apple 9 
    orange 4
    lemon 12
*/

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 3.5
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1
Zurück zum Anfang
Anzeigen: