Find () und First () lösen Ausnahmen aus. Wie kann man stattdessen null zurückgeben?


76

Gibt es eine Linq-Lambda-Suchmethode, die beim Durchsuchen einer Liste null zurückgibt, anstatt eine Ausnahme auszulösen?

Meine aktuelle Lösung ist ungefähr so: (um zu vermeiden, dass eine Ausnahme ausgelöst wird)

if (list.Exists(x => x.Foo == Foo))
{
    var listItem = list.Find(x => x.Foo == Foo);
}

Es fühlt sich einfach falsch an, den Ausdruck zu wiederholen.

Etwas wie ...

var listItem = list.Find(x => x.Foo == Foo);
if (listItem != null)
{
    //Do stuff
}

... fühlt sich für mich besser an. Oder bin es nur ich?

Haben Sie einen besseren Ansatz für diesen? (Die Lösung muss nicht null zurückgeben, nur eine bessere Lösung ist gut)

Antworten:


139
var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (listItem != null)
{
    //Do stuff
}

52

Die Antwort von Bala R ist richtig, ich wollte nur eine Information hinzufügen:

Beachten Sie, dass, wenn List<T>Objekte enthalten, deren Design nicht null sein kann, FirstOrDefaultetwas anderes als zurückgegeben wird null. Der Compiler gibt wahrscheinlich eine Warnung / einen Fehler in der if-Anweisung aus. In diesem Fall sollten Sie sich Ihrer Situation folgendermaßen nähern:

List<MyObjectThatCannotBeNull> list;
var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (!listItem.Equals(default(MyObjectThatCannotBeNull)))
{
    //Do stuff
}

9
und nicht vergessen - wenn Ihre Liste den Standardwert für diesen generischen Typ enthält ( Standardwertetabelle ), können Sie nicht feststellen, ob der Wert vorhanden ist oder nicht Find. Sie sollten verwenden FindIndex, Existsoder Containsin diesen Situationen.
HuBeZa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.