1476 Stimmen

LINQ's Distinct() für eine bestimmte Eigenschaft

Ich spiele mit LINQ, um es zu lernen, aber ich kann nicht herausfinden, wie Sie verwenden Distinct wenn ich keine einfache Liste habe (eine einfache Liste von ganzen Zahlen ist ziemlich einfach zu machen, das ist nicht die Frage). Wenn ich Folgendes verwenden möchte Unverwechselbar auf eine Liste eines Objekts auf eine o mehr Eigenschaften des Objekts?

Beispiel: Wenn ein Objekt Person , mit Eigenschaft Id . Wie kann ich alle Personen erreichen und verwenden Distinct über sie mit der Eigenschaft Id des Objekts?

Person1: Id=1, Name="Test1"
Person2: Id=1, Name="Test1"
Person3: Id=2, Name="Test2"

Wie kann ich nur Person1 y Person3 ? Ist das möglich?

Wenn es nicht möglich ist, mit LINQ, was wäre der beste Weg, um eine Liste von haben Person abhängig von einigen seiner Eigenschaften in .NET 3.5?

81voto

Magnetron Punkte 5977

Ab .NET 6 gibt es eine neue Lösung mit die neue DistinctBy() Erweiterung in Linq so können wir

var distinctPersonsById = personList.DistinctBy(x => x.Id);

67voto

cahit beyaz Punkte 4331

Lösung: Gruppieren Sie zunächst nach Ihren Feldern und wählen Sie dann das erste Standardobjekt aus.

    List<Person> distinctPeople = allPeople
   .GroupBy(p => p.PersonId)
   .Select(g => g.FirstOrDefault())
   .ToList();

35voto

David Fahlander Punkte 4158

Sie können dies mit dem Standard Linq.ToLookup() . Dadurch wird eine Sammlung von Werten für jeden eindeutigen Schlüssel erstellt. Wählen Sie einfach das erste Element in der Sammlung aus

Persons.ToLookup(p => p.Id).Select(coll => coll.First());

21voto

Contango Punkte 70203

Der folgende Code ist funktionell äquivalent zu Antwort von Jon Skeet .

Getestet auf .NET 4.5, sollte auf jeder früheren Version von LINQ funktionieren.

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
  this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
  HashSet<TKey> seenKeys = new HashSet<TKey>();
  return source.Where(element => seenKeys.Add(keySelector(element)));
}

Übrigens, schauen Sie nach Jon Skeets neueste Version von DistinctBy.cs auf Google Code .

3 Stimmen

Dies führte zu der Fehlermeldung "Sequenz hat keine Werte", aber Skeets Antwort ergab das richtige Ergebnis.

1 Stimmen

Um zu verdeutlichen, warum dies nicht äquivalent zu Jon Skeets Antwort ist - der Unterschied tritt nur auf, wenn Sie dieselbe enumerable wiederverwenden. Wenn Sie das enumerable aus dieser Antwort wiederverwenden, ist das HashSet bereits gefüllt, so dass keine Elemente zurückgegeben werden (alle Schlüssel wurden gesehen). Da Skeets Antwort yield return verwendet, wird bei jeder Iteration der Aufzählungsdatei ein neues HashSet erstellt.

0 Stimmen

@AndrewMcClement Zustimmen. Aktualisierte Antwort.

13voto

Timothy Khouri Punkte 30565

Ich habe einen Artikel geschrieben, in dem erklärt wird, wie man die Funktion Distinct so erweitern kann, dass man folgendes tun kann:

var people = new List<Person>();

people.Add(new Person(1, "a", "b"));
people.Add(new Person(2, "c", "d"));
people.Add(new Person(1, "a", "b"));

foreach (var person in people.Distinct(p => p.ID))
    // Do stuff with unique list here.

Hier ist der Artikel ( jetzt im Webarchiv ) : _Erweitern von LINQ - Angeben einer Eigenschaft in der Distinct-Funktion_

3 Stimmen

Ihr Artikel hat einen Fehler, es sollte ein <T> nach Distinct sein: public static IEnumerable<T> Distinct(this... Außerdem sieht es nicht so aus, als würde es (gut) mit mehr als einer Eigenschaft funktionieren, z. B. einer Kombination aus Vor- und Nachnamen.

1 Stimmen

Bitte geben Sie die entsprechenden Informationen nicht über einen externen Link an, eine Antwort muss für sich selbst stehen . Es ist in Ordnung, den Link zu posten, aber bitte kopieren Sie die relevanten Informationen in die Antwort selbst. Sie haben nur ein Anwendungsbeispiel gepostet, aber ohne die externe Quelle ist es nutzlos.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X