89 votes

Syntaxe C # - Scinder une chaîne en tableau par virgule, convertir en liste générique et inverser l'ordre

Quelle est la syntaxe correcte pour cela:

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

Qu'est-ce que je fous? Que signifie TSource?

245voto

Jon Skeet Points 692016

Le problème, c'est que vous appelez List<T>.Reverse() qui renvoie void.

Vous pouvez soit le 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, comme l'inversion de l'arbitraire IEnumerable<T> implique la mise en mémoire tampon toutes les données et puis ce qui donne tout, alors qu' List<T> peut faire toutes les renverser "en place". (La différence ici est que c'est l'appel de la Enumerable.Reverse<T>() méthode d'extension, au lieu de l' 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 les buffers de taille inappropriée - au prix de quatre états où l'on va faire... Comme jamais, de juger de la lisibilité à l'encontre de la performance dans le réel de cas d'utilisation.

10voto

Iconiq Points 89

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 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 prend supprime les enregistrements qui ne seraient qu'un caractère espace ...

3voto

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

Celui-ci fonctionne.

1voto

Yona Points 5205

Essaye ça:

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

1voto

JaredPar Points 333733

Ce qui vous manque ici, c'est que .Reverse () est une méthode vide. Il n'est pas possible d'assigner 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 IEnumerable <T> au lieu d’être vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X