Dividir string, converter ToList <int> () em uma linha

191

Eu tenho uma string que tem números

string sNumbers = "1,2,3,4,5";

Eu posso dividi-lo e convertê-lo em List<int>

sNumbers.Split( new[] { ',' } ).ToList<int>();

Como posso converter um array de strings para uma lista inteira? Para que eu possa converter string[]paraIEnumerable

uzay95
fonte
Tivemos exatamente a mesma pergunta hoje: Clique me
Dario
3
em "uma linha" si muito forte é um requisito muito rigoroso! </perl>
dfa
2
Esta pergunta diz especificamente para dividir uma sequência de números, o que mantém a resposta simples. A pergunta que Dario mencionou trata dos problemas do TryParse para seqüências de caracteres gerais.
goodeye 6/03/2013

Respostas:

463
var numbers = sNumbers.Split(',').Select(Int32.Parse).ToList();
mqp
fonte
4
Isso obtém exceção quando a lista tem valor vazio ou nulo.
Sayed Muhammad Idrees -
@ SayedM.Idrees basta verificar nulo ou vazio antes de dividir.
RAVI VAGHELA
31

Você também pode fazer isso dessa maneira sem a necessidade do Linq:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );

// Uses Linq
var numbers = Array.ConvertAll(sNumbers.Split(','), int.Parse).ToList();
Joze
fonte
18

O caminho de Joze também precisa de LINQ, ToList()está no System.Linqespaço para nome.

Você pode converter a matriz em lista sem Linq, passando a matriz para o construtor List:

List<int> numbers = new List<int>( Array.ConvertAll(sNumbers.Split(','), int.Parse) );
yuxio
fonte
17

Melhor uso int.TryParsepara evitar exceções;

var numbers = sNumbers
            .Split(',')
            .Where(x => int.TryParse(x, out _))
            .Select(int.Parse)
            .ToList();
aozogul
fonte
10

Também é possível int array para atribuir valor diretamente.

como isso

int[] numbers = sNumbers.Split(',').Select(Int32.Parse).ToArray();
Mukesh Kalgude
fonte
4

Também você pode usar este método de extensão

public static List<int> SplitToIntList(this string list, char separator = ',')
{
    return list.Split(separator).Select(Int32.Parse).ToList();
}

uso:

var numberListString = "1, 2, 3, 4";
List<int> numberList = numberListString.SplitToIntList(',');
Pcodea Xonos
fonte
3

No Unity3d, int.Parsenão funciona bem. Então eu uso como abaixo.

List<int> intList = new List<int>( Array.ConvertAll(sNumbers.Split(','),
 new Converter<string, int>((s)=>{return Convert.ToInt32(s);}) ) );

Espero que esta ajuda para usuários do Unity3d.

HyoJin KIM
fonte
3

Você pode usar os novos recursos de idioma do C # 6.0:

  • substituir delegado (s) => { return Convert.ToInt32(s); }pelo grupo de métodos correspondenteConvert.ToInt32
  • substituir chamada de construtor redundante: new Converter<string, int>(Convert.ToInt32)por:Convert.ToInt32

O resultado será:

var intList = new List<int>(Array.ConvertAll(sNumbers.Split(','), Convert.ToInt32));
Adrian Filip
fonte
2

Meu problema foi semelhante, mas com a inconveniência de que algumas vezes a string contém letras (algumas vezes vazias).

string sNumbers = "1,2,hh,3,4,x,5";

Tentando seguir o método de extensão Pcode Xonos:

public static List<int> SplitToIntList(this string list, char separator = ',')
{
      int result = 0;
      return (from s in list.Split(',')
              let isint = int.TryParse(s, out result)
              let val = result
              where isint
              select val).ToList(); 
}
Carlos Toledo
fonte
1
Obrigado, embora você declare um separador e não o use.
Hugo Delsing
-2

Você pode usar isto:

List<Int32> sNumberslst = sNumbers.Split(',').ConvertIntoIntList();
Charanjot
fonte
2
Bem-vindo ao Stack Overflow! Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não saber os motivos da sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, pois isso reduz a legibilidade do código e das explicações!
Adeus StackExchange
2
A função ConvertIntoIntList não sai.
Federico Navarrete
Além disso, você precisa adicionar a seguinte classe: classe pública estática HelperMethods {lista pública estática <int> ConvertIntoIntList (esta string [] stringList) {int x = 0; Você pode usar o seguinte método: var intList = stringList.Where (str => int.TryParse (str, out x)). Selecione (str => x) .ToList (); return intList; }}
Federico Navarrete