Changer une valeur dans la liste

J’ai une liste (où T est une classe personnalisée et la classe a certaines propriétés). Je voudrais savoir comment modifier une ou plusieurs valeurs en utilisant des expressions Lambda, le résultat sera donc le même que celui de la boucle foreach:

REMARQUE: la liste contient plusieurs éléments à l’intérieur (plusieurs lignes)

foreach (MyClass mc in list) { if (mc.Name == "height") mc.Value = 30; } 

Et ceci la requête linq (en utilisant les expressions Lambda), mais ce n’est pas la même que la boucle foreach supérieure, il ne renvoie que 1 élément (une ligne) de la liste!

Ce que je veux, c’est qu’il retourne tous les éléments (toutes les lignes) et UNIQUEMENT le cas échéant (les éléments spécifiés dans la ou les méthodes d’extension WHERE).

 list = list.Where(w => w.Name == "height").Select(s => { s.Value = 30; return s; }).ToList(); 

NOTE: ces 2 exemples ne sont pas les mêmes! Je le répète, le linq ne renvoie que 1 élément (une ligne), et c’est quelque chose que je ne veux pas, j’ai besoin de tous les éléments de la liste (comme la boucle foreach, elle ne fait que des modifications, mais ne supprime aucun élément).

Vous pouvez utiliser ForEach , mais vous devez d’abord convertir le IEnumerable en List .

 list.Where(w => w.Name == "height").ToList().ForEach(s => s.Value = 30); 

J’irais probablement avec ceci (je sais que ce n’est pas de la pure linq), conservez une référence à la liste originale si vous voulez conserver tous les éléments, et vous devriez trouver les valeurs mises à jour qui s’y trouvent:

  foreach (var mc in list.Where(x => x.Name == "height")) mc.Value = 30; 

Vous pouvez utiliser une projection avec une instruction lambda, mais la boucle foreach origine est plus lisible et modifie la liste en place plutôt que de créer une nouvelle liste.

 var result = list.Select(i => { if (i.Name == "height") i.Value = 30; return i; }).ToList(); 

Méthode d’extension

 public static void SetHeights(this IEnumerable source, int value) { foreach (var item in source) { if (item.Name == "height") { item.Value = value; } yield return item; } } var result = list.SetHeights(30).ToList(); 

Qu’en est-il de list.Find(x => x.Name == "height").Value = 20; Cela fonctionne bien. Je sais que c’est un vieux post, mais je me demandais juste pourquoi personne n’a suggéré cela? Y a-t-il un inconvénient dans ce code?

Vous pouvez faire quelque chose comme ça:

 var newList = list.Where(w => w.Name == "height") .Select(s => new {s.Name, s.Value= 30 }).ToList(); 

Mais je préfère choisir d’utiliser foreach car LINQ est pour interroger pendant que vous voulez éditer les données.