Comment concaténer les listes en C#?

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 lancé un code similaire à celui-ci dans Visual Studio 2008 et j'ai mis des points d'arrêt après chaque exécution. Après myList1 = getMeAList(); , myList1 contient quatre cordes, et j'ai appuyé sur le bouton plus pour m'assurer qu'elles n'étaient pas toutes nulles.

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

128
demandé sur luk2302 2009-06-25 08:43:13

7 réponses

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

241
répondu John Kugelman 2017-05-23 12:10:26

essayez ceci:

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

Concat retourne un IEnumerable c'est-à-dire les deux listes réunies, il ne modifie aucune des listes existantes. De plus, puisqu'il retourne un IEnumerable, si vous voulez l'assigner à une variable qui est List, vous devrez appeler ToList() sur le IEnumerable qui est retourné.

76
répondu Jonathan Rupp 2009-06-25 04:44:59

Concat n'est pas mise à jour myList1 . Il retourne une nouvelle liste contenant les concaténés myList1 et myList2 .

Use myList1.AddRange(myList2) à la place.

10
répondu Jacob 2018-08-04 17:54:04
targetList = list1.Concat(list2).ToList();

ça marche très bien. Comme dit précédemment, Concat retourne une nouvelle séquence et tout en convertissant le résultat en liste, il fait le travail parfaitement.

7
répondu Balasubramani M 2015-11-22 03:08:19

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 paramètres de temps/mémoire suivants:

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
3
répondu Dmitry Andrievsky 2014-11-22 01:13:16

je sais que c'est vieux mais je suis venu sur ce poste rapidement pensant Concat serait ma réponse. Le syndicat a bien travaillé pour moi. Notez qu'il ne renvoie que des valeurs uniques, mais sachant que je recevais des valeurs uniques de toute façon, cette solution a fonctionné 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;
        }
    }
}

la sortie est:

One
Two
Three
1234
4567
2
répondu Esaith 2015-09-28 18:16:32

regardez mon implémentation 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(); 
2
répondu Basheer AL-MOMANI 2016-09-21 17:46:13