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?

Foi útil?

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 que é as duas listas juntos, ela não modifica qualquer lista existente. Além disso, uma vez que retorna um IEnumerable, se você quiser atribuí-la a uma variável que é List , você terá que chamar ToList () no IEnumerable que é retornado.

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(); 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top