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?

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.


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 ...


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.


1

Essaye ça:

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

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


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 utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.