Abrufen einer eindeutigen Liste basierend auf einer oder mehreren Eigenschaften in C#
-
Verwenden Sie
GroupBy()
undSelect()
, um eine eindeutige Liste basierend auf einer Eigenschaft inC#
zu erhalten -
Verwenden Sie
GroupBy()
undSelect()
, um eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften inC#
zu erhalten -
Verwenden Sie
DistinctBy
, um eine eindeutige Liste basierend auf einer oder mehreren Eigenschaften inC#
zu erhalten
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.
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