2013-12-10 3 views
1

У меня есть эти два clases:LINQ выражения вместо вложенного Еогеасп петли

public class Client{ 
    public List<Address> addressList{get;set;} 
} 

public class Address{ 
    public string name { get; set; } 
} 

и у меня есть список типов Client называется testList. Она содержит п клиентов, и каждый из них содержит п адреса

List<Client> testList; 

как я могу сделать следующие действия с помощью LINQ:

foreach (var element in testList) 
{ 
    foreach (var add in element.addressList) 
    { 
     console.writeLine(add.name); 
    } 
} 
+0

Вы ищете запрос LINQ. Они используют лямбда-выражения для достижения своей цели, но это не одно и то же. –

ответ

6

Ну я бы не поставил Console.WriteLine в лямбда-выражения, но вы можете использовать SelectMany, чтобы избежать вложенности:

foreach (var add in testList.SelectMany(x => x.addressList)) 
{ 
    Console.WriteLine(add.name); 
} 

я вижу мало причин, чтобы преобразовать результаты в список, а затем использовать когда есть идеальная линия foreach как часть языка. Это не так, как вы, естественно, имеют делегат для применения к каждому имени, например. как параметр метода - вы всегда просто пишете на консоли. См. Eric Lippert's blog post on the topic для большего количества мыслей.

(Я также настоятельно рекомендую вам начать следующие соглашения .NET именовании, но это совсем другое дело.)

+0

Замечание: Только что получил новую (обновленную) книгу. Я только прочитал пару глав, но мне нравится LOT! –

+0

Спасибо, я действительно должен был потратить больше времени на создание примера, но я буду читать соглашения об именах @ http://msdn.microsoft.com/en-us/library/ms229002(v=vs.110). ASPX – user3086989

1
testList.SelectMany(c => c.addressList) 
     .Select(a => a.name) 
     .ToList() 
     .ForEach(Console.WriteLine) 
+0

Мне не нравится идея материализации нового 'List ' просто использовать 'List . FOREach' метод для печати всех элементов. – MarcinJuraszek

+0

@MarcinJuraszek согласен, было бы неплохо иметь расширение 'ForEach' на' IEnumerable'. Я просто хотел сделать все в одной строке с lambdas, так как OP спрашивает –

+1

Мне не нравится идея 'void ForEach (этот источник IEnumerable )'. – MarcinJuraszek

2
foreach(var a in testList.SelectMany(c => c.addressList)) 
{ 
    Console.WriteLine(a.name); 
} 

Он не будет материализовать любую новую коллекцию.

2

Используйте метод ForEach:

testList.ForEach(tl=>tl.addressList.ForEach(al=>console.writeLine(al.name))); 
3

Это может помогает:

testList.ForEach(i => i.addressList.ForEach(j => Console.WriteLine(j.name))); 
1

LINQ не включает функцию ForEach, and they don't intend to, так как она противоречит идее LINQ, являющейся functional методами. Поэтому вы не можете сделать это в одном заявлении. List<T> имеет метод ForEach, но я бы рекомендовал не использовать его по тем же причинам, что и не в LINQ.

Вы можете, однако, использовать LINQ для упрощения кода, например.

foreach (var add in testList.SelectMany(x => x.addressList)) 
{ 
    Console.WriteLine(add.name); 
} 
// or 
foreach (var name in testList.SelectMany(x => x.addressList).Select(x => x.name)) 
{ 
    Console.WriteLine(name); 
} 
2
foreach(var add in testList.SelectMany(element => element.addressList)){ 
    Console.WriteLine(add.name); 
} 
Смежные вопросы