Listeleri C # ile nasıl birleştirirsiniz?


171

Sahip olursam:

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'de buna benzer bir kod çalıştırdım ve her yürütmeden sonra kesme noktaları ayarladım. Sonra myList1 = getMeAList();,myList1 dört dize içerir ve ben bunların hepsi boş olmadığından emin olmak için artı düğmesine bastım.

Sonra myList2 = getMeAnotherList();, myList2altı dize içerir ve ben boş olmadığını emin olmak için kontrol ... myList1.Concat(myList2);myList1 sonra sadece dört dize içeriyor. Neden?

Yanıtlar:



97

Bunu dene:

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

Concat , bir araya getirilen iki liste olan bir IEnumerable <T> döndürür, varolan listenin hiçbirini değiştirmez. Ayrıca, bir IEnumerable döndürdüğünden, List <T> olan bir değişkene atamak istiyorsanız, döndürülen IEnumerable <T> üzerinde ToList () öğesini çağırmanız gerekir.


6
Şimdi soruyu yeniden okuduğum için .AddRange (), OP'nin gerçekten istediği gibi geliyor.
Jonathan Rupp

@Kartiikeya, argümanların geçersiz olduğunu söylüyorsa, System.Linq için bir kullanım ifadeniz yok veya bunlardan biri bir değilIEnumerable<T>
Jonathan Rupp

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

Bence iyi çalışıyor. Daha önce de belirtildiği gibi, Concat yeni bir dizi döndürür ve sonucu List'e dönüştürürken işi mükemmel bir şekilde yapar.


4

Concat'ın sabit zamanda ve sabit bellekte çalıştığını da belirtmek gerekir. Örneğin, aşağıdaki kod

        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);

aşağıdaki zamanlama / bellek metriklerini verir:

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

Bunun eski olduğunu biliyorum ama Concat'ın benim cevabım olacağını düşünerek hemen bu göreve geldim. Sendika benim için çok çalıştı. Unutmayın, sadece benzersiz değerler döndürür, ancak yine de bu çözüm benim için işe yarayan benzersiz değerler elde ettiğimi bilerek.

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;
        }
    }
}

Çıktı:

One
Two
Three
1234
4567

2

Uygulamama bir göz atın. Boş listelerden güvenlidir.

 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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.