web-dev-qa-db-fra.com

conditionnel Mise à jour d'une liste à l'aide de LINQ

J'avais une liste

List<Myclass> li = new List<Myclass>();

où est Myclass

class Myclass
{
public string name {get;set;}
public decimal age {get;set;}
}

articles en li ressemble

enter image description here

 i want to update `li` according to name but with `LINQ` like

li.where(w=> w.name = "di") = li.Where(w => w.name =="di").select(s => {s.age = 10;return s;}).Tolist();
li.where(w=> w.name = "marks") = li.Where(w => w.name =="marks").select(s => {s.age = 20;return s;}).Tolist();
li.where(w=> w.name = "grade") = li.Where(w => w.name =="grade").select(s => {s.age = 10;return s;}).Tolist();

et veulent résultat qui ressemble à ceci

enter image description here

mon code donne une erreur pouvez-vous s'il vous plaît dire comment je fais cela

19
Co. Aden

plus propre moyen de le faire utilise foreach

foreach(var item in li.Where(w => w.name =="di"))
{
   item.age=10;
}
69
wudzik

Vous avez besoin:

li.Where(w=> w.name == "di").ToList().ForEach(i => i.age = 10);

Code du programme:

namespace Test
{
    class Program
    {
        class Myclass
        {
            public string name { get; set; }
            public decimal age { get; set; }
        }

        static void Main(string[] args)
        {
            var list = new List<Myclass> { new Myclass{name = "di", age = 0}, new Myclass{name = "marks", age = 0}, new Myclass{name = "grade", age = 0}};
            list.Where(w=> w.name == "di").ToList().ForEach(i => i.age = 10);
            list.ForEach(i => Console.WriteLine(i.name + ":" + i.age));
        }
    }
}

Sortie:

 di:10
 marks:0
 grade:0
31
Baldrick
        li.Where(w => w.name == "di" )
          .Select(s => { s.age = 10; return s; })
          .ToList();
7
sivabalan

Si vous voulez vraiment utiliser linq, vous pouvez faire quelque chose comme ceci

li= (from tl in li
    select new Myclass
    {
        name = tl.name,
        age = (tl.name == "di" ? 10 : (tl.name == "marks" ? 20 : 30))

    }).ToList();

ou

li = li.Select(ex => new MyClass { name = ex.name, age = (ex.name == "di" ? 10 : (ex.name == "marks" ? 20 : 30)) }).ToList();

Cela suppose qu’il n’ya que 3 types de name. J'externaliserais cette partie dans une fonction pour la rendre plus facile à gérer. 

3
Smeegs

Essaye ça: 

li.ForEach(x => x.age = (x.name == "di") ?
                10 : (x.name == "marks") ?
                20 : (x.name == "grade") ?
                30 : 0 );

Toutes les valeurs sont mises à jour dans une ligne de code et vous parcourez la liste une seule fois. Vous avez également le moyen de définir une valeur par défaut.

2
David Donari

Essayez Parallel pour les listes plus longues:

Parallel.ForEach(li.Where(f => f.name == "di"), l => l.age = 10);
1
Santosh

Que diriez-vous

(from k in myList
 where k.id > 35
 select k).ToList().ForEach(k => k.Name = "Banana");
0
FindOut_Quran