2010-06-21 23 views
11

Welches ist die schnellste Methode, um das Array einer Zeichenkette ["1", "2", "3"] in ein int-Array [1,2,3] in C# zu konvertieren?konvertiere string [] in int []

danke

+2

die Elemente auf jeden Fall nur ganze Zahlen im String-Format sind? –

+0

ja, nur ganze Zahlen –

+0

Siehe http://stackoverflow.com/questions/1297231/convert-string-to-int-in-one-string-of-code-using-linq – abatishchev

Antwort

13
var values = new string[] { "1", "2", "3" }; 
values.Select(x => Int32.Parse(x)).ToArray(); 
+1

Int32.TryParse ist schneller die Int32.Parse –

+1

Und das gibt nicht wirklich ein Array ... und ist nicht die "schnellste" (Frage) Weg, ein solches Array zu füllen. Aber anders als das ... –

+1

Wie ist das die akzeptierte Antwort, wenn a) es eine andere Datenstruktur zu dem, was Sie gefragt haben, zurückgibt und b) Marc Gravell Antwort ist eine Größenordnung besser als je andere hier? –

1

iterieren und konvertieren.

1

Das ist kein schneller Weg, ich weiß, aber Sie können einen „kurzen Weg nutzen ":

var numbers = new[] {"1", "2", "3"}; 

var result = numbers.Select(s => int.Parse(s)); 
int[] resultAsArray = result.ToArray(); 

Und wenn Sie PLink verwenden, erhalten Sie Berechnen Sie die Werte parallel.

22
string[] arr1 = {"1","2","3"}; 
int[] arr2 = Array.ConvertAll(arr1, s => int.Parse(s)); 

Die Verwendung von Array.ConvertAll sicher (im Gegensatz zu LINQ Select/ToArray), dass das Array in der richtigen Größe initialisiert. Sie können möglich, einen Schatten schneller erhalten durch Abrollen, aber nicht viel:

int[] arr2 = new int[arr1.Length]; 
for(int i = 0 ; i < arr1.Length ; i++) { 
    arr2[i] = int.Parse(arr[i]); 
} 

Wenn Sie etwas brauchen, schneller noch (vielleicht Bulk-Datei/Datenverarbeitung), dann könnten Sie Ihre eigenen Parse-Schreiben helfen; Die eingebaute Los von Edge-Fällen - wenn Ihre Daten einfacher sind, können Sie wirklich ein wenig schneiden.


Ein Beispiel eines alternativen Parser:

public static unsafe int ParseBasicInt32(string s) 
    { 
     int len = s == null ? 0 : s.Length; 
     switch(s.Length) 
     { 
      case 0: 
       throw new ArgumentException("s"); 
      case 1: 
       { 
        char c0 = s[0]; 
        if (c0 < '0' || c0 > '9') throw new ArgumentException("s"); 
        return c0 - '0'; 
       } 
      case 2: 
       { 
        char c0 = s[0], c1 = s[1]; 
        if (c0 < '0' || c0 > '9' || c1 < '0' || c1 > '9') throw new ArgumentException("s"); 
        return ((c0 - '0') * 10) + (c1 - '0'); 
       } 
      default: 
       fixed(char* chars = s) 
       { 
        int value = 0; 
        for(int i = 0; i < len ; i++) 
        { 
         char c = chars[i]; 
         if (c < '0' || c > '9') throw new ArgumentException("s"); 
         value = (value * 10) + (c - '0'); 
        } 
        return value; 
       } 
     } 
    } 
+1

Interessanter Punkt über ConvertAll, wusste das nicht! –

2

würde ich wahrscheinlich tun:

string[] array = new[] { "1", "2" }; // etc. 
int[] ints = array.Select(x => int.Parse(x)).ToArray(); 

, wenn ich, dass die Daten nur ganze Zahlen wären garantieren.

wenn nicht:

string[] array = new[] { "1", "2" }; // etc. 
List<int> temp = new List<int>(); 
foreach (string item in array) 
{ 
    int parsed; 
    if (!int.TryParse(item, out parsed)) 
    { 
     continue; 
    } 

    temp.Add(parsed); 
} 

int[] ints = temp.ToArray(); 
1
string[] arr = new string[]{ "1", "2", "3" }; 
int[] lss = (from xx in arr 
      select Convert.ToInt32(xx)).ToArray();