你如何连接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
包含四个string,然后按下加号button以确保它们不是全部空值。
myList2 = getMeAnotherList();
, myList2
包含六个string,我检查,以确保它们不是null … myList1.Concat(myList2);
myList1只包含四个string。 这是为什么?
Concat
在不修改原始列表的情况下返回一个新序列。 试试myList1.AddRange(myList2)
。
尝试这个:
myList1 = myList1.Concat(myList2).ToList();
Concat返回一个IEnumerable <T>,这两个列表放在一起,它不会修改现有的列表。 另外,因为它返回一个IEnumerable,所以如果你想把它分配给一个List <T>variables,你必须在返回的IEnumerable <T>上调用ToList()。
Concat没有更新myList1
它返回一个包含连接的myList1
和myList2
的新列表。
改用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
我知道这是旧的,但我很快就想到了这个post,认为康卡特将是我的答案。 联盟对我很好。 请注意,它只返回唯一的值,但知道我得到了独特的价值无论如何这个解决scheme为我工作。
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
看看我的执行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();