আপনি সি # তে তালিকাটিকে কীভাবে একত্রিত করবেন?


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?

আমি ভিজ্যুয়াল স্টুডিও ২০০৮ এ এর ​​অনুরূপ কোডটি দৌড়েছি এবং প্রতিটি সম্পাদনের পরে ব্রেক পয়েন্ট নির্ধারণ করেছি। এর পরে myList1 = getMeAList();, myList1চারটি স্ট্রিং রয়েছে এবং আমি প্লাস বোতামটি টিপলাম যাতে তারা সমস্ত নাল নয় make

এর পরে myList2 = getMeAnotherList();, myList2ছয়টি স্ট্রিং রয়েছে এবং আমি নিশ্চিত করেছিলাম সেগুলি নাল ছিল না ... myList1.Concat(myList2);মাইলিস্ট 1 এ কেবলমাত্র চারটি স্ট্রিং রয়েছে। কেন এমন?

উত্তর:



96

এটা চেষ্টা কর:

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

কনক্যাট একটি অনুমিত <টি> ফেরত দেয় যে দুটি তালিকাকে একসাথে রাখা হয়েছে, এটি বিদ্যমান তালিকার কোনওটিকেই সংশোধন করে না। এছাড়াও, যেহেতু এটি একটি আইমনামেবল ফিরিয়ে দেয়, আপনি যদি তালিকাটি <T> নামক কোনও ভেরিয়েবলের কাছে এটি নির্ধারণ করতে চান, আপনাকে ফিরে আসা আইইনামেবল <T> এ টোললিস্ট () কল করতে হবে।


6
এখন যেহেতু আমি প্রশ্নটি পুনরায় পড়ি, .এডরেঞ্জ () ওপি আসলে যা চায় তার মতো শব্দ করে।
জোনাথন রুপ

@Kartiikeya যদি এটা বলছে আর্গুমেন্ট অবৈধ তাহলে আপনি System.Linq জন্য একটি বিবৃতি ব্যবহার হবে না, বা তাদের মধ্যে একজন একটি নয়IEnumerable<T>
জনাথন Rupp

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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.