Question

Si j'ai:

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?

J'ai exécuté un code similaire à celui-ci dans Visual Studio 2008 et défini des points d'arrêt après chaque exécution. Après myList1 = getMeAList();, myList1 contient quatre chaînes et j'ai appuyé sur le bouton Plus pour vous assurer qu'elles n'étaient pas toutes nulles.

Après myList2 = getMeAnotherList();, myList2 contient six chaînes et j'ai vérifié que celles-ci n'étaient pas nulles ... Après myList1.Concat(myList2);, myList1 ne contenait que quatre chaînes. Pourquoi est-ce?

Était-ce utile?

La solution

Concat renvoie une nouvelle séquence sans modifier la liste d'origine . Essayez myList1.AddRange(myList2).

Autres conseils

Essayez ceci:

myList1 = myList1.Concat(myList2).ToList();

Concat renvoie un IEnumerable < T gt; c’est-à-dire les deux listes réunies, elle ne modifie aucune des listes existantes. De plus, comme il retourne un IEnumerable, si vous voulez l'assigner à une variable de type List & Lt; T & Gt ;, vous devrez appeler ToList () sur le IEnumerable & Lt; T > qui est renvoyé.

targetList = list1.Concat(list2).ToList();

Cela fonctionne bien, je pense que oui. Comme indiqué précédemment, Concat renvoie une nouvelle séquence et lors de la conversion du résultat en liste, il fait parfaitement l'affaire.

Il est également intéressant de noter que Concat fonctionne en temps constant et en mémoire constante. Par exemple, le code suivant

        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);

donne les métriques de synchronisation / mémoire suivantes:

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

Je sais que c'est vieux, mais je suis tombé sur ce message rapidement en pensant que Concat serait ma réponse. Union a bien fonctionné pour moi. Notez que cela ne renvoie que des valeurs uniques, mais sachant que je recevais des valeurs uniques, cette solution fonctionnait de toute façon pour moi.

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;
        }
    }
}

Le résultat est:

One
Two
Three
1234
4567

regardez ma mise en œuvre 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(); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top