如何在C#中连接列表?

Mat*_*att 155 c# arrays list concatenation

如果我有:

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?
Run Code Online (Sandbox Code Playgroud)

我在Visual Studio 2008中运行与此类似的代码,并在每次执行后设置断点.之后myList1 = getMeAList();,myList1包含四个字符串,我按下加号按钮以确保它们不是全部为空.

之后 myList2 = getMeAnotherList();,myList2包含六个字符串,我检查以确保它们不是null ...在myList1.Concat(myList2);myList1 之后只包含四个字符串.这是为什么?

Joh*_*ica 282

Concat返回新序列而不修改原始列表.试试myList1.AddRange(myList2).


Jon*_*upp 85

试试这个:

myList1 = myList1.Concat(myList2).ToList();
Run Code Online (Sandbox Code Playgroud)

Concat返回一个IEnumerable <T>,它是放在一起的两个列表,它不会修改任何现有列表.此外,由于它返回IEnumerable,如果要将其分配给List <T>的变量,则必须在返回的IEnumerable <T>上调用ToList().

  • 现在我重新阅读了这个问题,.AddRange()听起来就像OP真正想要的那样. (6认同)

Bal*_*i M 10

targetList = list1.Concat(list2).ToList();
Run Code Online (Sandbox Code Playgroud)

我认为这样做很好.如前所述,Concat返回一个新序列,在将结果转换为List时,它可以完美地完成工作.


Dmi*_*sky 5

还值得注意的是,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);
Run Code Online (Sandbox Code Playgroud)

给出以下时序/内存指标:

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
Run Code Online (Sandbox Code Playgroud)