2009-11-20 19 views
6

मैं एक निश्चित स्रोत (कहीं और से आबादी वाले) से आइटम है:सूचियों की सूची के माध्यम से Iterating?

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; 
} 

वहाँ एक सरल है सभी आइटम्स में सभी आइटम्स के माध्यम से पुन: प्रयास करने का तरीका 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 ईसा IItem से अपना पहला foreach काम करेंगे, और न काम करेंगे। – Woot4Moo

+0

मुझे लगता है कि आपको .NET का संस्करण बताया जाना चाहिए था, क्योंकि कुछ लोग LINQ को एक विकल्प के रूप में पेश कर रहे हैं, .NET के सभी संस्करणों के साथ उपलब्ध नहीं है .. –

उत्तर

12

ठीक है, आप flatmap को LINQ समारोह SelectMany उपयोग कर सकते हैं (बच्चे सूचियां बनाकर उन्हें एक में सेक) मान:

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 
} 
संबंधित मुद्दे