C#中如何连接列表?

215
如果我有:
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 仅包含四个字符串。这是为什么呢?
6个回答

386

127

试试这个:

myList1 = myList1.Concat(myList2).ToList();
Concat返回一个IEnumerable<T>,它是两个列表合并的结果,不会修改任何现有的列表。另外,由于它返回一个IEnumerable,如果你想将它赋值给一个List<T>类型的变量,你需要对返回的IEnumerable<T>调用ToList()方法。

12
现在我重新阅读了这个问题,似乎.AddRange()确实是原帖作者真正想要的。 - Jonathan Rupp
@Kartiikeya 如果它说参数无效,那么你没有使用System.Linq的using语句,或者其中一个不是IEnumerable<T> - Jonathan Rupp

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

我认为它正常工作。如先前所述,Concat返回一个新序列,并在将结果转换为List时完美地完成了工作。


8
值得注意的是,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

3
我知道这篇文章有点老了,但是我很快就想到了Concat可能会是我的答案。Union 对我非常有效。请注意,它只返回唯一的值,但我已经知道我得到的是唯一的值,所以这个解决方案对我很有用。
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

3

请看我的实现。它可以安全地处理空列表。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接