Die Auswahl bestimmter Elemente aus IGrouping mit LINQ
public class Item
{
public int Id {get; set;}
public bool Selected {get; set;}
}
List<Item> itemList = new List<Item>(){ /* fill with items */ };
Brauche ich, um eine Liste der Elemente erstellen, die die folgenden Kriterien erfüllen. Von itemList
, ich brauche die Gruppe der Elemente von Id
und dann wählen Sie ein einzelnes Element aus jeder Gruppe. Der gewählte Punkt muss man in die Selected == true
. Wenn kein Element in der Gruppe markiert ist, dann wird jedes Element ausgewählt werden kann, ist es egal, aber man muss gewählt werden.
Basierend auf dieser Frage:
Wie man eindeutige Instanz aus einer Liste von Lambda-Ausdruck oder mit LINQ
War ich in der Lage, um gemeinsam das folgende, das scheint zu funktionieren:
var distinctList = itemList.GroupBy(x => x.Id,
(key, group) => group.Any(x => x.Selected) ?
group.First(x => x.Selected) : group.First());
Ist es effizienter oder einfacher Weg, dies zu erreichen? Ich habe versucht FirstOrDefault()
aber konnte nicht scheinen, um es zu tun, was ich brauchte. Mein Anliegen mit der Effizienz im obigen code, wird der Anruf an ein().
- Ist das nicht einfach genug für Sie? Fügen Sie in ein paar zusätzliche Zeilenumbrüche und/oder entfernen Sie einige der Einbuchtung, so dass es auf den Bildschirm passen besser und es sieht gut aus für mich.
- Ich verstehe nicht, die unten abstimmen? Die Antworten sind einfacher und mehr effizient als mein Beispiel oben. Das ist, warum ich die Frage gestellt habe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie verwenden in der Tat die
FirstOrDefault
- Erweiterung-Methode, aber verwenden Sie die version, das dauert ein Prädikat, und verbinden Sie es mit dem coalesce-operator (??
) wie so (ich habe query syntax hier um es einfacher zu machen):Mit dem Prädikat in
FirstOrDefault
Sie Kommissionierung sind das erste Element, wo dieSelected
- Eigenschaft true ist. Wenn es keine gibt, dann vorausgesetzt, Ihr Typ ist ein Typ der Referenz (und das ist wichtig, diese Arbeit mitFirstOrDefault
), wird es wiedernull
.Wenn null zurückgegeben wird, dann wirst du nur das erste Element in der Gruppe (durch den Aufruf der
Ersten
), da jedes Element zurückgegeben werden kann und eine Gruppe nicht existieren können ohne Elemente (also der Aufruf anFirst
ist garantiert immer gelingt).Im Grunde, Sie sind der Anwendung einer Auswahl der Ergebnis der Gruppierung, nicht während Gruppierung.
Sie einsetzen konnte, die Tatsache, dass
bool
implementiertIComparable<bool>
mittrue
größer alsfalse
:Dies erfordert auflisten und Sortieren der ganzen Gruppe, obwohl, so dass Ihre Leistung wird besser sein, wenn Sie stick mit Ihren Ansatz.
Für Gruppen mit einem ausgewählten Element, wird der Ansatz erfordert Durchlaufen der Liste zweimal bis zu dem Punkt, der sich das erste ausgewählte Element. Sie entfernen konnte, dass die Vervielfältigung so:
Einfachere Antwort hier
Können Sie