Ответ 1
очиститель. Для этого используется foreach
foreach(var item in li.Where(w => w.name =="di"))
{
item.age=10;
}
У меня был список
List<Myclass> li = new List<Myclass>();
где Myclass
class Myclass
{
public string name {get;set;}
public decimal age {get;set;}
}
элементы в li выглядят как
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();
и хотите получить результат, который выглядит следующим образом
мой код дает ошибку, можете ли вы рассказать, как я это делаю?
очиститель. Для этого используется foreach
foreach(var item in li.Where(w => w.name =="di"))
{
item.age=10;
}
Вам нужно:
li.Where(w=> w.name == "di").ToList().ForEach(i => i.age = 10);
Программный код:
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));
}
}
}
Вывод:
di:10
marks:0
grade:0
li.Where(w => w.name == "di" )
.Select(s => { s.age = 10; return s; })
.ToList();
Если вы действительно хотите использовать linq, вы можете сделать что-то вроде этого
li= (from tl in li
select new Myclass
{
name = tl.name,
age = (tl.name == "di" ? 10 : (tl.name == "marks" ? 20 : 30))
}).ToList();
или
li = li.Select(ex => new MyClass { name = ex.name, age = (ex.name == "di" ? 10 : (ex.name == "marks" ? 20 : 30)) }).ToList();
Это предполагает, что существует только 3 типа name
. Я бы выделил эту часть в функцию, чтобы сделать ее более управляемой.
Попробуйте Параллельный для более длинных списков:
Parallel.ForEach(li.Where(f => f.name == "di"), l => l.age = 10);
Как насчет
(from k in myList
where k.id > 35
select k).ToList().ForEach(k => k.Name = "Banana");
Попробуйте следующее:
li.ForEach(x => x.age = (x.name == "di") ?
10 : (x.name == "marks") ?
20 : (x.name == "grade") ?
30 : 0 );
Все значения обновляются в одной строке кода, и вы просматриваете список только один раз. У вас также есть способ установить значение по умолчанию.