将string []转换为int?[]

San*_*osh 3 c#

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

Jon*_*eet 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;
}
Run Code Online (Sandbox Code Playgroud)

要回答评论,是的,你需要演员2.

或没有条件:

public static int? TryParseInt32(string text)
{
    int value;
    if (int.TryParse(text, out value))
    {
        return value;
    }
    else
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

把它们放在一起像这样:

string[] x = {"15", "10", "hello", "5" };        
int?[] y = Array.ConvertAll(x, TryParseInt32);
Run Code Online (Sandbox Code Playgroud)

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

2你需要在条件中进行强制转换的原因是因为编译器不知道你真正意味着什么类型的"null" - 但它知道它无法转换nullint.的类型,条件表达式必须是任一所述第二操作数的类型所述第三操作数的类型,而另一个必须是隐式转换债券.通过强制第三个操作数在int?这里类型一切都很好 - 因为你可以隐式转换intint?.请注意,编译器不会采用您使用表达式来尝试计算类型的方式.另一种选择是使用new int?()而不是null.


Kon*_*lph 5

通过解析和使用Linq:

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

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

var result = input.Select(ParseNullableInt).ToArray();
Run Code Online (Sandbox Code Playgroud)

  • @Konrad:是的,提高了性能.在调用Select之后考虑ToArray的信息:不是很多.特别是,它*不知道让数组开始有多大......所以它将从一个小数组开始,然后当它用完空间时它将创建一个新数组,复制所有数组现有的价值等 - 然后在最后修剪.将它与Array.ConvertAll进行比较 - 它确切地知道使数组开始有多大.尝试使用大型阵列和一个简单的转换,你肯定会看到一个区别. (5认同)

Sam*_*ell 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;
    });
Run Code Online (Sandbox Code Playgroud)