आप C # में सूचियाँ कैसे बनाते हैं?


170

अगर मेरे पास:

List<string> myList1;
List<string> myList2;

myList1 = getMeAList();
// Checked myList1, it contains 4 strings

myList2 = getMeAnotherList();
// Checked myList2, it contains 6 strings

myList1.Concat(myList2);
// Checked mylist1, it contains 4 strings... why?

मैंने विजुअल स्टूडियो 2008 में इसी तरह का कोड चलाया और प्रत्येक निष्पादन के बाद ब्रेक पॉइंट सेट किए। इसके बाद myList1 = getMeAList();, myList1चार तार शामिल हैं, और मैंने यह सुनिश्चित करने के लिए प्लस बटन दबाया कि वे सभी नल नहीं थे।

इसके बाद myList2 = getMeAnotherList();, myList2छह तार शामिल हैं, और मैंने यह सुनिश्चित करने के लिए जाँच की कि वे शून्य नहीं थे ... myList1.Concat(myList2);myList1 के बाद केवल चार तार शामिल थे। ऐसा क्यों है?

जवाबों:



96

इसे इस्तेमाल करे:

myList1 = myList1.Concat(myList2).ToList();

कॉनैट एक IEnumerable <T> देता है जो दो सूचियों को एक साथ रखा गया है, यह या तो मौजूदा सूची को संशोधित नहीं करता है। इसके अलावा, चूंकि यह एक IEnumerable लौटाता है, यदि आप इसे एक चर के लिए निर्दिष्ट करना चाहते हैं जो कि सूची <T> है, तो आपको IEnumerable <T> पर ToList () लौटना होगा।


6
अब जब मैं प्रश्न को दोबारा पढ़ता हूं, .AddRange () ओपी वास्तव में क्या चाहता है जैसे ध्वनि करता है।
जोनाथन रुप्प

@ कर्ताइकिया अगर यह कह रहा है कि तर्क अमान्य हैं, तो आपके पास System.Linq के लिए एक स्टेटमेंट का उपयोग नहीं है, या उनमें से एक नहीं हैIEnumerable<T>
जोनाथन रुप

12
targetList = list1.Concat(list2).ToList();

यह ठीक काम कर रहा है मुझे ऐसा लगता है। जैसा कि पहले कहा गया था, कॉनसैट एक नया अनुक्रम देता है और परिणाम को सूची में परिवर्तित करते समय, यह पूरी तरह से काम करता है।


4

यह भी ध्यान देने योग्य है कि कॉनैट निरंतर समय और निरंतर स्मृति में काम करता है। उदाहरण के लिए, निम्न कोड

        long boundary = 60000000;
        for (long i = 0; i < boundary; i++)
        {
            list1.Add(i);
            list2.Add(i);
        }
        var listConcat = list1.Concat(list2);
        var list = listConcat.ToList();
        list1.AddRange(list2);

निम्नलिखित समय / मेमोरी मैट्रिक्स देता है:

After lists filled mem used: 1048730 KB
concat two enumerables: 00:00:00.0023309 mem used: 1048730 KB
convert concat to list: 00:00:03.7430633 mem used: 2097307 KB
list1.AddRange(list2) : 00:00:00.8439870 mem used: 2621595 KB

2

मुझे पता है कि यह पुराना है, लेकिन मैं इस पोस्ट पर जल्दी से सोच रहा था कि कॉनैट मेरा जवाब होगा। संघ ने मेरे लिए बहुत काम किया। ध्यान दें, यह केवल अद्वितीय मान लौटाता है, लेकिन यह जानते हुए कि मुझे अद्वितीय मूल्य मिल रहे हैं, वैसे भी इस समाधान ने मेरे लिए काम किया।

namespace TestProject
{
    public partial class Form1 :Form
    {
        public Form1()
        {
            InitializeComponent();

            List<string> FirstList = new List<string>();
            FirstList.Add("1234");
            FirstList.Add("4567");

            // In my code, I know I would not have this here but I put it in as a demonstration that it will not be in the secondList twice
            FirstList.Add("Three");  

            List<string> secondList = GetList(FirstList);            
            foreach (string item in secondList)
                Console.WriteLine(item);
        }

        private List<String> GetList(List<string> SortBy)
        {
            List<string> list = new List<string>();
            list.Add("One");
            list.Add("Two");
            list.Add("Three");

            list = list.Union(SortBy).ToList();

            return list;
        }
    }
}

आउटपुट है:

One
Two
Three
1234
4567

2

मेरे कार्यान्वयन पर एक नज़र डालें। यह अशक्त सूची से सुरक्षित है।

 IList<string> all= new List<string>();

 if (letterForm.SecretaryPhone!=null)// first list may be null
     all=all.Concat(letterForm.SecretaryPhone).ToList();

 if (letterForm.EmployeePhone != null)// second list may be null
     all= all.Concat(letterForm.EmployeePhone).ToList(); 

 if (letterForm.DepartmentManagerName != null) // this is not list (its just string variable) so wrap it inside list then concat it 
     all = all.Concat(new []{letterForm.DepartmentManagerPhone}).ToList();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.