如何在c#中连接列表?

如果我有:

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只包含四个字符串。为什么呢?

295061 次浏览

试试这个:

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

Concat返回一个IEnumerable<T>,它是两个列表放在一起,它不修改现有的任何一个列表。此外,由于它返回一个IEnumerable,如果你想将它赋值给一个List<T>的变量,你必须对返回的IEnumerable<T>调用ToList()。

Concat返回一个新的序列无需修改原始列表myList1.AddRange(myList2)试试。

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

我想它运行得很好。如前所述,Concat返回一个新的序列,在将结果转换为List时,它完美地完成了工作。

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

看一下我的实现。它不受空列表的影响。

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