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:
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.
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 ...
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();
Celui-ci fonctionne.
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
Si vous essayez de
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
Maintenant, vous pouvez évidemment inverser l'ordre comme d'autres l'ont suggéré.