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
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
var values = new string[] { "1", "2", "3" };
values.Select(x => Int32.Parse(x)).ToArray();
Int32.TryParse ist schneller die Int32.Parse –
Und das gibt nicht wirklich ein Array ... und ist nicht die "schnellste" (Frage) Weg, ein solches Array zu füllen. Aber anders als das ... –
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? –
iterieren und konvertieren.
Ich schlage vor, iterieren und int.TryParse()
Which one is faster in processing and conversion int.Parse(), int.TryParse(), Convert.Int32()
Siehe Microsoft Vergleich von Parse , TryParse and ConvertTo
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.
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;
}
}
}
Interessanter Punkt über ConvertAll, wusste das nicht! –
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();
string[] arr = new string[]{ "1", "2", "3" };
int[] lss = (from xx in arr
select Convert.ToInt32(xx)).ToArray();
die Elemente auf jeden Fall nur ganze Zahlen im String-Format sind? –
ja, nur ganze Zahlen –
Siehe http://stackoverflow.com/questions/1297231/convert-string-to-int-in-one-string-of-code-using-linq – abatishchev