5 Stimmen

Gibt es einen prägnanten integrierten Weg, um ein Listenelement nach Index zu erhalten, das keine Ausnahme auslöst?

Ich durchsuche eine Liste sicher nach einem Objekt wie diesem:

var someResult = myList.FirstOrDefault(x=>x.SomeValue == "SomethingHere");

Wenn es keine Objekte gibt, die meinen Kriterien entsprechen, dann wird someResult null sein.

Aber wenn ich nur den Index des gewünschten Objekts habe, sind die Dinge nicht so schön. Es scheint, als müsste ich etwas wie folgt tun:

try
{
    var someResult = myList[4];
}
catch (ArgumentOutOfRangeException)
{
    someResult = null;
}

Ich gebe zu, dass es nicht schrecklich ist, das schreiben zu müssen. Aber es scheint mir, dass es eine Möglichkeit geben sollte, dass die Liste einfach null zurückgibt, wenn der Index ungültig ist.

Gibt es eine Möglichkeit, mit vorhandenen .NET-Methoden eine Ein- oder Zwei-Zeilen-Suche durchzuführen?

(Ich weiß, ich könnte leicht eine Erweiterungsmethode schreiben, aber ich frage mich, ob es einen integrierten Weg gibt, dies zu tun.)

11voto

Mark Byers Punkte 761508

Ich denke, du willst C.B.s Vorschlag von ElementAtOrDefault - stimme dafür ab.

Ich habe noch ein paar weitere Punkte anzumerken...

Was deine try/catch-Lösung betrifft:

Ich gebe zu, dass es nicht schrecklich ist, das schreiben zu müssen.

Bitte verwende hierzu keine Ausnahmen. Dein Ansatz ist umständlicher, Ausnahmen sind langsam, also wirst du eine schlechte Leistung erzielen, und Ausnahmen sollten nur für außergewöhnliche Situationen verwendet werden.


Es ist auch ziemlich einfach, dies ohne LINQ zu schreiben, indem man den bedingten Operator verwendet:

var someResult = myList.Count > 4 ? myList[4] : null;

10voto

C B Punkte 637

Sie können möglicherweise die LINQ-Erweiterung .ElementAtOrDefault() verwenden, um zu erreichen, was Sie möchten.

List foos = new List();
Foo element = foos.ElementAtOrDefault(4);

Sie müssen jedoch darauf achten, dass Ihr generischer Typ für List ein Verweistyp oder ein String ist, damit das "Standard"-Ergebnis, das Sie erhalten, tatsächlich null ist. Das Standardergebnis, das Sie zurückbekommen, ist default(T).

3voto

Tim Schmelter Punkte 427304

Ja, du kannst LINQ auch verwenden, wenn du nur den Index hast:

var someResult = myList
            .Select((x, i) => new { X = x, Index = i })
            .FirstOrDefault(x => x.Index == 4);

Enumerable.Select Methode (IEnumerable, Func)

Projiziert jedes Element einer Sequenz in eine neue Form, indem der Index des Elements einbezogen wird.

2voto

Risky Martin Punkte 2461

Die Antwort von C B gewinnt, aber ich kann doch um den zweiten Platz kämpfen, oder?

var someResult = myList.Skip(4).FirstOrDefault();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X