سؤال

إذا كنت لديك:

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?

وركضت رمز مشابهة لهذه في Visual Studio 2008 ووضع نقاط لكسر الارسال بعد كل التنفيذ. بعد myList1 = getMeAList();، myList1 يحتوي على أربعة سلاسل، وضغطت على زر زائد للتأكد من أنها لم تكن كل بالقيم الخالية.

وبعد myList2 = getMeAnotherList();، myList2 يحتوي على ستة سلاسل، وراجعت للتأكد من أنها لم تكن باطلة ... وبعد الواردة myList1.Concat(myList2); myList1 سلاسل أربعة فقط. لماذا؟

هل كانت مفيدة؟

المحلول

وConcat إرجاع تسلسل دون تعديل قائمة الأصلي . محاولة myList1.AddRange(myList2).

نصائح أخرى

وجرب هذا:

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

CONCAT بإرجاع IEnumerable هذا هو القائمتين وضعت معا، فإنه لا تعديل إما قائمة موجودة. أيضا، لأنه بإرجاع IEnumerable، إذا كنت ترغب في إسناد ذلك إلى متغير غير قائمة ، سيكون لديك للاتصال ToList () على IEnumerable التي تم إرجاعها.

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

وانها تعمل بشكل جيد أعتقد ذلك. كما قال في وقت سابق، CONCAT بإرجاع سلسلة جديدة وعلى الرغم من تحويل النتيجة إلى قائمة، فإنه لا وظيفة تماما.

وكما تجدر الإشارة إلى أن CONCAT يعمل في وقت ثابت وفي ذاكرة ثابتة. على سبيل المثال، التعليمة البرمجية التالية

        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

وأعرف أن هذا هو قديم ولكن جئت إلى هذا المنصب التفكير بسرعة أن CONCAT يكون جوابي. عمل الاتحاد كبير بالنسبة لي. ملاحظة، فإنها ترجع القيم الفريدة فحسب، بل مع العلم أن الأول هو الحصول على قيم فريدة على أي حال هذا الحل عملت بالنسبة لي.

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

وخذوا زينتكم عند its safe from null lists تنفيذ بلدي

 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(); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top