2013-11-12 2 views
14

У меня был списокусловного Обновления списка с помощью LINQ

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

где Myclass является

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

элементов литиево выглядит

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

и хотят привести который выглядит следующим образом

enter image description here

мой код дает ошибку пожалуйста, вы можете сказать, как я это сделать

+2

Этот вопрос трудно/опасно ответить, не вводя в заблуждение людей, думая, что LINQ является подходящим решением вашей проблемы. LINQ означает Language Integrated Query. Он был разработан, чтобы предоставить исходные данные для .NET. Проще говоря: то, что вы делаете, - это * не * запрос. Ответ @ wudzik показывает, как LINQ предназначен для использования: как инструмент для запроса коллекции. Вы должны спросить себя, «какой инструмент я должен использовать здесь» вместо того, чтобы заставить LINQ быть этим инструментом. –

+0

Хорошо, я понял .... –

ответ

52

очиститель способ сделать это с помощью Foreach

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

это не с помощью LINQ –

+14

@Co.Aden LINQ для ** запроса ** не меняется – wudzik

26

Вам нужно:

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 
+1

он создаст новый список, который заменит старый, BTW единственный LINQ здесь 'where' – wudzik

+0

Новый список, да - но содержащий те же элементы, которые будут обновлены правильно , Этот новый список затем отбрасывается. – Baldrick

+0

будет отброшен, но как вы замените старые значения списка? 'li = yourstatement' удалит другие значения – wudzik

3

Если вы действительно хотите использовать 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. Я бы выделил эту часть в функцию, чтобы сделать ее более управляемой.

6
 li.Where(w => w.name == "di") 
      .Select(s => { s.age = 10; return s; }) 
      .ToList(); 
+3

Можете ли вы включить некоторое описание своего ответа вместо того, чтобы просто публиковать код кода? –

+0

Не забывайте, что синтаксис возврата мне понадобился один час –

0

Как насчет

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

Попробуйте Parallel для длинных списков:

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

Попробуйте это:

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

Все значения обновляются в одной строке кодаd вы просматриваете Список только ОДИН раз. У вас также есть способ установить значение по умолчанию.

Смежные вопросы