Como você concatenar listas em C #?
-
22-07-2019 - |
Pergunta
Se eu tiver:
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?
Eu corri código semelhante a este no Visual Studio 2008 e definir pontos de quebra após cada execução. Depois myList1 = getMeAList();
, myList1
contém quatro cordas, e eu apertei o botão de mais para se certificar de que eles não eram todos os valores nulos.
Depois de myList2 = getMeAnotherList();
, myList2
contém seis cordas, e eu verifiquei para ter certeza de que eles não foram nulos ... Depois myList1.Concat(myList2);
myList1 continha apenas quatro cordas. Por que isso?
Solução
Concat
retorna uma nova seqüência sem modificar a lista original . Tente myList1.AddRange(myList2)
.
Outras dicas
Tente isto:
myList1 = myList1.Concat(myList2).ToList();
Concat retorna um IEnumerable
targetList = list1.Concat(list2).ToList();
fino Está funcionando Eu acho que sim. Como dito anteriormente, Concat retorna uma nova seqüência e ao converter o resultado para List, ele faz o trabalho perfeitamente.
É importante notar também que Concat funciona em tempo constante e na memória constante. Por exemplo, o código a seguir
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);
dá as seguintes métricas de tempo / memória:
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
Eu sei que este é antiga, mas me deparei com este post rapidamente pensando Concat seria a minha resposta. União trabalhou muito para mim. Note, ele retorna apenas valores únicos, mas sabendo que eu estava ficando valores exclusivos de qualquer maneira esta solução funcionou para mim.
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;
}
}
}
A saída é:
One
Two
Three
1234
4567
take olhada no meu implementação 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();