Преобразовать строку [] в 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]);
   }
}