Улучшение кода, чтобы превратить строку в массив чисел?


У меня есть строка чисел, как "31654918562314", и я хочу, чтобы преобразовать его в массив целых чисел. Код, который я написал:

string source = "31654918562314";
int[] numbers = new int[source.Length];
for (int i = 0; i < source.Length; i++)
{
    numbers[i] = Convert.ToInt32(source.Substring(i, 1));
}

Какие улучшения я могу применить этот код? Это лучший окончательный код, который я могу получить?

Примечание: Я использую c#. Однако, я также должен реализовать этот код в JavaScript.



3999
3
задан 15 октября 2011 в 09:10 Источник Поделиться
Комментарии
3 ответа

Я предпочитаю использовать здесь в LINQ. Джон имеет ли смысл на преобразования.

var str = "31654918562314";
var numbers = str.Select(c => c - '0').ToArray();

5
ответ дан 15 октября 2011 в 09:10 Источник Поделиться

Наиболее эффективный код будет использовать простой цикл и получить численное значение из кода символа:

string source = "31654918562314";
int[] numbers = new int[source.Length];
for (int i = 0; i < source.Length; i++) {
numbers[i] = source[i] - '0';
}

В JavaScript можно использовать charCodeAt способ сделать то же самое:

var source = '31654918562314';
var numbers = new Array(source.length);
for (var i = 0; i < source.length; i++) {
numbers[i] = source.charCodeAt(i) - 48;
}

В тесте производительности показывает, что с помощью charCodeAt в цикле составляет 10-30 раз быстрее, чем с помощью регулярного выражения и parseInt: http://jsperf.com/string-to-array-of-numbers

5
ответ дан 18 октября 2011 в 07:10 Источник Поделиться

В JavaScript

var arr = [];
var matches = "54321".match(/\d/g);
for (var index = 0; index < matches.length; ++index) {
arr.push(parseInt(matches[index], 10));
}

демо

Используя карту() метод:

var arr = "54321".match(/\d/g).map(function(m){
return parseInt(m, 10);
});

демо

4
ответ дан 15 октября 2011 в 01:10 Источник Поделиться