Frage

Wenn ich:

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?

lief ich Code wie dies in Visual Studio 2008 und stellen Sollbruchstellen nach jeder Ausführung. Nach myList1 = getMeAList();, myList1 vier Saiten enthält, und drückte ich die Plus-Taste, um sicherzustellen, sie waren nicht alle Nullen.

Nach myList2 = getMeAnotherList(); enthält myList2 sechs Saiten, und ich überprüft, um sicherzustellen, dass sie nicht null waren ... Nach myList1.Concat(myList2); mylist1 nur vier Saiten enthalten. Warum das?

War es hilfreich?

Lösung

Concat gibt eine neue Sequenz , ohne die ursprüngliche Liste zu ändern. Versuchen Sie myList1.AddRange(myList2).

Andere Tipps

Versuchen Sie folgendes:

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

Concat gibt eine IEnumerable , dass die beiden Listen ist zusammen, es nicht ändern entweder bestehende Liste. Da es auch eine IEnumerable zurückgibt, wenn Sie es auf eine Variable zuweisen möchten, die Liste ist , Sie rufen haben ToList () auf der IEnumerable , der zurückgegeben wird.

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

Es funktioniert gut Ich denke schon. Wie bereits gesagt, gibt Concat eine neue Sequenz und während das Ergebnis der Umstellung auf Liste, macht es die Arbeit perfekt.

Es ist auch erwähnenswert, dass Concat arbeitet in konstanter Zeit und in konstanten Speichern. Zum Beispiel der folgende Code

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

gibt den folgenden Timing / Speichermetriken:

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

Ich weiß, das ist alt, aber ich kam schnell auf diesen Beitrag denken Concat wäre meine Antwort. Union arbeitete für mich großartig. Beachten Sie, es gibt nur eindeutige Werte aber zu wissen, dass ich auf jeden Fall diese Lösung eindeutige Werte war immer für mich gearbeitet.

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

Die Ausgabe lautet:

One
Two
Three
1234
4567

nehmen Blick auf meine Umsetzung 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(); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top