Convertir la chaîne en List <string> en une seule ligne?

102

J'ai une chaîne:

var names = "Brian,Joe,Chris";

Existe-t-il un moyen de convertir cela en un List<string>délimité par ,dans une ligne?

Brian David Berman
la source
15
Je ne comprends pas l'exigence «en une ligne». Cherchez à écrire du code clair et compréhensible, et non à insérer une opération dans un espace aussi petit que possible.
Ed S.
6
Avec l'avènement de LINQ, les "one liners" qui sont lisibles et propres sont devenus beaucoup plus courants dans C # IMO.
Matt Greer
5
@Ed S. - Bien que je sois d'accord sur le fait que "en une seule ligne" n'est peut-être pas la meilleure façon de le dire, les déclarations sur une seule ligne comme celle fournie par Matt Greer ont tendance à être très claires et compréhensibles. Je suppose qu'il veut simplement éviter d'utiliser une forboucle, qui est plus fastidieuse, sujette aux erreurs et peu claire.
StriplingWarrior
4
Je ne veux pas dire que les one-liners sont intrinsèquement plus difficiles à comprendre, je dis simplement que cela ne devrait jamais être une exigence. Faites-le de la meilleure façon possible. Si cela se trouve sur une seule ligne, c'est parfait, mais ce n'est pas quelque chose qui devrait façonner la façon dont vous écrivez votre code.
Ed S.

Réponses:

198
List<string> result = names.Split(new char[] { ',' }).ToList();

Ou même plus propre par la suggestion de Dan:

List<string> result = names.Split(',').ToList();
Matt Greer
la source
11
Vous l'avez peut-être mis là exprès, mais j'oublie toujours la new char[] { }partie entière . C'est plus lisible de cette façon, du moins pour moi .
Dan Tao
4
@Dan: Je suis d'accord, et généralement j'utilise la surcharge de paramètres. Mais pour une réponse à une question, j'ai parfois l'impression que la verbosité est meilleure. Juste une question d'opinion vraiment.
Matt Greer
2
ToList () ne semble plus être disponible?
Gina Marano
10
Avez-vous introduit l' System.LINQespace de noms?
Matt Greer
42

Le List<T>a un constructeur qui accepte un IEnumerable<T>:

List<string> listOfNames = new List<string>(names.Split(','));
Nathan Anderson
la source
Excellent - pas besoin d'importer System.Linq
VictorySaber
3

Je préfère cela car cela empêche une seule liste d'éléments avec un élément vide si votre chaîne source est vide:

  IEnumerable<string> namesList = 
      !string.isNullOrEmpty(names) ? names.Split(',') : Enumerable.Empty<string>();
KingOfHypocrites
la source
1
string given="Welcome To Programming";
List<string> listItem= given.Split(' ').ToList();//Split according to space in the string and added into the list

production:

Welcome

To 

Programming
Maghalakshmi Saravana
la source
0

Si vous disposez déjà d'une liste et souhaitez ajouter des valeurs à partir d'une chaîne délimitée, vous pouvez utiliser AddRangeou InsertRange. Par exemple:

existingList.AddRange(names.Split(','));
c32hedge
la source
0

Utilisez le package nuget Stringify.Library

//Default delimiter is ,
var split = new StringConverter().ConvertTo<List<string>>(names);

//You can also have your custom delimiter for e.g. ;
var split = new StringConverter().ConvertTo<List<string>>(names, new ConverterOptions { Delimiter = ';' });
Mithun Basak
la source