Ich schreibe so viel Code, um ein passendes Element auszuwählen
var item = (from x in Items where x.Id == 123 select x).First();
Gibt es eine sauberere Art, dies zu tun, oder ist dies so präzise, wie ich es bekommen werde?
EDIT: Hätte sagen sollen "Sauberer Weg mit Linq-Syntax". Ich war mir der Lambda-Syntax bereits bewusst und es sieht so aus, als wäre dies tatsächlich der einzige Weg. Ich habe jedoch einige nützliche Informationen erhalten, also danke an alle, die geantwortet haben.
Single()
undSingleOrDefault()
WENN ich weiß, dass die Daten bereits eindeutig sind (z. B. aus einer Datenbank mit dieser Einschränkung usw.), daSingle()
sie gezwungen sind, den Rest der Liste zu scannen, um ein mögliches Duplikat zu finden, aber das bin ich. Wenn Sie an dieser Stelle Ihre Eindeutigkeit erzwingen müssen, verwenden SieSingle()
family. Wenn nicht, verwenden SieFirst()
family.Antworten:
Abhängig davon, wie sehr Ihnen die Linq-Abfragesyntax gefällt, können Sie die Erweiterungsmethoden direkt wie folgt verwenden:
Wenn Sie keinen Fehler auslösen möchten, wenn die Liste leer ist, geben Sie
FirstOrDefault
den Standardwert für den Elementtyp (null
für Referenztypen) zurück:Single()
undSingleOrDefault()
kann auch verwendet werden, aber wenn Sie aus einer Datenbank lesen oder etwas, das bereits Einzigartigkeit garantiert, würde ich mich nicht darum kümmern, da es die Liste scannen muss, um zu sehen, ob es Duplikate und Würfe gibt.First()
undFirstOrDefault()
beim ersten Spiel anhalten, damit sie effizienter sind.Von den
First()
undSingle()
Familie, hier, wo sie werfen:First()
- wirft, wenn leer / nicht gefunden, wirft nicht, wenn doppelt vorhandenFirstOrDefault()
- Gibt die Standardeinstellung zurück, wenn leer / nicht gefunden, wird nicht geworfen, wenn doppelt vorhandenSingle()
- wirft, wenn leer / nicht gefunden, wirft, wenn ein Duplikat vorhanden istSingleOrDefault()
- Gibt den Standardwert zurück, wenn leer / nicht gefunden. Wird ausgelöst, wenn ein Duplikat vorhanden istquelle
i.Id == 123
FirstOrDefault oder SingleOrDefault können nützlich sein, abhängig von Ihrem Szenario und davon, ob Sie mit null oder mehr als einer Übereinstimmung umgehen möchten:
Ich weiß nicht, wie das in einer linq 'from'-Abfrage funktioniert, aber in der Lambda-Syntax sieht es so aus:
quelle
Dies sind die bevorzugten Methoden:
Oder
quelle
Um jemandem das Leben zu erleichtern, die Linq-Abfrage mit Lambda-Ausdruck
führt zu einer SQL-Abfrage mit einem
select top (1)
darin.quelle
Das lässt sich besser darauf reduzieren.
var item = Items.First(x => x.Id == 123);
Ihre Abfrage sammelt derzeit alle Ergebnisse (und möglicherweise mehrere) innerhalb der Aufzählung und nimmt dann das erste aus diesem Satz, wodurch mehr Arbeit als erforderlich erledigt wird.
Single / SingleOrDefault lohnt sich, aber nur, wenn Sie die gesamte Sammlung durchlaufen und zusätzlich zur Auswahl dieser Übereinstimmung überprüfen möchten, ob die Übereinstimmung eindeutig ist. First / FirstOrDefault nimmt nur das erste Match und geht, unabhängig davon, wie viele Duplikate tatsächlich vorhanden sind.
quelle
Sie können die Syntax der Erweiterungsmethode verwenden:
Abgesehen davon bin ich mir nicht sicher, wie viel prägnanter Sie werden können, ohne vielleicht Ihre eigenen speziellen Erweiterungsmethoden "First" und "FirstOrDefault" zu schreiben.
quelle
Where
im Gegensatz zuSelect
, was bereits gesagt wurde, aber diese Antwort ist falsch. Auswahl in c # ändert die Ergebnisse in IEnumerable <bool>, so dass Sie einebool
für das erste Element erhaltenx.Id == 123
Ich werde dir sagen, was für mich funktioniert hat:
Meine ID ist die Zeile, die ich abfragen möchte. In diesem Fall habe ich sie von einem radGrid erhalten und dann zum Abfragen verwendet. Diese Abfrage gibt jedoch eine Zeile zurück. Anschließend können Sie die Werte, die Sie von der Abfrage erhalten haben, einem Textfeld oder etwas anderem zuweisen Ich musste diese dem Textfeld zuweisen.
quelle