将string []转换为int?[]

时间:2009-11-19 07:03:18

标签: c#

如何将字符串数组转换为可为空的整数数组。

7 个答案:

答案 0 :(得分:10)

嗯,这两个方面是:

  • 如何将数组从一种类型转换为另一种类型?
  • 如何将字符串转换为可以为空的int?

第一个很简单 - 您可以使用Array.ConvertAll,传入Converter代表。还有LINQ方式(x.Select(...).ToArray()),但是如果你知道你有一个数组开始并且你想要一个数组从另一端 1 那么效率会稍微低一些。

stringint?可能最好用方法完成。您可以在匿名函数中执行此操作,但在此特定情况下,我将使用单独的方法。我很少想在匿名函数中声明变量。

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);

1 Array.ConvertAllx.Select().ToArray()更有效,因为它有更多信息。它可以立即创建最终的数组 - 不需要调整大小。调用Enumerable.ToArray()(结果为Select())没有相同的信息,因此它实际上必须将结果添加到List<T>(可能会在此过程中多次调整大小)并且然后通常也会在最后调整大小。 (它实际上并没有使用List<T>,但概念是相同的。)绝对值得了解Select / ToArray解决方案,但我认为它实际上不比ConvertAll更可读case,所以你不妨使用效率更高的表格。

2 你需要在条件中进行强制转换的原因是因为编译器不知道你真正意味着什么类型的“null” - 但它知道它无法从{{1转换转到null。条件表达式的类型必须 第二个操作数的类型第三个​​操作数的类型,另一个必须是可隐式转换的。通过强制第三个操作数为int类型,一切都很好 - 因为您可以隐式地从int?转换为int。请注意,编译器不会采用您使用表达式来尝试计算类型的方式。另一种方法是使用int?代替new int?()

答案 1 :(得分:5)

通过解析和使用Linq:

string[] input = { "1", "3", "x" }
var result = input.Select(
    s => { int i; return (int.TryParse(s, out i)) ? i : (int?) null; }).ToArray();

...但我承认这有点神秘。我不会在这里使用lambda表达式。为清楚起见,这应属于适当的函数ParseNullableInt。然后你可以这样称呼它:

var result = input.Select(ParseNullableInt).ToArray();

答案 2 :(得分:5)

编辑:我删除了空/空检查,因为TryParse通过返回false正确处理了这些情况。

string[] stringArray = ...;
int?[] nullableIntArray = Array.ConvertAll(stringArray,
    s =>
    {
        int value;
        if (!int.TryParse(s, out value))
            return default(int?);
        return (int?)value;
    });

答案 3 :(得分:2)

一个选项就是这个(我假设你想要非整数值的值的空值):

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();

答案 4 :(得分:0)

你需要使用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;
    }

答案 5 :(得分:0)

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();

答案 6 :(得分:-2)

整数数组不能为null。实际上,Integer Array中的每个元素默认都是“0”。

关于转换

创建一个相同长度的整数数组或一个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]);
   }
}