Syntaxe C # - Diviser la chaîne en tableau par virgule, convertir en liste générique et ordre inverse

92

Quelle est la syntaxe correcte pour cela:

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

Que suis-je en train de gâcher? Que signifie TSource?

BuddyJoe
la source

Réponses:

252

Le problème est que vous appelez List<T>.Reverse()qui revient 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, car l'inversion d'un arbitraire IEnumerable<T>implique la mise en mémoire tampon de toutes les données, puis la cession de tout - alors que vous List<T>pouvez faire tout l'inversion «sur place». (La différence ici est qu'il appelle la Enumerable.Reverse<T>()méthode d'extension, au lieu de la List<T>.Reverse()méthode d'instance.)

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 de taille inappropriée - au prix de prendre quatre instructions là où on fera l'affaire ... Comme toujours, comparez la lisibilité aux performances dans le cas d'utilisation réel.

Jon Skeet
la source
25
skeet est une bête!
chair
2
bien élaboré, j'ai vraiment apprécié!
Gaurav Aroraa
11

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

Le StringSplitOptions supprime les enregistrements qui ne seraient qu'un caractère d'espace ...

Des Horsley
la source
Cela ne fonctionnera pas si vous aviez "Tom Cruise" au lieu de Tom
feu
4
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

Celui-ci fonctionne.

Rune Grimstad
la source
1

Essaye ça:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();
Yona
la source
J'obtiens l'erreur - Impossible de convertir implicitement le type 'void' en 'System.Collections.Generic.List <string>
BuddyJoe
1

Ce que vous manquez 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 cependant modifier l'ordre pour utiliser Enumerable.Reverse () et obtenir votre résultat

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

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

JaredPar
la source
1

Si vous essayez de

  1. Utiliser plusieurs délimiteurs
  2. Filtrer toutes les chaînes vides
  3. Découper les espaces de début / de fin

ce qui suit 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());

Production

  • À M
  • Croisière
  • Scott
  • Bob
  • à

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

en feu
la source