У меня есть массив целых чисел в виде строки:
var arr = new string[] { "1", "2", "3", "4" };
Мне нужно массив "реальных" целых чисел, чтобы продвинуть его дальше:
void Foo(int[] arr) { .. }
Я попытался привести int, и это, конечно, не удалось:
Foo(arr.Cast<int>.ToArray());
Я могу сделать следующее:
var list = new List<int>(arr.Length);
arr.ForEach(i => list.Add(Int32.Parse(i))); // maybe Convert.ToInt32() is better?
Foo(list.ToArray());
или
var list = new List<int>(arr.Length);
arr.ForEach(i =>
{
int j;
if (Int32.TryParse(i, out j)) // TryParse is faster, yeah
{
list.Add(j);
}
}
Foo(list.ToArray());
но оба выглядят некрасиво.
Есть ли другие способы выполнить задачу?
c#
.net
linq
extension-methods
abatishchev
источник
источник
Ответы:
Для данного массива вы можете использовать
Array.ConvertAll
метод :Спасибо Marc Gravell за указание на то, что лямбда может быть опущена, что привело к более короткой версии, показанной ниже:
Решение LINQ аналогично, за исключением того, что вам понадобится дополнительный
ToArray
вызов для получения массива:источник
ConvertAll(arr, int.Parse)
достаточноArray.ConvertAll(arr, AddressOf Integer.Parse)
РЕДАКТИРОВАТЬ: преобразовать в массив
Это должно сделать трюк:
источник
Чтобы избежать исключений
.Parse
, вот несколько.TryParse
альтернатив.Чтобы использовать только элементы, которые могут быть проанализированы:
или
Использование альтернатив
0
для элементов, которые не могут быть проанализированы:или
C # 7.0 :
источник
var a = Enumerable.Range(0, arr.Length).Where(i => int.TryParse(arr[i], out i)).ToArray();
просто возвращает значения 0,1,2, ... вместо реальных значений. Какое здесь правильное решение?new int[0]
? Когда у меня есть текст, я не получаю0
в своем массиве ...new int[0]
- пустой массив int. Первые два примера пропускают значения, которые не могут быть проанализированы, а последние два примера используют0
значения, которые не могут быть проанализированы.new int[] {0}
. Спасибо.Вы можете просто привести массив строк в массив int:
источник
Dim converted = arr.Select(addressof Integer.Parse)
Необходимо убедиться, что вы не получаете
IEnumerable<int>
в качестве возвратаисточник
источник