it-swarm.com.de

bedingt Aktualisierung einer Liste mit LINQ

Ich hatte eine Liste

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

wo Myclass ist

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

artikel in Li sieht aus wie

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

und wollen ein Ergebnis, das so aussieht

enter image description here

mein Code gibt einen Fehler. Können Sie mir bitte sagen, wie ich das mache?

19
Co. Aden

cleaner Um dies zu erreichen, verwenden Sie foreach

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

Du brauchst:

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

Programmcode:

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

Ausgabe:

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

Wenn Sie Linq wirklich verwenden möchten, können Sie so etwas tun

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

    }).ToList();

oder

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

Dies setzt voraus, dass es nur 3 Typen von name gibt. Ich würde diesen Teil in eine Funktion externalisieren, um ihn leichter handhabbar zu machen. 

3
Smeegs

Versuche dies: 

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

Alle Werte werden in einer Codezeile aktualisiert, und Sie durchsuchen die Liste nur einmal. Sie können auch einen Standardwert festlegen.

2
David Donari

Versuchen Sie Parallel für längere Listen:

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

Wie wäre es mit

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