2010-03-01 15 views
5

मेरे पास उदाहरण के लिए सभी एक ही प्रकार की सूची है। क्या मैं बससूची <T> सूचियों की 'एक्स' राशि के लिए Concatenation

List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4)..... 
+0

लगभग वही: [सुरुचिपूर्ण तरीके से गठबंधन-बहु-संग्रह-तत्व] (http://stackoverflow.com/questions/4493858/elegant-way-to-combine-multiple-collections-of -elements) – nawfal

उत्तर

4

आप कर सकते हैं, लेकिन भूल नहीं है अंत में .ToList(); संलग्न करने के लिए। भी आप newset.AddRange(ListX); कॉल कर सकते हैं मुझे लगता है कि यह प्रदर्शन

5

हाँ, आप ऐसा कर सकते हैं।

List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList(); 
1

आप निश्चित रूप से ऐसा कर सकते हैं, हालांकि यह अविश्वसनीय रूप से कुशल नहीं हो सकता है।

जैसा कि अन्य उत्तरों ने कहा है, कोड की अपनी लाइन के अंत में .ToList() जोड़ने के लिए मत भूलना या List1.AddRange(List2); List1.AddRange(List3); ... का उपयोग अतिरिक्त दक्षता के लिए करें।

13

आप यह कर सकते हैं (हालांकि आपको अंत में .ToList() की आवश्यकता है)।

हालांकि, यह एक सूची बनाने के लिए (थोड़ा) अधिक कुशल होगा, और प्रत्येक सूची में जोड़ने के लिए AddRange का उपयोग करें। बस अपनी सभी सूचियों के कुल आकार के साथ सूची आरंभ करें, फिर बार-बार AddRange को कॉल करें।

आप की तरह कुछ कर रही विचार करना चाह सकते:

public List<T> ConcatMultiple<T>(this List<T> list, params[] ICollection<T> others) 
{ 
    List<T> results = new List<T>(list.Count + others.Sum(i => i.Count)); 
    results.AddRange(list); 
    foreach(var l in others) 
     results.AddRange(l); 
    return results; 
} 

तब के माध्यम से बुला:

List<MyClass> newset = List1.ConcatMultiple(List2, List3, List4); 
+1

एक विशिष्ट सूची का विस्तार तरीका बनाने के लिए थोड़ा अजीब लगता है, क्योंकि यह पूरी तरह से नई सूची देता है और किसी भी तरह से मुख्य सूची को प्रभावित नहीं करता है। –

+1

@Ilia: यह मेरे लिए अजीब प्रतीत नहीं होता है, क्योंकि यह वास्तव में उपयोग करने के मामले में अनन्य नहीं है। कॉनकैट: http://msdn.microsoft.com/en-us/library/bb302894.aspx –

1

के संदर्भ चर सूची गिनती के लिए में बेहतर है:

IEnumerable<T> enumerable = Enumerable.Empty<T>(); 
foreach (List<T> list in [whatever]) 
    enumerable = enumerable.Concat(list); 

अंत में आप एक "ToList()" जोड़ सकता है अगर आप एक भरोसा सूची चाहते हैं:

List<T> list = enumerable.ToList(); 

हालांकि, यह सुनिश्चित नहीं किया जा सकता है।

1
आप LINQ में एक संघ का उपयोग कर सकते है, तो यह एक वास्तविक संघ है कि आप बिल्कुल क्या करना चाहते है की

...

2

आप सूचियों का एक मनमाना (पूर्व में अज्ञात) संख्या को श्रेणीबद्ध करने के लिए चाहते हैं, तो आप की आवश्यकता हो सकती सूचियों के संग्रह को संयोजित करने के लिए। शायद यह करने के लिए सबसे आसान तरीका है SelectMany ऑपरेटर (या नेस्टेड from खंड LINQ क्वेरी में) का उपयोग करने होगा:

IEnumerable<List<int>> lists = /* get list of lists */; 
List<int> result = lists.SelectMany(e => e).ToList(); 

SelectMany ऑपरेटर इनपुट सूची के प्रत्येक तत्व के लिए दिए गए समारोह (जो सूची दी गई है कॉल) और फिर सभी परिणामी सूचियों (सूचियों की आपकी इनपुट सूची से वास्तविक सूचियों) को जोड़ता है। वैकल्पिक रूप से LINQ क्वेरी सिंटैक्स का उपयोग:

List<int> result = (from l in lists 
        from e in l select e).ToList(); 

मुझे विश्वास है कि सी # संकलक वास्तव में इस का अनुकूलन कर सकते हैं, ताकि इस पर सब अलग-अलग तत्वों पुनरावृति नहीं है (और ऊपर स्पष्ट संस्करण के रूप में एक ही बात करता है)। आप सूचियों का एक ज्ञात नंबर है, तो आप कर सकते हैं पाठ्यक्रम के राईट:

List<int> result = (from l in new[] { list1, list2, list3, list4 } 
        from e in l select e).ToList(); 

यह इस उद्देश्य के लिए वास्तव में अपनी खुद की विधि को परिभाषित करने के रूप में के रूप में सुंदर नहीं है, लेकिन यह दिखाता है कि शक्तिशाली LINQ क्वेरी सिंटैक्स है।

संबंधित मुद्दे