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

Antworten:


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

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

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

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

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.


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

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

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

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

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

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

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

-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
Fügen Sie möglicherweise eine Texterklärung zu Ihrer Antwort hinzu, anstatt nur Code bereitzustellen.
Carlosfigueira

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.