Cela pourrait aussi êtreList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog
2
Y a-t-il un besoin pour le new List<>?
LiquidPony
2
@LiquidPony no; vous pourriez appeler à la ToList()place; le résultat est essentiellement le même: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); vous devez faire l'un ou l'autre, cependant, car la valeur de retour de Select()est un IEnumerable<>, mais pas unList<>
phoog
@LiquidPony dans cette implémentation oui car l' Selectextension dans ce cas retourne IEnumerable<Int32>et ce n'est pas la liste. Cependant, list a un constructeur acceptant une autre collection comme source.
Oybek
8
Pour gérer le cas où les balises sont une chaîne vide, utilisezSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill
25
Si vous souhaitez inclure une validation simple et ignorer les valeurs non valides (au lieu de lever une exception), voici quelque chose qui utilise TryParse:
string csv ="1,2,3,4,a,5";int mos =0;var intList = csv.Split(',').Select(m =>{int.TryParse(m,out mos);return mos;}).Where(m => m !=0).ToList();//returns a list with integers: 1, 2, 3, 4, 5
EDIT: Voici une requête mise à jour basée sur les commentaires d'Antoine. Il appelle TryParse d'abord pour filtrer les mauvaises valeurs, puis Parse pour effectuer la conversion réelle.
string csv ="1,2,3,4,a,5,0,3,r,5";int mos =0;var intList = csv.Split(',').Where(m =>int.TryParse(m,out mos)).Select(m =>int.Parse(m)).ToList();//returns a list with integers: 1, 2, 3, 4, 5, 0, 3, 5
Edit 2: Une requête mise à jour pour C # 7.0, grâce aux commentaires de Charles Burns. Notez que nous nous débarrassons de la variable mos supplémentaire avec cette approche, donc c'est un peu plus propre.
J'ai apporté une modification à la réponse de khalid13. Si l'utilisateur mettait une chaîne de "0", sa réponse supprimerait cela de la liste résultante. J'ai fait quelque chose de similaire mais j'ai utilisé un objet anonyme.
var result = commaSeparatedString.Split(newchar[]{','},StringSplitOptions.RemoveEmptyEntries).Select(s =>new{ didConvert =int.TryParse(s.TrimNullProtection(),out convertedInt), convertedValue = convertedInt }).Where(w => w.didConvert).Select(s => s.convertedValue).ToList();
TrimNullProtection est une fonction personnalisée que j'ai créée qui protège si la chaîne est nulle.
Ce qui précède supprime toutes les chaînes qui n'ont pas pu être converties sans erreur. Si vous devez faire une erreur en cas de problème avec la conversion, la réponse acceptée devrait faire l'affaire.
Je suis tombé sur cela et je veux juste partager ma propre solution sans linq. Il s'agit d'une approche primitive. Les valeurs non entières ne seront pas ajoutées dans la liste également.
List<int>TagIds=newList<int>();string[] split = tags.Split(',');foreach(string item in split){int val =0;if(int.TryParse(item,out val)==true){TagIds.Add(val);}}
Réponses:
Voici une façon de procéder:
la source
List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
new List<>
?ToList()
place; le résultat est essentiellement le même:List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
vous devez faire l'un ou l'autre, cependant, car la valeur de retour deSelect()
est unIEnumerable<>
, mais pas unList<>
Select
extension dans ce cas retourneIEnumerable<Int32>
et ce n'est pas la liste. Cependant, list a un constructeur acceptant une autre collection comme source.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
Si vous souhaitez inclure une validation simple et ignorer les valeurs non valides (au lieu de lever une exception), voici quelque chose qui utilise TryParse:
EDIT: Voici une requête mise à jour basée sur les commentaires d'Antoine. Il appelle TryParse d'abord pour filtrer les mauvaises valeurs, puis Parse pour effectuer la conversion réelle.
Edit 2: Une requête mise à jour pour C # 7.0, grâce aux commentaires de Charles Burns. Notez que nous nous débarrassons de la variable mos supplémentaire avec cette approche, donc c'est un peu plus propre.
la source
int.TryParse(m, out int _)
Vous pouvez utiliser LINQ w /
int.Parse()
pour convertir lestring[]
en anIEnumerable<int>
, puis transmettre ce résultat auList<T>
constructeur:la source
Un petit LINQ va un long chemin:
la source
Sans requête LINQ, vous pouvez choisir cette méthode,
puis vous pouvez convertir cette liste en type entier ...
la source
.ToList<string>()
encore besoinusing System.Linq;
la source
.Select(x => x.Trim()
, car Parse coupe automatiquement tous les caractères d'espace pour vous.Si vous utilisez C # 3.5, vous pouvez utiliser Linq pour y parvenir
ou le court
la source
la source
J'ai apporté une modification à la réponse de khalid13. Si l'utilisateur mettait une chaîne de "0", sa réponse supprimerait cela de la liste résultante. J'ai fait quelque chose de similaire mais j'ai utilisé un objet anonyme.
TrimNullProtection est une fonction personnalisée que j'ai créée qui protège si la chaîne est nulle.
Ce qui précède supprime toutes les chaînes qui n'ont pas pu être converties sans erreur. Si vous devez faire une erreur en cas de problème avec la conversion, la réponse acceptée devrait faire l'affaire.
la source
Je suis tombé sur cela et je veux juste partager ma propre solution sans linq. Il s'agit d'une approche primitive. Les valeurs non entières ne seront pas ajoutées dans la liste également.
J'espère que cela t'aides.
la source
C'est simple. Divisez d'abord la chaîne. Supprimer l'espace vide présent après une virgule (,). Ensuite, utilisez ToList () définie par le système
Pour supprimer l'espace après «,» et convertir ce texte séparé par des virgules en liste
la source