Comment vider une liste en C #?

109

Je veux vider une liste. Comment faire ça?

olive
la source
34
Le temps de réponse ici est plus rapide qu'il ne l'aurait été pour lire / rechercher MSDN
V4Vendetta
27
De plus, la réponse est maintenant plus facile à trouver ici que MSDN.
Matt Connolly
14
Sans parler du fait que si vous Google .net empty list, cette page apparaît avant MSDN!
Vivian River
2
@ V4Vendetta En 2018, je suggérerais que StackOverflow crée probablement un Bot qui mettra votre commentaire sur n'importe quel fil qui a un lien vers MSDN doc dans les commentaires ...
scharette

Réponses:

234

C'est vraiment simple:

myList.Clear();
Øyvind Bråthen
la source
3
... si la liste est en fait un List<>, ArrayListou des outils IList. ;)
Lucero
3
@Lucero est-il appelé comme une liste si ce n'est ni l'un ni l'autre?
Srinivas Reddy Thatiparthy
16
Comme il s'agit d'un succès sur Google et que je rencontre ce problème, je suis nécro de le commenter. Si vous utilisez la même liste dans une boucle et utilisez clear, la liste gardera souvent des références à d'anciens objets - je finis souvent par utiliser = new LisT <T> (); en raison du fait qu'il efface toutes les anciennes allocations instantanément. Pour la plupart des gens cependant, .Clear (); suffira, mais si vous trouvez une liste agissant étrangement - essayez d'utiliser = new List <T> () ;.
Charles
1
Je vais doubler le necrocommenter cela parce que des informations erronées ont été fournies ici à partir de 2020. List<T>.Clearefface correctement toutes les références, ce qui permet au GC d'effacer les allocs si nécessaire. new List<T>ne fait PAS cela et ne convient pas à tous les scénarios
Jean
28

Si par "liste" vous entendez a List<T>, alors la méthode Clear est ce que vous voulez:

List<string> list = ...;
...
list.Clear();

Vous devriez prendre l'habitude de rechercher la documentation MSDN sur ces choses.

Voici comment rechercher rapidement de la documentation sur divers bits de ce type:

Toutes ces requêtes Google répertorient un ensemble de liens, mais vous voulez généralement le premier que google vous donne dans chaque cas.

Lasse V. Karlsen
la source
"Tous ces listes contiennent un ensemble de liens, mais vous voulez généralement le premier." A moins que vous ne souhaitiez vider la liste?
un CVn
Désolé, j'aurais dû être plus clair. Vous voulez généralement le premier lien que Google vous donne, pas la "Classe de liste".
Lasse V. Karlsen
9

Pour donner une réponse alternative (Qui a besoin de 5 réponses égales?):

list.Add(5); 
// list contains at least one element now
list = new List<int>();
// list in "list" is empty now

Gardez à l'esprit que toutes les autres références à l'ancienne liste n'ont pas été effacées (selon la situation, cela peut être ce que vous souhaitez). De plus, en termes de performances, il est généralement un peu plus lent.

Meinersbur
la source
Pouvez-vous vérifier que le paramètre list = new List <> () est en fait plus lent que list.Clear () ;? Selon MSDN (lien ci-dessous) list.Clear (); est une opération O (N), et je ne peux pas imaginer que l'instanciation d'une nouvelle liste prendrait plus de temps que cela. msdn.microsoft.com/en-us/library/dwb5h52a(v=vs.110).aspx
Chris Tramel
5
DotNetPerls a fait un benchmark et a constaté que la nouvelle liste <> est plus rapide. dotnetperls.com/list-clear
Gerhard Powell
Par extension, soyez également conscient qu'il y lista une nouvelle référence. Ne l'utilisez donc pas si vous utilisez un verrou sur cette liste.
jeromej
9

Option 1: Utilisez la fonction Clear () pour vider List<T>et conserver sa capacité.

  • Count est défini sur 0 et les références à d'autres objets des éléments de la collection sont également libérées.

  • La capacité reste inchangée.

Option # 2 - Utilisez les fonctions Clear () et TrimExcess () pour définir List<T>l'état initial.

  • Count est défini sur 0 et les références à d'autres objets des éléments de la collection sont également libérées.

  • Le rognage d'un vide List<T>définit la capacité de la liste sur la capacité par défaut.

Définitions

Count = nombre d'éléments qui se trouvent réellement dans leList<T>

Capacité = nombre total d'éléments que la structure de données interne peut contenir sans redimensionnement.

Effacer () uniquement

List<string> dinosaurs = new List<string>();    
dinosaurs.Add("Compsognathus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Deinonychus");
Console.WriteLine("Count: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
dinosaurs.Clear();
Console.WriteLine("\nClear()");
Console.WriteLine("\nCount: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);

Clear () et TrimExcess ()

List<string> dinosaurs = new List<string>();
dinosaurs.Add("Triceratops");
dinosaurs.Add("Stegosaurus");
Console.WriteLine("Count: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
dinosaurs.Clear();
dinosaurs.TrimExcess();
Console.WriteLine("\nClear() and TrimExcess()");
Console.WriteLine("\nCount: {0}", dinosaurs.Count);
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
WorkSmarter
la source
5

vous pouvez le faire

var list = new List<string>();
list.Clear();
Kim Tranjan
la source
5

Vous pouvez utiliser la méthode claire

List<string> test = new List<string>();
test.Clear();
Swaff
la source
4

Vous avez besoin de la fonction Clear () sur la liste, comme ça.

List<object> myList = new List<object>();

myList.Add(new object()); // Add something to the list

myList.Clear() // Our list is now empty
Petits dieux
la source