Quelle est la méthode la plus rapide pour convertir un tableau d'une chaîne ["1", "2", "3"] dans un tableau d'int [1,2,3] en C#?convertir la chaîne [] en int []
merci
Quelle est la méthode la plus rapide pour convertir un tableau d'une chaîne ["1", "2", "3"] dans un tableau d'int [1,2,3] en C#?convertir la chaîne [] en int []
merci
var values = new string[] { "1", "2", "3" };
values.Select(x => Int32.Parse(x)).ToArray();
Int32.TryParse est plus rapide le Int32.Parse –
Et cela ne donne pas réellement un tableau ... et n'est pas la manière "la plus rapide" (question) de peupler un tel tableau. Mais à part ça ... –
Comment est-ce la réponse acceptée quand a) elle renvoie une structure de données différente de celle que vous avez demandée et b) la réponse de Marc Gravell est-elle d'un ordre de grandeur meilleur que jamais? –
et de convertir.
Je propose à itérer et int.TryParse()
Which one is faster in processing and conversion int.Parse(), int.TryParse(), Convert.Int32()
Voir la comparaison Microsoft Parse , TryParse and ConvertTo
Le pas est moyen rapide, je sais, mais vous pouvez utiliser un « court chemin ":
var numbers = new[] {"1", "2", "3"};
var result = numbers.Select(s => int.Parse(s));
int[] resultAsArray = result.ToArray();
Et si vous utilisez PLink vous arrivez à calculer les valeurs en parallèle.
string[] arr1 = {"1","2","3"};
int[] arr2 = Array.ConvertAll(arr1, s => int.Parse(s));
L'utilisation de Array.ConvertAll
assure (contrairement à LINQ Select
/ToArray
) que le tableau est initialisé à la bonne taille. Vous pouvez obtenir un possible ombre plus rapide en déroulant, mais pas beaucoup:
int[] arr2 = new int[arr1.Length];
for(int i = 0 ; i < arr1.Length ; i++) {
arr2[i] = int.Parse(arr[i]);
}
Si vous avez besoin quelque chose encore plus rapide (fichier peut-être en vrac/traitement des données), puis d'écrire votre propre analyse syntaxique peut aider; l'intégré gère un lot de bord-cas - si vos données sont plus simples, vous pouvez vraiment réduire un peu.
Pour un exemple d'un analyseur alternatif:
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;
}
}
}
point intéressant sur ConvertAll, ne le savais pas! –
Je ferais probablement:
string[] array = new[] { "1", "2" }; // etc.
int[] ints = array.Select(x => int.Parse(x)).ToArray();
si je pouvais garantir que les données ne seraient que des nombres entiers.
sinon:
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();
sont les éléments certainement que des entiers en format de chaîne? –
oui, seulement les entiers –
Voir http://stackoverflow.com/questions/1297231/convert-string-to-int-in-one-string-of-code-using-linq – abatishchev