2008-11-24 12 views

Répondre

203

Le problème est que vous appelez List<T>.Reverse() qui retourne void.

Vous pouvez soit faire:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>(); 
names.Reverse(); 

ou:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>(); 

Ce dernier est plus cher, en inversant un IEnumerable<T> arbitraire implique tamponner toutes les données et qui donne tout - alors que List<T> peut faire tout le renversement "sur place". (La différence ici est que qu'il appelle la méthode d'extension Enumerable.Reverse<T>(), au lieu de la méthode d'instance List<T>.Reverse().)

Plus efficace encore, vous pouvez utiliser:

string[] namesArray = "Tom,Scott,Bob".Split(','); 
List<string> namesList = new List<string>(namesArray.Length); 
namesList.AddRange(namesArray); 
namesList.Reverse(); 

Cela évite de créer des tampons d'une taille inappropriée - au prix de prendre quatre déclarations où l'on va faire ... Comme toujours, peser la lisibilité contre la performance dans le cas d'utilisation réelle.

+21

skeet est une bête! – flesh

+2

bien élaboré, j'ai vraiment apprécié! –

1

Essayez ceci:

List<string> names = new List<string>("Tom,Scott,Bob".Split(',')); 
names.Reverse(); 
+0

Je reçois l'erreur - Impossible de convertir le type 'void' en 'System.Collections.Generic.List BuddyJoe

+1

Je viens de l'essayer et cela a fonctionné parfaitement – Yona

3
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList(); 

Celui-ci fonctionne.

1

Ce qui manque ici, c'est que .Reverse() est une méthode void. Il n'est pas possible d'affecter le résultat de .Reverse() à une variable. Vous pouvez toutefois modifier l'ordre d'utiliser Enumerable.Reverse() et obtenir votre résultat

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>() 

La différence est que Enumerable.Reverse() retourne un IEnumerable <T> au lieu d'être de retour vide

7

Je me rends compte que cette question est assez ancienne, mais j'ai eu un problème similaire, sauf que ma chaîne contenait des espaces. Pour ceux qui ont besoin de savoir comment séparer une chaîne avec plus que des virgules:

string str = "Tom, Scott, Bob"; 
    IList<string> names = str.Split(new string[] {","," "}, 
    StringSplitOptions.RemoveEmptyEntries); 

Les StringSplitOptions supprime les enregistrements qui ne serait qu'un caractère d'espace ...

+0

Cela ne fonctionnera pas si vous avez eu "Tom Cruise" à la place juste Tom – ablaze

+0

https://stackoverflow.com/a/45799171/799593 – ablaze

0

Si vous essayez de

  1. Utiliser plusieurs délimiteurs
  2. filtre toutes les chaînes vides
  3. garniture de premier plan/espaces de fin

devrait fonctionner:

string str = "Tom Cruise, Scott, ,Bob | at"; 
IEnumerable<string> names = str 
          .Split(new char[]{',', '|'}) 
          .Where(x=>x!=null && x.Trim().Length > 0) 
          .Select(x=>x.Trim()); 

Sortie

  • Tom Cruise
  • Scott
  • Bob
  • à

Maintenant, vous pouvez évidemment inverser l'ordre que d'autres ont suggéré.