Ich habe ein List<MyClass> MyList
woher
public class MyClass
{
public string name { get; set; }
public string value { get; set; }
}
Bei einem gegebenen Namen möchte ich den entsprechenden Wert erhalten. Ich habe es derzeit implementiert als:
MyList[MyList.FindIndex(item => String.Compare(item.name, "foo", 0) == 0)].value
Gibt es einen saubereren Weg, dies zu tun?
Verwenden Sie entweder LINQ:
var value = MyList.First(item => item.name == "foo").value;
(Dies findet natürlich nur die erste Übereinstimmung. Es gibt viele Optionen.)
Oder verwenden Sie Find
anstelle von FindIndex
:
var value = MyList.Find(item => item.name == "foo").value;
Ich würde jedoch dringend empfehlen, LINQ zu verwenden - dies ist heutzutage ein viel idiomatischerer Ansatz.
(Ich würde auch vorschlagen, die .NET-Namenskonventionen zu befolgen.)
Sie können Where
zum Filtern und Select
zum Abrufen des gewünschten Werts verwenden.
MyList.Where(i=>i.name == yourName).Select(j=>j.value);
Ich würde .Equals()
zum Vergleich anstelle von ==
Verwenden.
Wie so:
MyClass item = MyList.Find(item => item.name.Equals("foo"));
Vor allem, weil es Ihnen Optionen wie StringComparison bietet, was fantastisch ist. Beispiel:
MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);
Dadurch kann Ihr Code Sonderzeichen, Groß- und Kleinschreibung, ignorieren. Es gibt mehr Möglichkeiten.
Verwenden der Funktion Suchen ist auf sauberere Weise.
MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
....
}
Enumerable.First
gibt das Element anstelle eines Index zurück. In beiden Fällen erhalten Sie eine Ausnahme, wenn kein übereinstimmendes Element in der Liste angezeigt wird (Ihr Originalcode wirft ein IndexOutOfBoundsException
, wenn Sie versuchen, das Element bei Index -1 abzurufen, aber First
wirft ein InvalidOperationException
).
MyList.First(item => string.Equals("foo", item.name)).value