Como converter List <string> em List <int>?


157

Minha pergunta faz parte deste problema:

Eu recebo uma coleção de IDs de um formulário. Preciso pegar as chaves, convertê-las em números inteiros e selecionar os registros correspondentes do banco de dados.

[HttpPost]
public ActionResult Report(FormCollection collection)
{
    var listofIDs = collection.AllKeys.ToList();  
    // List<string> to List<int>
    List<Dinner> dinners = new List<Dinner>();
    dinners= repository.GetDinners(listofIDs);
    return View(dinners);
}

Respostas:


390
listofIDs.Select(int.Parse).ToList()

Exceção gerada - LINQ to Entities não reconhece o método 'Int32 IndexOf (Char)', e esse método não pode ser convertido em uma expressão de armazenamento. .net 4.0
markthewizard1234

4
@ markthewizard1234 Isso acontecerá se você listofIDsé um IQueryable<string>que não foi executado. Execute-o primeiro ToList()antes de fazer a conversão:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck 13/06

Tenho certeza que em 2013 isso funcionou, mas isso não funcionou mais para mim. Adicionada uma opção mais recente abaixo usando a instrução linq.
precisa saber é o seguinte

1
Isso gerará uma exceção se alguma das strings não for realmente ints. Veja as versões seguras abaixo. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck O primeiro ToList deve ser AsEnumerable, não há necessidade de alocar uma segunda lista
Ronan Thibaudau

38

Usando Linq ...

List<string> listofIDs = collection.AllKeys.ToList();  
List<int> myStringList = listofIDs.Select(s => int.Parse(s)).ToList();

20

Aqui está uma variante segura que filtra entradas inválidas:

List<int> ints = strings
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
    .Where(n => n.HasValue)
    .Select(n => n.Value)
    .ToList();

Ele usa as novas outvariáveis ​​introduzidas no C # 7.0.

Essa outra variante retorna uma lista de nullentradas anuláveis ​​nas quais são inseridas entradas para entradas inválidas (ou seja, preserva a contagem da lista original):

List<int?> nullableInts = strings
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
    .ToList();

Muito obrigado! Versão para C # 6.0 abaixo stackoverflow.com/a/48712010/2340825
BA TabNabber

13

Usando o Linq:

var intList = stringList.Select(s => Convert.ToInt32(s)).ToList()

1
var intList = stringList.Select (Convert.ToInt32) .ToList ()
shivani

12

O que não TryParse? Versão segura do LINQ que filtra entradas inválidas (para C # 6.0 e abaixo):

List<int>  ints = strings
    .Select(s => { int i; return int.TryParse(s, out i) ? i : (int?)null; })
    .Where(i => i.HasValue)
    .Select(i => i.Value)
    .ToList();

Agradecemos a Olivier Jacot-Descombes pela idéia e pela versão C # 7.0.



1

Essa é a maneira mais simples, eu acho:

var listOfStrings = (new [] { "4", "5", "6" }).ToList();
var listOfInts = listOfStrings.Select<string, int>(q => Convert.ToInt32(q));

6
Eu vejo esse tipo de padrão nas expressões lambda frequentemente: x => someMethod (x) . Você sabe que provavelmente deveria substituí-lo por someMethod . Com isso, seu exemplo se torna listOfStrings.Select <string, int> (Convert.ToInt32); . Provavelmente é mais legível, mais rápido, mais curto e eu já mencionei mais elegante? O mesmo vale para todos os outros que responderem a essa pergunta.
JBSnorro

Estou recebendo um erro ao omitir a sintaxe da seta. Isso funciona: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));mas não: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);O erro é uma chamada ambígua entre string,int,inte as string,intversões do Select.
11594 goodeye

1

Converter valor da string em lista inteira

var myString = "010"; 
int myInt;
List<int> B = myString.ToCharArray().Where(x => int.TryParse(x.ToString(), out myInt)).Select(x => int.Parse(x.ToString())).ToList();

0

Outra maneira de conseguir isso seria usar uma instrução linq. A resposta recomendada não funcionou para mim no .NetCore2.0. Eu era capaz de descobrir no entanto e abaixo também funcionaria se você estiver usando uma tecnologia mais recente.

[HttpPost]
public ActionResult Report(FormCollection collection)
{
    var listofIDs = collection.ToList().Select(x => x.ToString());
    List<Dinner> dinners = new List<Dinner>();
    dinners = repository.GetDinners(listofIDs);
    return View(dinners);
}

0

Você pode usá-lo via LINQ

     var selectedEditionIds = input.SelectedEditionIds.Split(",").ToArray()
                            .Where(i => !string.IsNullOrWhiteSpace(i) 
                             && int.TryParse(i,out int validNumber))
                            .Select(x=>int.Parse(x)).ToList();

Parece um grande desperdício para o TryParse, que fornece o valor e, em seguida, simplesmente jogue esse valor pela janela para fazer uma análise. Você é essencialmente dupla análise.
Ristogod 27/09/19

0
intList = Array.ConvertAll(stringList, int.Parse).ToList();

0

Isso pode ser um exagero para esse problema simples. Mas para os métodos Try-Do em conexão com o Linq, eu costumo usar classes anônimas para código mais expressivo. É semelhante às respostas de Olivier Jacot-Descombes e BA TabNabber :

List<int> ints = strings
    .Select(idString => new { ParseSuccessful = Int32.TryParse(idString, out var id), Value = id })
    .Where(id => id.ParseSuccessful)
    .Select(id => id.Value)
    .ToList();

-1
  public List<int> ConvertStringListToIntList(List<string> list) 
  {
     List<int> resultList = new List<int>();
     for (int i = 0; i < list.Count; i++)
        resultList.Add(Convert.ToInt32(list[i]));

     return resultList;
  }

3
Considere adicionar alguma explicação textual sobre sua resposta, em vez de fornecer apenas o código.
Carlosfigueira

-1
yourEnumList.Select(s => (int)s).ToList()

Oi Patryk. Bem-vindo ao StackOverflow. Seria melhor se você pudesse escrever um pouco mais de descrição sobre a solução bastante concisa que postou. Esta é a resposta a uma pergunta muito antiga deste site e seria analisada por vários usuários.
Aditya
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.