J'ai un List<MyClass> MyList
où
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?
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.)
Vous pouvez utiliser Where
pour filtrer et Select
pour obtenir la valeur souhaitée.
MyList.Where(i=>i.name == yourName).Select(j=>j.value);
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.
Utiliser la fonction Find est plus propre.
MyClass item = MyList.Find(item => item.name == "foo");
if (item != null) // check item isn't null
{
....
}
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