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
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
mein Code gibt einen Fehler. Können Sie mir bitte sagen, wie ich das mache?
cleaner Um dies zu erreichen, verwenden Sie foreach
foreach(var item in li.Where(w => w.name =="di"))
{
item.age=10;
}
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
li.Where(w => w.name == "di" )
.Select(s => { s.age = 10; return s; })
.ToList();
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.
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.
Versuchen Sie Parallel für längere Listen:
Parallel.ForEach(li.Where(f => f.name == "di"), l => l.age = 10);
Wie wäre es mit
(from k in myList
where k.id > 35
select k).ToList().ForEach(k => k.Name = "Banana");