web-dev-qa-db-fra.com

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 déconne? Qu'est-ce que TSource signifie?

84
BuddyJoe

Le problème est que vous appelez List<T>.Reverse() qui renvoie 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 coûteux, car inverser un IEnumerable<T> arbitraire implique de mettre toutes les données en mémoire tampon, puis de tout céder - alors que List<T> peut effectuer toutes les inversions "en place". (La différence ici est qu’elle appelle la méthode d’extension Enumerable.Reverse<T>() au lieu de la méthode d’instance List<T>.Reverse().)

Plus efficace encore, vous pourriez 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 mémoires tampons de taille inappropriée, au détriment de quatre instructions si on le fait ... Comme toujours, comparez lisibilité et performance dans le cas d'utilisation réel.

226
Jon Skeet

Je me rends compte que cette question est assez ancienne, mais j'avais 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);

StringSplitOptions supprime les enregistrements qui ne seraient que des caractères d'espace ...

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

Celui-ci fonctionne.

3
Rune Grimstad

Essaye ça:

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

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.

1
JaredPar

Si vous essayez de 

  1. Utiliser plusieurs délimiteurs 
  2. Filtrer les chaînes vides
  3. Couper les espaces de début/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());

Sortie

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

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

0
ablaze