Como posso converter uma string separada por vírgula em uma Lista <int>

Respostas:

433

Aqui está uma maneira de fazer isso:

List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
dasblinkenlight
fonte
11
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.

string csv = "1,2,3,4,a,5,0,3,r,5";
var intList = csv.Split(',')
                 .Where(m => int.TryParse(m, out _))
                 .Select(m => int.Parse(m))
                 .ToList();
khalid13
fonte
1
Falha se 0 for uma entrada legítima!
Antoine Meltzheim
2
Com C # 7.0 você pode omitir a declaração de mos e substituir a chamada TryParse comint.TryParse(m, out int _)
Charles Burns
14

Você pode usar o LINQ w / int.Parse()para converter o string[]em um IEnumerable<int>e depois passar esse resultado para o List<T>construtor:

var tagIds = new List<int>(tags.Split(',').Select(s => int.Parse(s)));
Justin Niessner
fonte
8

Um pouco de LINQ percorre um longo caminho:

 List<int> TagIds = tags.Split(',')
         .Select(t => int.Parse(t))
         .ToList();
Henk Holterman
fonte
6

Sem a consulta LINQ, você pode escolher este método,

string tags = "9,3,12,43,2";
List<string> numbers = nos.Split(',').ToList<string>();

e então você pode converter essa lista em tipo inteiro ...


fonte
apenas uma nota para quem não = familiares .ToList<string>()ainda precisausing System.Linq;
Bill Rawlinson
4
string tags = "9,3,12,43,2"

List<int> TagIds = tags.Split(',').Select(x => x.Trim()).Select(x=> Int32.Parse(x)).ToList();
Oybek
fonte
2
De acordo com docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/…, você não precisa adicionar .Select(x => x.Trim(), pois o Parse apara automaticamente qualquer caractere de espaço para você.
Phillip Quinlan
2

Se você estiver usando o C # 3.5, poderá usar o Linq para conseguir isso.

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(s=>int.Parse(s)).ToList();

ou o curto

string tags = "9,3,12,43,2";
List<int> tagIds = tags.Split(',').Select(int.Parse).ToList();
Agustin Meriles
fonte
2
string tags = "9,3,12,43,2";
List<int> TagIds = tags.Split(',').Select(int.Parse).ToList();
LiquidPony
fonte
1

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(new char[] { ',' }, 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.

SolidSnake4444
fonte
1

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 = new List<int>();
string[] split = tags.Split(',');
foreach (string item in split)
{
    int val = 0;
    if (int.TryParse(item, out val) == true)
    {
        TagIds.Add(val);
    }
}

Espero que isto ajude.

drchanix
fonte
-2

É simples. Primeiro, divida a string. Apare o espaço em branco presente após vírgula (,). Em seguida, use o sistema definido ToList ()

string TradeTypeEnum = "Physical Deal, Physical Concentrate"

Para remover o espaço após ',' e converter este texto separado por vírgula em Lista

List<string> IDs = (TradeTypeEnum.Split(',')).Select(t => t.Trim()).ToList();
Parag555
fonte