2009-02-08 15 views
19

क्या IEnumerable एस की ऑर्डर की गई सूची लेने का एक आसान अंतर्निहित तरीका है और एक IEnumerable लौटाता है जो क्रमशः सभी तत्वों को, फिर दूसरा, और इसी तरह उत्पन्न करता है।सी # में चेनिंग IENumerables चेनिंग?

मैं निश्चित रूप से अपना खुद का लिख ​​सकता हूं, लेकिन मैं जानना चाहता था कि ऐसा करने से पहले यह प्रतीत होता है कि यह उपयोगी काम पूरा करने का कोई तरीका है या नहीं।

उत्तर

24

SelectMany का प्रयास करें।

IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){ 
return e.SelectMany(x => x); 
} 

इस समारोह का उद्देश्य एक IEnumerable < टी > में IEnumerable < IEnumerable < टी > > के एक समूह समतल है। लौटाया गया डेटा मूल ऑर्डर को सुरक्षित रखेगा। -

15

JaredPar के (सही) जवाब देने के लिए इसके अलावा भी वाक्य रचना क्वेरी:

var all = from inner in outer 
      from item in inner 
      select item; 
12
इसके अलावा LINQ आधारित जवाब (सही) को

...

आप LINQ का उपयोग नहीं करना चाहते हैं, यदि आप एक ChainedEnumerable वर्ग का आविष्कार कर सकते हैं, उपज का उपयोग कर:

public class ChainedEnumerable<T> : IEnumerable<T> 
{ 
    private readonly IEnumerable<T>[] _inners; 

    public ChainedEnumerable(params IEnumerable<T>[] inners) 
    { 
     _inners = inners; 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach (IEnumerable<T> inner in _inners) 
     { 
      foreach (T t in inner) 
      { 
       yield return t; 
      } 
     } 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

इस तरह यह प्रयोग करें:

List<string> a = new List<string> { "A1", "A2", "A3" }; 
List<string> b = new List<string> { "B1", "B2", "B3" }; 
ChainedEnumerable<string> chainedEnumerable = 
    new ChainedEnumerable<string>(a, b); 
foreach (string s in chainedEnumerable) 
    Console.WriteLine(s); 
+0

+1 यह एक अच्छा और साफ समाधान है। मेरा मानना ​​है कि मैं इसे अपनी सामग्री में शामिल कर दूंगा! –