2013-11-02 16 views
9

Ich möchte ein List<string> in ein List<int> konvertieren.Liste umwandeln <string> zu Liste <int> in C#

Hier ist mein Code:

void Convert(List<string> stringList) 
{ 
    List<int> intList = new List<int>(); 
    for (int i = 0; i < stringList.Count; i++) 
    { 
     intList.Add(int.Parse(stringList[i])); 
    } 
) 
+0

http://stackoverflow.com/a/199484/896341 Siehe auch. – Stefan

+0

Sie sollten die 'intList' irgendwie behalten. Es ist natürlich, 'void' in' intList' und 'return intList;' zu ändern. –

+0

@ user2939293 bist du ein Anfänger in csharp? –

Antwort

5

Mit Linq:

var intList = stringList.Select(x => int.Parse(x)).ToList(); 
+3

Da die Parameterliste links vom Lambdapfeil '=>' identisch mit der Parameterliste zur 'Parse' Methode ist, kann dies vereinfacht werden zu' ... .Select (int.Parse). ... '. –

+0

@Peter Kiss, Dies kann häufige Ausnahme von 'Eingabe String nicht im richtigen Format' .. – tariq

+0

Natürlich, aber vielleicht ist es kein Problem. Wer weiß? Vielleicht wäre das Problem, die Ausnahme mit einem falschen Rückgabewert wie -1 nach int.TryParse zu verstecken? –

1

Wenn Sie Linq nicht verwenden wollen (was ich zu verstehen immer schwer zu finden), ist Ihr Code sieht richtig, aber natürlich müssen Sie etwas zurückgeben:

List<int> Convert(List<string> stringList) 
{ 
    List<int> intList = new List<int>(); 

    for (int i = 0; i < stringList.Count; i++) 
    { 
     intList.Add(int.Parse(stringList[i])); 
    } 
    return intList; 
} 

Beachten Sie, dass dies eine Ausnahme auslösen wird, wenn die String-Liste s enthält etwas, das nicht als int analysiert werden kann.

Edit: Noch besser wäre es, verwenden Sie eine foreach-Schleife:

List<int> Convert(List<string> stringList) 
{ 
    List<int> intList = new List<int>(); 

    foreach(String s in stringList) 
    { 
     intList.Add(int.Parse(s)); 
    } 
    return intList; 
} 
+0

Das ist in Ordnung, aber natürlich ist es in diesem Fall natürlich, 'foreach' anstelle von' for' zu verwenden. Oder Linq, während du schreibst. –

+0

Richtig, habe meine Antwort bearbeitet und diesen noch besseren Ansatz hinzugefügt. – PMF

+0

Wenn Sie eine neue List-Instanz verwenden, um Elemente aus einer anderen Sammlung zu transformieren, die sich bereits im Speicher befindet, verwenden Sie Count() oder Length, um die neue Liste zu erstellen und ihre Größe anzugeben. Bei großen Sammlungen kann das Problem auftreten, dass immer mehr Platz für die Elemente in der neuen Liste reserviert wird (die neue Liste enthält nur ein leeres Array). –

0

Ihre Methode funktioniert gut, so dass ich gehe davon aus Sie ein Anfänger-Entwickler sind, die immer noch die Syntax der Sprache lernt. Ich werde Ihnen die erweiterte LINQ-Lösung noch nicht geben, aber Ihnen helfen, mit Ihrem aktuellen Code zu erreichen, was Sie wollen. Sie kehren zurück zur Zeit nicht die Liste, die Sie erstellen, so von der Methodensignatur ändern:

void Convert(List<string> stringList) 

zu:

List<int> Convert(List<string> stringList) 

und ganz am Ende, kurz bevor die Methode hinzufügen endet:

return intList; 

Dann in Ihrem Code können Sie es wie so nennen:

List<string> strings = new List<string> { "1", "2", "3" }; 
List<int> integers = this.Convert(strings); 

Hinweis: Wenn Sie nicht möchten, dass Ihr Code eine Ausnahme auslöst, kann ich Ihnen vorschlagen, TryParse anstelle von Parse zu verwenden, seien Sie jedoch vorsichtig, da diese Methode geringfügig anders funktioniert und out Parameter verwendet. Sie können mehr darüber erfahren here.

Wenn Sie sich für LINQ interessieren, ist die Lösung von @Peter Kiss so gut wie möglich. Er verwendet LINQ mit Methodensyntax, aber es gibt auch SQL-ähnliche Syntax, die Sie vielleicht nicht leichter finden können. Eine gute Einführung in LINQ finden Sie here.

+0

Ja, ich bin ein Anfänger. Ich möchte die Liste nicht zurückgeben. Ich möchte später in der Methode etwas damit machen, also benutze ich void. Ich habe bereits versucht, Liste integers = this.Convert (Strings); aber es wird nicht funktionieren. Aber danke für Ihre Hilfe – user2939293

12

Ich würde vorschlagen, TryParse() zu verwenden, falls einige der Werte nicht in int umwandelbar sind. Dafür habe ich eine Erweiterungsmethode erstellt. Unten ist mein Demo-LinqPad-Code.

void Main() 
{ 
    List<string> sourceList = new List<string> {"1", "2","3", "qwert","4", "5","6", "7","asdf", "9","100", "22"}; 
    //Dump is a LinqPad only method. Please ignore 
    sourceList.ConvertToInt().Dump(); 
} 

static public class HelperMethods 
{ 
    static public List<int> ConvertToInt(this List<string> stringList) 
    { 
     int x = 0; 
     var intList = stringList.Where(str => int.TryParse(str, out x)) 
           .Select (str => x) 
           .ToList(); 
     return intList; 

    } 
} 

In diesem Fall werden nur die numerischen int-Werte analysiert und der Rest wird ordnungsgemäß ignoriert. Sie könnten eine Fehlerbehandlung/Benachrichtigung einbauen, wenn Sie möchten.

/bearbeiten Basierend auf Peter Kiss' Vorschlag hier ist ein generischer Ansatz basiert auf der Schnittstelle IEnumerable.

static public IEnumerable<int> ConvertToInt(this IEnumerable<string> source) 
{ 
    int x = 0; 
    var result = source.Where(str => int.TryParse(str, out x)) 
         .Select (str => x); 

    return result;  
} 

Damit würden Sie nur AsEnumerable() nennen müssen vor dem Aufruf von ConvertToInt() Das Ergebnis natürlich vom Typ IEnumerable<Int32> und von hier aus auf, können Sie es leicht in eine Liste konvertieren, indem .ToList() oder unter Verwendung einen Arrays oder was auch immer Sie brauche an diesem Punkt.

+0

er ist ein Starter, warum verwirren Sie ihn durch die Verwendung von Erweiterungsmethoden, linq und alle ... –

+1

Diese Antwort ist nicht nur für das OP. Andere Benutzer suchen möglicherweise irgendwann nach einer Antwort und möchten diese möglicherweise mehrmals verwenden. Daher eine Erweiterungsmethode.Ich habe meinen ursprünglichen Kommentar gelöscht, da ich es für nicht angemessen hielt. Ich denke, dass diese Art und Weise es besser – Marco

+0

in diesem Fall Intro zu Kontravarianz wird auch hilfreich für alle sein .. http://msdn.microsoft.com/en-us/library/vstudio/ee207183.aspx –

-1

Wenn Ihr string eine Zeichenfolge hat, die nicht analysiert werden können, dann können Sie die Maske mit einem Standardfehler/ungültigen Wert von etwa -1, eher Ausnahme wie unten als Problem aufgetreten ist:

 List<string> stringList = new List<string>(); 
     stringList.AddRange(new string[] { "1", "2", "3", "4", "sdfsf", "7" }); // for illustration 
     int temp; 
     var yourIntegerList = stringList.Select(x => int.TryParse(x, out temp) ? int.Parse(x) : -1).ToList(); // -1 used here, can be any integer 

// Jetzt können Sie alle -1 ist entfernen

 yourIntegerList = yourIntegerList.Where(a => a != -1).ToList(); 
+0

Zwei Parsing kann zu einem Leistungsproblem führen und -1 kann Fehler in der Eingabeliste verbergen und kann ein ungültiges Ergebnis machen, wenn die Eingabe selbst String mit enthält Wert "-1". –

+0

@PeterKiss, uns allen fehlt etwas, nicht wahr? : D – tariq

+0

Vielleicht gibt es keine perfekte Lösung für solch ein einfaches Problem? : D –

0

Danke euch allen. Es ist fantastisch, wie viel Hilfe man hier bekommen kann! Ich löste das Problem schließlich, indem ich die String-Liste zu einem Array machte und dann das Array in int umwandelte. Vielleicht nicht die hellste Lösung, aber mein Code funktioniert jetzt. Ich werde später Ihre Vorschläge versuchen, um zu sehen, ob ich immer noch Liste anstelle von Array verwenden kann. Danke euch allen!

1

Verwenden Sie den folgenden Code ein:

int x = 0; 

var intList= stringList.Where(str => int.TryParse(str, out x)).Select(str => x).ToList(); 
Verwandte Themen