Abrufen einer eindeutigen Liste basierend auf einer oder mehreren Eigenschaften in C#

Bilal Shahid 12 Oktober 2023
  1. Verwenden Sie GroupBy() und Select(), um eine eindeutige Liste basierend auf einer Eigenschaft in C# zu erhalten
  2. Verwenden Sie GroupBy() und Select(), um eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften in C# zu erhalten
  3. Verwenden Sie DistinctBy, um eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften in C# zu erhalten
Abrufen einer eindeutigen Liste basierend auf einer oder mehreren Eigenschaften in C#

Heute werden wir uns ansehen, wie wir Distinct() in LINQ auf mehrere Objekte mit denselben Eigenschaften mit unterschiedlichen Werten anwenden können. Schauen Sie sich zunächst das Beispiel unten an.

Angenommen, Sie haben drei Objekte: CAR one, CAR two und CAR three. CAR one und CAR two enthalten Build-Werte von 2, aber CAR three hat einen Build-Wert von 4.

Beim Aufruf von Distinct() für die drei Objekte sollte das Ergebnis nur CAR one und CAR three oder CAR two und CAR three enthalten, da beide unterschiedliche Werte enthalten.

In diesem Artikel wird erläutert, wie Sie eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften in C# erhalten.

Verwenden Sie GroupBy() und Select(), um eine eindeutige Liste basierend auf einer Eigenschaft in C# zu erhalten

Bevor wir also mit unserem Beispiel beginnen, fügen wir zuerst die LINQ-Bibliothek zu unserem Code hinzu:

using SYSTEM.Linq;

Dann gehen wir weiter und definieren unsere Klasse CAR wie folgt:

class CAR {
  public int id;

  public CAR(int id) {
    this.id = id;
  }
}

Und dann definieren wir im Main ein paar Objekte:

CAR one = new CAR(4);
CAR two = new CAR(4);
CAR three = new CAR(6);

List<CAR> cars = new List<CAR>();
cars.Add(one);
cars.Add(two);
cars.Add(three);

Wir haben auch eine Liste erstellt und die drei Objekte hinzugefügt. Wir werden dieselben Eigenschaftsobjekte trimmen und nur eines davon betrachten.

Wir erstellen eine neue Liste und verwenden dann die Klausel GroupBY(). Und schliesslich das First(), um den Gewinner zu küren.

List<CAR> distinct_c = cars.GroupBy(p => p.id).Select(g => g.First()).ToList();
for (int i = 0; i < distinct_c.Count(); i++) {
  Console.Write(distinct_c[i].id + " ");
}

Das Ergebnis wird wie folgt ausfallen:

4 6

Dies waren die beiden unterschiedlichen IDs in jedem der drei Objekte. Der gesamte Code lautet wie folgt:

class pointer {
  class CAR {
    public int id;

    public CAR(int id) {
      this.id = id;
    }
  }

  public static void Main(String[] args) {
    CAR one = new CAR(4);
    CAR two = new CAR(4);
    CAR three = new CAR(6);

    List<CAR> cars = new List<CAR>();
    cars.Add(one);
    cars.Add(two);
    cars.Add(three);

    List<CAR> distinct_c = cars.GroupBy(p => p.id).Select(g => g.First()).ToList();
    for (int i = 0; i < distinct_c.Count(); i++) {
      Console.Write(distinct_c[i].id + " ");
    }
  }
}

Fügen Sie den obigen Code in Ihren namespace ein und spielen Sie dann damit.

Verwenden Sie GroupBy() und Select(), um eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften in C# zu erhalten

Was wäre, wenn wir zusammen mit id eine weitere Eigenschaft namens color hätten und immer noch die eindeutige auswählen wollten. Fügen wir die Eigenschaft color wie folgt zu unserer Klasse CAR hinzu:

class CAR {
  public int id;
  public string color;

  public CAR(int id, string color) {
    this.id = id;
    this.color = color;
  }
}

Wenn Sie jetzt jedoch die Funktion mit der gleichen Syntax wie oben aufrufen würden:

CAR one = new CAR(4, "red");
CAR two = new CAR(4, "blue");
CAR three = new CAR(6, "blue");

List<CAR> cars = new List<CAR>();
cars.Add(one);
cars.Add(two);
cars.Add(three);

List<CAR> distinct_c = cars.GroupBy(p => p.id).Select(g => g.First()).ToList();
for (int i = 0; i < distinct_c.Count(); i++) {
  Console.Write(distinct_c[i].id + " ");
}

Die Ausgabe würde die gleiche wie 4 6 bleiben. Denn p gruppiert immer noch nur nach p => p.id. Da wir nun aber auch nach Farbe unterscheiden wollen, können wir folgendes tun:

List<CAR> distinct_c = cars.GroupBy(p => (p.id, p.color)).Select(g => g.First()).ToList();
for (int i = 0; i < distinct_c.Count(); i++) {
  Console.Write(distinct_c[i].id + " ");
}

Was wird also das Ergebnis sein? Denn die drei Objekte haben alle unterschiedliche Kombinationen von ID und CAR wie; (4, rot), (4, blau) und (6, blau). Daher gibt es eine Unterscheidung zwischen allen Objekten.

Die Ausgabe wird nun sein:

4 4 6

Der vollständige Code ist unten angegeben:

static class pointer {
  class CAR {
    public int id;
    public string color;

    public CAR(int id, string color) {
      this.id = id;
      this.color = color;
    }
  }

  public static void Main(String[] args) {
    CAR one = new CAR(4, "red");
    CAR two = new CAR(4, "blue");
    CAR three = new CAR(6, "blue");

    List<CAR> cars = new List<CAR>();
    cars.Add(one);
    cars.Add(two);
    cars.Add(three);

    List<CAR> distinct_c = cars.GroupBy(p => (p.id, p.color)).Select(g => g.First()).ToList();
    for (int i = 0; i < distinct_c.Count(); i++) {
      Console.Write(distinct_c[i].id + " ");
    }
  }
}

Sie können sogar eine Where-Bedingung hinzufügen, um zu prüfen, ob die p.id nicht null ist, und sie dann aufrufen:

List<CAR> distinct_c =
    cars.Where(p => p.id != null).GroupBy(p => (p.id, p.color)).Select(g => g.First()).ToList();
for (int i = 0; i < distinct_c.Count(); i++) {
  Console.Write(distinct_c[i].id + " ");
}

Das Ergebnis wird auch das gleiche sein.

Zu beachtende Punkte bei der Verwendung von First() in C#

Manchmal kommt man mit FirstorDefault() davon. Eine weitere Funktion, die dasselbe tut wie First(), aber wenn es kein erstes Element gibt, gibt sie nur einen Standardwert zurück.

Es kann verwendet werden, um Fehler bei Nullwerten zu umgehen.

Verwenden Sie DistinctBy, um eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften in C# zu erhalten

Sie können eine Funktion schreiben, die unterschiedliche Werte in C# zurückgeben kann.

Eine Möglichkeit, dies zu tun, kann darin bestehen, Hashtabellen zu verwenden, die einen Schlüssel und einen Wert annehmen und zusammen abbilden können. Sie können eine solche Funktion wie folgt schreiben:

public static IEnumerable<S> DistinctBy<S, K>(this IEnumerable<S> source, Func<S, K> keySelector) {
  HashSet<K> seen = new HashSet<K>();
  foreach (S element in source) {
    if (seen.Add(keySelector(element))) {
      yield return element;
    }
  }
}

Stellen Sie jedoch zuvor sicher, dass Sie MORELINQ herunterladen und für Ihren Code konfigurieren.

var q = cars.DistinctBy(p => p.id);

Und dann können Sie den Inhalt dieser Variablen q drucken und die Antwort erhalten. Der vollständige Code ist unten dargestellt:

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using MoreLinq;

namespace jinlku_console {
  static class pointer {
    class CAR {
      public int id;
      public string color;

      public CAR(int id, string color) {
        this.id = id;
        this.color = color;
      }
    }

    public static IEnumerable<S> DistinctBy<S, K>(this IEnumerable<S> source,
                                                  Func<S, K> keySelector) {
      HashSet<K> seen = new HashSet<K>();
      foreach (S element in source) {
        if (seen.Add(keySelector(element))) {
          yield return element;
        }
      }
    }

    public static void Main(String[] args) {
      CAR one = new CAR(4, "red");
      CAR two = new CAR(4, "blue");
      CAR three = new CAR(6, "blue");

      List<CAR> cars = new List<CAR>();
      cars.Add(one);
      cars.Add(two);
      cars.Add(three);

      var q = cars.DistinctBy(p => p.id);

      Console.WriteLine(q.Count());

      List<CAR> distinct_c = cars.GroupBy(p => (p.id, p.color)).Select(g => g.First()).ToList();
      for (int i = 0; i < distinct_c.Count(); i++) {
        Console.Write(distinct_c[i].id + " ");
      }
    }
  }
}

Eine weitere einfache Lösung, um eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften in C# zu erhalten

Eine andere Möglichkeit, dieselbe Abfrage zu schreiben, kann wie folgt aussehen:

var un = from car in cars group car by new(car.id) into mg select mg.First();

Um dies zu verwenden, müssen Sie jedoch möglicherweise Ihre Sprache auf 9.0 oder höher aktualisieren.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Verwandter Artikel - Csharp LINQ