Wie verketten Sie Listen in C #?
-
22-07-2019 - |
Frage
Wenn ich:
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?
lief ich Code wie dies in Visual Studio 2008 und stellen Sollbruchstellen nach jeder Ausführung. Nach myList1 = getMeAList();
, myList1
vier Saiten enthält, und drückte ich die Plus-Taste, um sicherzustellen, sie waren nicht alle Nullen.
Nach myList2 = getMeAnotherList();
enthält myList2
sechs Saiten, und ich überprüft, um sicherzustellen, dass sie nicht null waren ... Nach myList1.Concat(myList2);
mylist1 nur vier Saiten enthalten. Warum das?
Lösung
Concat
gibt eine neue Sequenz , ohne die ursprüngliche Liste zu ändern. Versuchen Sie myList1.AddRange(myList2)
.
Andere Tipps
Versuchen Sie folgendes:
myList1 = myList1.Concat(myList2).ToList();
Concat gibt eine IEnumerable
targetList = list1.Concat(list2).ToList();
Es funktioniert gut Ich denke schon. Wie bereits gesagt, gibt Concat eine neue Sequenz und während das Ergebnis der Umstellung auf Liste, macht es die Arbeit perfekt.
Es ist auch erwähnenswert, dass Concat arbeitet in konstanter Zeit und in konstanten Speichern. Zum Beispiel der folgende Code
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);
gibt den folgenden Timing / Speichermetriken:
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
Ich weiß, das ist alt, aber ich kam schnell auf diesen Beitrag denken Concat wäre meine Antwort. Union arbeitete für mich großartig. Beachten Sie, es gibt nur eindeutige Werte aber zu wissen, dass ich auf jeden Fall diese Lösung eindeutige Werte war immer für mich gearbeitet.
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;
}
}
}
Die Ausgabe lautet:
One
Two
Three
1234
4567
nehmen Blick auf meine Umsetzung 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();