2015-01-22 2 views
2

Хорошие дни,Получить конкретный элемент вложенного списка с помощью лямбда в C#

Допустим, у меня есть статический List<AClass> объект (позволяет назвать его myStaticList), который содержит другой список внутри и этот список содержит другой список с ИДС и свойство Name.

Что мне нужно сделать, это

foreach(AClass a in myStaticList) 
{ 
    foreach(BClass b in a.bList) 
    { 
     foreach(CClass c in b.cList) 
     { 
     if(c.CId == 12345) 
     { 
      c.Name = "Specific element in static list is now changed."; 
     } 
     } 
    } 
} 

Могу ли я добиться этого с выражениями LINQ лямбда?

Нечто подобное;

myStaticList 
.Where(a=>a.bList 
.Where(b=>b.cList 
.Where(c=>c.CId == 12345) != null) != null) 
.something logical 
.Name = "Specific element in static list is now changed."; 

Обратите внимание: я хочу изменить свойство этого конкретного элемента в статическом списке.

+0

Возможный дубликат выражения [Linq вложенного списка] (http://stackoverflow.com/questions/6144495/linq-nested-list-expression) –

ответ

3

Использование SelectMany (отличный пост here)

var element = myStaticList.SelectMany(a => a.bList) 
          .SelectMany(b => b.cList) 
          .FirstOrDefault(c => c.CId == 12345); 

if (element != null) 
    element.Name = "Specific element in static list is now changed."; 
6

Вы должны SelectMany выравниваться списки:

var result = myStaticList.SelectMany(a=>a.bList) 
         .SelectMany(b => b.cList) 
         .FirstOrDefault(c => c.CId == 12345); 

if(result != null) 
    result.Name = "Specific element in static list is now changed.";; 
0
var item = (from a in myStaticList 
      from b in a.bList 
      from c in b.cList 
      where c.CID = 12345 
      select c).FirstOrDefault(); 
if (item != null) 
{ 
    item.Property = "Something new"; 
} 

Вы можете использовать SelectMany также, но это не так просто.

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