it-swarm.com.de

Suchen Sie das Element in Liste <>, das einen Wert enthält

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?

23
RaGe

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.)

76
Jon Skeet

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);
13

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.

5
user3801839

Verwenden der Funktion Suchen ist auf sauberere Weise.

MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
 ....
}
4
misak

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
3
Sam Harwell