web-dev-qa-db-fra.com

Rechercher un élément dans la liste <> contenant une valeur

J'ai un List<MyClass> MyList

public class MyClass
{
    public string name { get; set; }
    public string value { get; set; }
}

Étant donné un nom, j'aimerais obtenir la valeur correspondante. Je l'ai actuellement implémenté en tant que:

MyList[MyList.FindIndex(item => String.Compare(item.name, "foo", 0) == 0)].value

Y a-t-il une manière plus propre de faire ceci?

23
RaGe

Soit utiliser LINQ:

var value = MyList.First(item => item.name == "foo").value;

(Ceci trouvera juste le premier match, bien sûr. Il y a beaucoup d'options autour de ça.)

Ou utilisez Find au lieu de FindIndex:

var value = MyList.Find(item => item.name == "foo").value;

Cependant, je suggérerais fortement d’utiliser LINQ - c’est une approche beaucoup plus idiomatique de nos jours.

(Je suggérerais également de suivre les conventions de nommage .NET.)

76
Jon Skeet

Vous pouvez utiliser Where pour filtrer et Select pour obtenir la valeur souhaitée.

MyList.Where(i=>i.name == yourName).Select(j=>j.value);
13

Je voudrais utiliser .Equals() pour la comparaison au lieu de ==.

Ainsi:

MyClass item = MyList.Find(item => item.name.Equals("foo"));

Surtout parce qu'il vous offre des options comme StringComparison, ce qui est génial. Exemple:

MyClass item = MyList.Find(item => item.name.Equals("foo", StringComparison.InvariantCultureIgnoreCase);

Cela permet à votre code d’ignorer les caractères spéciaux, majuscules et minuscules. Il y a plus d'options.

5
user3801839

Utiliser la fonction Find est plus propre.

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

Enumerable.First renvoie l'élément au lieu d'un index. Dans les deux cas, vous obtiendrez une exception si aucun élément correspondant n'apparaît dans la liste (votre code d'origine lancera un IndexOutOfBoundsException lorsque vous tenterez d'obtenir l'élément à l'index -1, mais First lancera un InvalidOperationException).

MyList.First(item => string.Equals("foo", item.name)).value
3
Sam Harwell