Isso também poderia serList<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
phoog
2
Existe uma necessidade para o new List<>?
LiquidPony
2
@LiquidPony no; você poderia ligar em ToList()vez disso; o resultado é essencialmente o mesmo: List<int> TagIds = tags.Split(',').Select(int.Parse).ToList(); Você precisa fazer um ou o outro, porém, porque o valor de retorno Select()é um IEnumerable<>, mas não umList<>
phoog
@LiquidPony nesta implementação sim, pois a Selectextensão nesse caso retorna IEnumerable<Int32>e não está na lista. No entanto, a lista tem um construtor que aceita outra coleção como fonte.
Oybek
8
Para lidar com o caso em que as tags é uma cadeia vazia, usoSplit(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
TrueWill
25
Se você deseja incluir alguma validação simples e pular valores inválidos (em vez de lançar uma exceção), aqui está algo que usa o 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: Aqui está uma consulta atualizada com base no feedback de Antoine. Ele chama o TryParse primeiro para filtrar quaisquer valores incorretos e, em seguida, o Parse para fazer a conversão real.
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
Edição 2: uma consulta atualizada para C # 7.0, graças aos comentários de Charles Burns. Observe que nos livramos da variável mos extra com essa abordagem, por isso é um pouco mais limpa.
Fiz uma modificação na resposta de khalid13. Se o usuário colocar uma sequência de "0", a resposta dele removerá isso da lista resultante. Fiz algo semelhante, mas usei um objeto anônimo.
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 é uma função personalizada que criei que protege se a cadeia de caracteres é nula.
O que o acima faz é remover quaisquer seqüências que não puderam ser convertidas sem erro. Se você precisar errar, se houver um problema com a conversão, a resposta aceita deve ser a solução.
Eu me deparei com isso e só quero compartilhar minha própria solução sem linq. Esta é uma abordagem primitiva. Valores não inteiros também não serão adicionados à lista.
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);}}
Respostas:
Aqui está uma maneira de fazer isso:
fonte
List<int> TagIds = new List<int>(tags.Split(',').Select(int.Parse));
new List<>
?ToList()
vez disso; o resultado é essencialmente o mesmo:List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
Você precisa fazer um ou o outro, porém, porque o valor de retornoSelect()
é umIEnumerable<>
, mas não umList<>
Select
extensão nesse caso retornaIEnumerable<Int32>
e não está na lista. No entanto, a lista tem um construtor que aceita outra coleção como fonte.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
Se você deseja incluir alguma validação simples e pular valores inválidos (em vez de lançar uma exceção), aqui está algo que usa o TryParse:
EDIT: Aqui está uma consulta atualizada com base no feedback de Antoine. Ele chama o TryParse primeiro para filtrar quaisquer valores incorretos e, em seguida, o Parse para fazer a conversão real.
Edição 2: uma consulta atualizada para C # 7.0, graças aos comentários de Charles Burns. Observe que nos livramos da variável mos extra com essa abordagem, por isso é um pouco mais limpa.
fonte
int.TryParse(m, out int _)
Você pode usar o LINQ w /
int.Parse()
para converter ostring[]
em umIEnumerable<int>
e depois passar esse resultado para oList<T>
construtor:fonte
Um pouco de LINQ percorre um longo caminho:
fonte
Sem a consulta LINQ, você pode escolher este método,
e então você pode converter essa lista em tipo inteiro ...
fonte
.ToList<string>()
ainda precisausing System.Linq;
fonte
.Select(x => x.Trim()
, pois o Parse apara automaticamente qualquer caractere de espaço para você.Se você estiver usando o C # 3.5, poderá usar o Linq para conseguir isso.
ou o curto
fonte
fonte
Fiz uma modificação na resposta de khalid13. Se o usuário colocar uma sequência de "0", a resposta dele removerá isso da lista resultante. Fiz algo semelhante, mas usei um objeto anônimo.
TrimNullProtection é uma função personalizada que criei que protege se a cadeia de caracteres é nula.
O que o acima faz é remover quaisquer seqüências que não puderam ser convertidas sem erro. Se você precisar errar, se houver um problema com a conversão, a resposta aceita deve ser a solução.
fonte
Eu me deparei com isso e só quero compartilhar minha própria solução sem linq. Esta é uma abordagem primitiva. Valores não inteiros também não serão adicionados à lista.
Espero que isto ajude.
fonte
É simples. Primeiro, divida a string. Apare o espaço em branco presente após vírgula (,). Em seguida, use o sistema definido ToList ()
Para remover o espaço após ',' e converter este texto separado por vírgula em Lista
fonte