如果我有:
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只包含四个字符串。那是为什么?
答案 0 :(得分:264)
Concat
会返回一个新序列without modifying the original list。试试myList1.AddRange(myList2)
。
答案 1 :(得分:82)
试试这个:
myList1 = myList1.Concat(myList2).ToList();
Concat返回IEnumerable&lt; T&gt;即两个列表放在一起,它不会修改任何现有列表。此外,由于它返回IEnumerable,如果要将其分配给List&lt; T&gt;的变量,则必须在IEnumerable&lt; T&gt;上调用ToList()。返回。
答案 2 :(得分:8)
targetList = list1.Concat(list2).ToList();
它的工作正常我是这么认为的。如前所述,Concat返回一个新序列,在将结果转换为List时,它可以完美地完成工作。
答案 3 :(得分:3)
值得注意的是,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
答案 4 :(得分:2)
我知道这已经过时了,但我很快就想到这个帖子,认为Concat会是我的答案。联盟对我很有用。请注意,它只返回唯一值,但知道我获得了唯一值,无论如何这个解决方案对我有用。
stock['LastTradePrice']
输出结果为:
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;
}
}
}
答案 5 :(得分:2)
看看我的实施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();