2009-11-20 4 views
6

У меня есть элементы из определенного источника (заселенного откуда-то еще):Итерация через список списков?

public class ItemsFromSource{ 
    public ItemsFromSource(string name){ 
     this.SourceName = name; 
     Items = new List<IItem>(); 
    } 

    public string SourceName; 
    public List<IItem> Items; 
} 

Сейчас в MyClass У меня есть элементы из нескольких источников (населённых откуда-то еще):

public class MyClass{ 
    public MyClass(){ 
    } 

    public List<ItemsFromSource> BunchOfItems; 
} 

Есть простой способ перебора всех элементов во всех элементах ItemsFromSources в BunchOfItems за один раз? то есть что-то вроде:

foreach(IItem i in BunchOfItems.AllItems()){ 
    // do something with i 
} 

вместо делать

foreach(ItemsFromSource ifs in BunchOffItems){ 
    foreach(IItem i in ifs){ 
     //do something with i 
    } 
} 
+0

если ItemsFromSource Isa IItem чем ваш первый Еогеасп будет работать, иначе ни будет работать. – Woot4Moo

+0

Я думаю, вы должны были указать версию .NET, которую вы используете, поскольку некоторые люди предлагают LINQ в качестве опции, недоступную для всех версий .NET. –

ответ

12

Ну, вы можете использовать функцию LINQ SelectMany для flatmap (создание дочерних списков и сжать их в один) значения:

foreach(var i in BunchOfItems.SelectMany(k => k.Items)) {} 
3

Вы могли бы сделать функцию, чтобы сделать это для вас.

Enumerable<T> magic(List<List<T>> lists) { 
    foreach (List<T> list in lists) { 
    foreach (T item in list) { 
     yield return item; 
    } 
    } 
} 

Тогда вы просто сделать:

List<List<int>> integers = ...; 
foreach (int i in magic(integers)) { 
    ... 
} 

Кроме того, я думаю, PowerCollections будет иметь что-то для этого из коробки.

0
//Used to flatten hierarchical lists 
    public static IEnumerable<T> Flatten<T>(this IEnumerable<T> items, Func<T, IEnumerable<T>> childSelector) 
    { 
     if (items == null) return Enumerable.Empty<T>(); 
     return items.Concat(items.SelectMany(i => childSelector(i).Flatten(childSelector))); 
    } 

Я думаю, что это будет работать для того, что вы хотите делать. Приветствия.

5

Вы можете использовать SelectMany:

foreach(IItem i in BunchOffItems.SelectMany(s => s.Items)){ 
    // do something with i 
} 
Смежные вопросы