it-swarm.com.de

Wählen Sie mithilfe von linq eine Unterscheidung aus

Ich habe eine Klassenliste der Klasse

public class LinqTest
{
public int id { get; set; }
public string value { get; set; }
}


List<LinqTest> myList = new List<LinqTest>();
myList.Add(new LinqTest() { id = 1, value = "a" });
myList.Add(new LinqTest() { id = 1, value = "b" });
myList.Add(new LinqTest() { id = 2, value = "c" });

Ich muss nur die eindeutigen IDs aus dieser Liste auswählen. dh meine resultierende Liste sollte nur enthalten

[{id=1,value="a"},{ id = 2, value = "c" }]

Wie kann ich das mit linq machen?

Bearbeiten

Eingang,

id      value
1        a
1        b
2        c
3        d
3        e

Ausgegeben werden sollte,

id      value
1        a
2        c
3        d

dh wenn es eine Wiederholung von id gibt, sollte das Ergebnis nur das erste Mal auftreten.

228
Anoop Joshi
myList.GroupBy(test => test.id)
      .Select(grp => grp.First());

Bearbeiten: Da es vielen Leuten ein Rätsel zu sein scheint, diesen IEnumerable<> in einen List<> zu verwandeln, können Sie einfach schreiben:

var result = myList.GroupBy(test => test.id)
                   .Select(grp => grp.First())
                   .ToList();

Oft ist es jedoch besser, mit IEnumerable zu arbeiten, als mit IList, da der obige Linq träge bewertet wird: Er erledigt nicht die gesamte Arbeit, bis die Aufzählung iteriert ist. Wenn Sie ToList aufrufen, durchläuft es tatsächlich die gesamte Aufzählung und zwingt die gesamte Arbeit, von vornherein erledigt zu werden. (Und kann eine Weile dauern, wenn Ihre Aufzählung unendlich lang ist.)

Die Kehrseite dieses Ratschlags ist, dass jedes Mal, wenn Sie ein solches IEnumerable aufzählen, die Arbeit, um es zu bewerten, neu ausgeführt werden muss. Sie müssen sich also für jeden Fall entscheiden, ob es besser ist, mit dem faul bewerteten IEnumerable zu arbeiten oder es in ein List, Set, Dictionary oder so weiter umzusetzen.

471
Paul Ruane

Mit morelinq können Sie DistinctBy verwenden:

myList.DistinctBy(x => x.id);

Ansonsten können Sie eine Gruppe verwenden:

myList.GroupBy(x => x.id)
      .Select(g => g.First());
104
Daniel Hilgarth

Sie sollten Equals und GetHashCode sinnvoll überschreiben, um in diesem Fall die ID zu vergleichen:

public class LinqTest
{
    public int id { get; set; }
    public string value { get; set; }

    public override bool Equals(object obj)
    {
        LinqTest obj2 = obj as LinqTest;
        if (obj2 == null) return false;
        return id == obj2.id;
    }

    public override int GetHashCode()
    {
        return id;
    }
}

Jetzt können Sie Distinct verwenden:

List<LinqTest> uniqueIDs = myList.Distinct().ToList();
53
Tim Schmelter
myList.GroupBy(i => i.id).Select(group => group.First())
23
Tim Rogers