Come convertire Elenco <stringa> in Elenco <int>?


157

La mia domanda fa parte di questo problema:

Ricevo una raccolta di ID da un modulo. Ho bisogno di ottenere le chiavi, convertirle in numeri interi e selezionare i record corrispondenti dal DB.

[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);
}

Risposte:


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

Eccezione sollevata: LINQ to Entities non riconosce il metodo "Int32 IndexOf (Char)" e questo metodo non può essere tradotto in un'espressione di archivio. .net 4.0
markthewizard1234

4
@ markthewizard1234 Ciò accadrà se il tuo listofIDsè un IQueryable<string>non eseguito. Eseguilo prima con ToList()la conversione:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck,

Sono sicuro che nel 2013 ha funzionato, ma non ha funzionato più per me. Aggiunta una nuova opzione di seguito usando l'istruzione linq.
Brandon Turpy,

1
Ciò genererà un'eccezione se una qualsiasi delle stringhe non è effettivamente ints. Vedi le versioni sicure in basso. stackoverflow.com/a/48712010/2340825
BA TabNabber

@MichaelHornfeck Il primo ToList dovrebbe essere AsEnumerable, non è necessario allocare un secondo Elenco
Ronan Thibaudau,

38

Utilizzando Linq ...

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

20

Ecco una variante sicura che filtra gli ints non validi:

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

Utilizza le nuove outvariabili introdotte con C # 7.0.

Quest'altra variante restituisce un elenco di interi nullable in cui nullvengono inserite voci per ints non validi (ovvero preserva il conteggio degli elenchi originali):

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

Grazie mille! Versione per C # 6.0 sotto stackoverflow.com/a/48712010/2340825
BA TabNabber

13

Utilizzando Linq:

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

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

12

Cosa no TryParse? Versione sicura di LINQ che filtra gli ints non validi (per C # 6.0 e precedenti):

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();

merito a Olivier Jacot-Descombes per l'idea e la versione C # 7.0.


3

So che è un vecchio post, ma ho pensato che fosse una buona aggiunta: puoi usarlo List<T>.ConvertAll<TOutput>

List<int> integers = strings.ConvertAll(s => Int32.Parse(s));

1

Questo è il modo più semplice, penso:

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

6
Vedo spesso questo tipo di pattern nelle espressioni lambda: x => someMethod (x) . Sai che probabilmente dovresti sostituirlo con someMethod . Con ciò il tuo esempio diventa listOfStrings.Select <string, int> (Convert.ToInt32); . È probabilmente più leggibile, più veloce, più breve e ho già menzionato più elegante? Lo stesso vale per tutti gli altri che rispondono a questa domanda.
JBSnorro,

Ricevo un errore quando ometto la sintassi della freccia. Funziona: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));ma non è così: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);l'errore è una chiamata ambigua tra le versioni string,int,inte string,intdi Select.
arrivederci,

1

Converti il ​​valore di stringa in un elenco intero

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

Un altro modo per ottenere ciò sarebbe usare un'istruzione linq. La risposta consigliata non ha funzionato per me in .NetCore2.0. Sono stato in grado di capirlo comunque e sotto funzionerebbe anche se si utilizza la tecnologia più 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

Puoi usarlo tramite LINQ

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

Sembra piuttosto dispendioso per TryParse, che ti dà il valore, quindi semplicemente lancia quel valore fuori dalla finestra per fare un Parse. Stai essenzialmente analizzando il doppio.
Ristogod,

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

0

Questo può essere eccessivo per questo semplice problema. Ma per i metodi Try-Do in connessione con Linq, tendo a usare classi anonime per un codice più espressivo. È simile alle risposte di 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
Considera di aggiungere alcune spiegazioni testuali sulla tua risposta, invece di fornire solo il codice.
carlosfigueira,

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

Ciao Patryk. Benvenuto in StackOverflow. Sarebbe meglio se potessi scrivere qualche altra descrizione sulla soluzione piuttosto concisa che hai pubblicato. Questa è la risposta a una domanda molto vecchia su questo sito Web e verrebbe esaminata da diversi utenti.
Aditya,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.