как преобразовать строковый массив в нулевой массив целых чисел.
Преобразовать строку [] в int? []
Ответ 1
Ну, два аспекта:
- Как вы преобразовываете массив из одного типа в другой?
- Как вы преобразовываете строку в nullable int?
Первое простое - вы можете использовать Array.ConvertAll
, передавая делегат Converter
. Также существует способ LINQ (x.Select(...).ToArray()
), но это немного менее эффективно, если вы знаете, что у вас есть массив, и вы хотите, чтобы массив вышел из другого конца 1.
string
to int?
, вероятно, лучше всего сделать в методе. Вы можете сделать это в анонимной функции, но в этом конкретном случае я бы использовал отдельный метод. Мне редко нравится объявлять переменные в анонимной функции.
public static int? TryParseInt32(string text)
{
int value;
return int.TryParse(text, out value) ? value : (int?) null;
}
Чтобы ответить на комментарий, да, вам нужно использовать листинг 2.
или без условного:
public static int? TryParseInt32(string text)
{
int value;
if (int.TryParse(text, out value))
{
return value;
}
else
{
return null;
}
}
Соедините их следующим образом:
string[] x = {"15", "10", "hello", "5" };
int?[] y = Array.ConvertAll(x, TryParseInt32);
1Array.ConvertAll
более эффективен, чем x.Select().ToArray()
, потому что он имеет больше информации. Он может сразу создать конечный массив - не требуется изменение размера. Вызов Enumerable.ToArray()
(с результатом Select()
) не имеет одинаковой информации, поэтому он должен добавить результаты к List<T>
(потенциально изменяя несколько раз по пути), а затем обычно изменять размер в конце также. (На самом деле он не использует List<T>
, но понятия одинаковы.) Это определенно стоит знать о решении Select/ToArray, но я не думаю, что в этом случае он будет более читабельным, чем ConvertAll
, поэтому вы может также использовать более эффективную форму.
2 Причина, по которой вам нужен приведение в условном выражении, заключается в том, что компилятор не знает, какой тип "нуль" вы действительно имеете в виду, но он знает, что он не может преобразовать из null
до int
. Тип условного выражения должен быть либо типом второго операнда, либо типом третьего операнда, а другой должен быть неявно конвертируемым. Заставляя третий операнд иметь тип int?
здесь все в порядке - потому что вы можете неявно конвертировать из int
в int?
. Обратите внимание, что компилятор не использует то, как вы используете выражение, чтобы попытаться определить тип. Другой альтернативой является использование new int?()
вместо null
.
Ответ 2
Разбираем и используем Linq:
string[] input = { "1", "3", "x" }
var result = input.Select(
s => { int i; return (int.TryParse(s, out i)) ? i : (int?) null; }).ToArray();
... но я признаю, что это немного загадочно. Я бы не использовал здесь лямбда-выражение. Для ясности это должно принадлежать надлежащей функции ParseNullableInt
. Затем вы можете вызвать его так:
var result = input.Select(ParseNullableInt).ToArray();
Ответ 3
Изменить: я удалил проверку null/empty, потому что TryParse корректно обрабатывает эти случаи, возвращая false.
string[] stringArray = ...;
int?[] nullableIntArray = Array.ConvertAll(stringArray,
s =>
{
int value;
if (!int.TryParse(s, out value))
return default(int?);
return (int?)value;
});
Ответ 4
Один из вариантов был бы таким (я предполагаю, что вам нужны нули для значений, которые не являются целыми):
public static class StringArrayExtension
{
public static int?[] ToNullableIntArray(this string[] array)
{
int?[] result = new int?[array.Length];
for (int index = 0; index < array.Length; index++)
{
string sourceValue = array[index];
int destinationValue;
if (int.TryParse(sourceValue, out destinationValue))
{
result[index] = destinationValue;
}
else
{
result[index] = null;
}
}
return result;
}
}
использование:
string[] source = { "hello", "1", "3.1415", "20", "foo" };
int?[] dest = source.ToNullableIntArray();
Ответ 5
Вам нужно использовать int.TryParse:
string[] s = { "123", "a", "45" };
int?[] result = new int?[s.Length];
for (int i = 0; i < s.Length; ++i)
{
int a;
if (int.TryParse(s[i], out a))
result[i] = a;
}
Ответ 6
List<int?> ints = new List<int?>();
foreach (string str in strs)
{
int val;
if (int.TryParse(str, out val))
{
ints.Add(val);
}
else { ints.Add(null); }
}
return ints.ToArray();
Ответ 7
Integer массив не может быть нулевым. На самом деле каждый элемент массива Integer будет по умолчанию иметь "0".
Относительно преобразования
Создайте массив Integer той же длины или arraylist
int [] _arr=new int[strArray.length];
for(int i=0;i<strArray.length;i++]
{
if(String.IsNullOrEmpty(strArray[i]))
{
_arr[i]=0;
}
else
{
_arr[i]=int.Parse(strArray[i]);
}
}