Wie konvertiere ich List <string> in List <int>?

157

Meine Frage ist Teil dieses Problems:

Ich erhalte eine Sammlung von Ausweisen aus einem Formular. Ich muss die Schlüssel abrufen, sie in Ganzzahlen konvertieren und die passenden Datensätze aus der Datenbank auswählen.

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

Antworten:

390
listofIDs.Select(int.Parse).ToList()
vcsjones
quelle
Ausnahme ausgelöst - LINQ to Entities erkennt die Methode 'Int32 IndexOf (Char)' nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden. .net 4.0
markthewizard1234
4
@ markthewizard1234, was geschehen wird , wenn Ihr listofIDseine ist , IQueryable<string>die nicht ausgeführt wurde. Führen Sie es zuerst mit aus, ToList()bevor Sie die Konvertierung durchführen:listofIDs.ToList().Select(int.Parse).ToList()
Michael Hornfeck
Ich bin mir sicher, dass dies 2013 funktioniert hat, aber das hat bei mir nicht mehr funktioniert. Eine neuere Option wurde unten mit der linq-Anweisung hinzugefügt.
Brandon Turpy
1
Dies löst eine Ausnahme aus, wenn eine der Zeichenfolgen keine Ints sind. Siehe die sicheren Versionen unten. stackoverflow.com/a/48712010/2340825
BA TabNabber
@ MichaelHornfeck Die erste ToList sollte AsEnumerable sein, keine Notwendigkeit, eine zweite Liste zuzuweisen
Ronan Thibaudau
38

Verwenden von Linq ...

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

Hier ist eine sichere Variante, die ungültige Ints herausfiltert:

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

Es verwendet die neuen outVariablen, die mit C # 7.0 eingeführt wurden.

Diese andere Variante gibt eine Liste von nullbaren Ints zurück, in die nullEinträge für ungültige Ints eingefügt werden (dh die ursprüngliche Listenanzahl bleibt erhalten):

List<int?> nullableInts = strings
    .Select(s => Int32.TryParse(s, out int n) ? n : (int?)null)
    .ToList();
Olivier Jacot-Descombes
quelle
Vielen Dank! Version für C # 6.0 unter stackoverflow.com/a/48712010/2340825
BA TabNabber
13

Verwenden von Linq:

var intList = stringList.Select(s => Convert.ToInt32(s)).ToList()
Steve Hobbs
quelle
1
var intList = stringList.Select (Convert.ToInt32) .ToList ()
Shivani
12

Was kein TryParse? Sichere LINQ-Version , die ungültige Ints herausfiltert (für C # 6.0 und niedriger):

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

Dank an Olivier Jacot-Descombes für die Idee und die C # 7.0-Version.

BA TabNabber
quelle
3

Ich weiß, dass es ein alter Beitrag ist, aber ich dachte, dies ist eine gute Ergänzung: Sie können verwenden List<T>.ConvertAll<TOutput>

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

Dies ist der einfachste Weg, denke ich:

var listOfStrings = (new [] { "4", "5", "6" }).ToList();
var listOfInts = listOfStrings.Select<string, int>(q => Convert.ToInt32(q));
Glenn Ferrie
quelle
6
Ich sehe diese Art von Muster oft in Lambda-Ausdrücken: x => someMethod (x) . Sie wissen, dass Sie das wahrscheinlich durch someMethod ersetzen sollten . Damit wird Ihr Beispiel zu listOfStrings.Select <string, int> (Convert.ToInt32); . Das ist wahrscheinlich lesbarer, schneller, kürzer und habe ich schon eleganter erwähnt? Gleiches gilt für alle anderen, die diese Frage beantworten.
JBSnorro
Beim Auslassen der Pfeilsyntax wird eine Fehlermeldung angezeigt. Dies funktioniert: List<string> sss = new List<string>(); IEnumerable<int> test1 = sss.Select<string, int>(x => Convert.ToInt32(x));aber nicht: IEnumerable<int> test2 = sss.Select<string, int>(Convert.ToInt32);Der Fehler ist ein mehrdeutiger Aufruf zwischen demstring,int,int und der string,intVersion von Select.
Goodeye
1

Konvertieren Sie den Zeichenfolgenwert in eine Ganzzahlliste

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();
Payal_Thakur
quelle
0

Eine andere Möglichkeit, dies zu erreichen, wäre die Verwendung einer linq-Anweisung. Die empfohlene Antwort hat in .NetCore2.0 bei mir nicht funktioniert. Ich konnte es jedoch herausfinden und unten würde auch funktionieren, wenn Sie neuere Technologie verwenden.

[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);
}
Brandon Turpy
quelle
0

Sie können es über LINQ verwenden

     var selectedEditionIds = input.SelectedEditionIds.Split(",").ToArray()
                            .Where(i => !string.IsNullOrWhiteSpace(i) 
                             && int.TryParse(i,out int validNumber))
                            .Select(x=>int.Parse(x)).ToList();
Abdus Salam Azad
quelle
Scheint TryParse ziemlich verschwenderisch, was Ihnen den Wert gibt, dann werfen Sie diesen Wert einfach aus dem Fenster, um dann eine Analyse durchzuführen. Sie analysieren im Wesentlichen doppelt.
Ristogod
0
intList = Array.ConvertAll(stringList, int.Parse).ToList();
Xing Guo
quelle
0

Dies kann für dieses einfache Problem übertrieben sein. Bei Try-Do-Methoden in Verbindung mit Linq verwende ich jedoch eher anonyme Klassen für ausdrucksstärkeren Code. Es ähnelt den Antworten von Olivier Jacot-Descombes und 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();
Fabian
quelle
-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;
  }
Diego Dias
quelle
3
Fügen Sie möglicherweise eine Texterklärung zu Ihrer Antwort hinzu, anstatt nur Code bereitzustellen.
Carlosfigueira
-1
yourEnumList.Select(s => (int)s).ToList()
Patryk Zawieja
quelle
Hallo Patryk. Willkommen bei StackOverflow. Es wäre besser, wenn Sie etwas mehr Beschreibung über die ziemlich prägnante Lösung schreiben könnten, die Sie veröffentlicht haben. Dies ist die Antwort auf eine sehr alte Frage auf dieser Website und wird von mehreren Benutzern überprüft.
Aditya