2010-02-10 17 views
5

मैं एक IEnumerable<IEnumerable<T>> संग्रह है कि मैं एक भी आयाम संग्रह करने के लिए परिवर्तित करना चाहते हैं के लिए एक IEnumerable > कन्वर्ट करने के लिए। क्या यह एक सामान्य विस्तार विधि के साथ हासिल करना संभव है? अभी मैं इसे प्राप्त करने के लिए यह कर रहा हूँ। कैसे एक IEnumerable <T>

List<string> filteredCombinations = new List<string>(); 

//For each collection in the combinated results collection 
foreach (var combinatedValues in combinatedResults) 
{ 
    List<string> subCombinations = new List<string>(); 
    //For each value in the combination collection 
    foreach (var value in combinatedValues) 
    { 

     if (value > 0) 
     { 
      subCombinations.Add(value.ToString()); 
     } 
    } 
    if (subCombinations.Count > 0) 
    { 
     filteredCombinations.Add(String.Join(",",subCombinations.ToArray())); 
    } 
} 

यदि यह एक सामान्य समाधान प्राप्त करने के लिए संभव नहीं है, कैसे मैं इस एक सुरुचिपूर्ण तरीके में अनुकूलन कर सकते हैं।

+1

शीर्षक में सवाल का जवाब यहां है: http: // stackoverflow। कॉम/प्रश्न/1590723/flatten-list-in-linq –

उत्तर

3

ये रहा:

var strings = combinedResults.Select 
    (
     c => c.Where(i => i > 0) 
     .Select(i => i.ToString()) 
    ).Where(s => s.Any()) 
    .Select(s => String.Join(",", s.ToArray()); 
+0

लेकिन मूल कोड तारों की एक सूची उत्पन्न करता है, एक स्ट्रिंग नहीं ... –

+0

डी ओह। ठीक करना। –

+1

यह पूरा सवाल विचित्र रहा है! शब्द ने एक सवाल पूछा, उदाहरण ने दूसरे से पूछा। और आपने एक तिहाई, अलग-अलग प्रश्न का उत्तर दिया है, और स्वीकार कर लिया है ... मैंने पहले से ही सही उत्तर पोस्ट कर दिया है, और मेरे पास कोई वोट नहीं है (मुझे नहीं लगता कि यह सिर्फ मनोरंजक है।) –

18

आप इसके लिए Enumerable.SelectMany विस्तार विधि का उपयोग कर सकते हैं।

अगर मैं अपना कोड सही पढ़ा है, उस के लिए कोड होगा:

var filteredCombinations = combinatedResults.SelectMany(o => o) 
    .Where(value => value > 0) 
    .Select(v => v.ToString()); 

संपादित: जैसा कि टिप्पणी की, इसके बाद के संस्करण कोड मूल रूप में एक स्ट्रिंग के लिए उप-समूहों के प्रत्येक तत्व में शामिल होने नहीं है, कोड करता है बिल्ट-इन तरीकों का उपयोग कर, आप उस का उपयोग कर सकते हैं:

var filteredCombinations = combinatedResults 
    .Where(resultSet => resultSet.Any(value => value > 0) 
    .Select(resultSet => String.Join(",", 
     resultSet.Where(value => value > 0) 
        .Select(v => v.ToString()).ToArray())); 
+0

मुझे इसे हराया ... –

+0

क्या होगा यदि आप चाहते हैं कि प्रत्येक सबसेट नए संग्रह का एक तत्व हो? मैं स्ट्रिंग के साथ यही करता हूं। जॉइन ... –

+0

यह सही नहीं है - यह 'जॉइन' आवश्यकता को अनदेखा करता है। वैसे भी शीर्षक का जवाब देने के लिए –

3

मैं व्यक्तिगत रूप से Enumerable.SelectMany का प्रयोग करेंगे, suggested by driis के रूप में।

हालांकि, अगर आप इस अपने आप को लागू करने के लिए करना चाहता था, यह बहुत क्लीनर क्या करना होगा:

IEnumerable<T> MakeSingleEnumerable<T>(IEnumerable<IEnumerable<T>> combinatedResults) 
{ 
    foreach (var combinatedValues in combinatedResults) { 
     foreach (var value in combinatedValues) 
       yield return value; 
    } 
} 
+0

हाँ * SelectMany * बेहतर है, लेकिन ऐसा लगता है कि बहुत से लोग "उपज रिटर्न" के बारे में नहीं जानते हैं - जैसा कि इस प्रश्न से प्रमाणित है। –

2

आप दो अलग अलग सवाल पूछा। शीर्षक में वर्णित एक जिसे पहले से ही ड्रिलिस द्वारा उत्तर दिया गया है।

लेकिन आपका उदाहरण कोड एक अलग समस्या है। हम चरणों में इसे पुन: सक्रिय कर सकते हैं। अब बाहरी पाश

List<string> filteredCombinations = new List<string>(); 

//For each collection in the combinated results collection 
foreach (var combinatedValues in combinatedResults) 
{ 
    var subCombinations = combinatedValues.Where(v => v > 0) 
              .Select(v => v.ToString()) 
              .ToList(); 

    if (subCombinations.Count > 0) 
     filteredCombinations.Add(string.Join(",",subCombinations.ToArray())); 
} 

, बस इस के साथ हमें छोड़ रहा है:: चरण 1, subCombinations सूची कुछ LINQ का उपयोग कर निर्माण

var filteredCombinations = combinatedResults 
    .Select(values => values.Where(v => v > 0) 
          .Select(v => v.ToString()) 
          .ToArray()) 
    .Where(a => a.Count > 0) 
    .Select(a => string.Join(",", a)); 
संबंधित मुद्दे