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)

Ben Galler
quelle

Antworten:

139
var listItem = list.FirstOrDefault(x => x.Foo == Foo);
if (listItem != null)
{
    //Do stuff
}
Bala R.
quelle
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
}
Bazzz
quelle
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