Jon*_*eet 10
那么,这两个方面是:
第一个很简单 - 你可以使用Array.ConvertAll,传递一个Converter委托.还有的LINQ方式,以及(x.Select(...).ToArray()),但这是稍微低效率的,如果你知道你有一个数组开始,你想数组从另一端的1.
该string到int?可能是最好的方法来完成.您可以在匿名函数中执行此操作,但在此特定情况下,我将使用单独的方法.我很少想在匿名函数中声明变量.
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.ConvertAll比x.Select().ToArray()有更多信息更有效.它可以立即创建最终数组- 不需要调整大小.调用Enumerable.ToArray()(结果Select())不具有相同的信息,因此它实际上必须将结果添加到List<T>(可能在整个过程中多次调整大小),然后通常在结束时调整大小.(它实际上并没有使用,List<T>但概念是相同的.)绝对值得了解Select/ToArray解决方案,但我不认为它实际上比ConvertAll在这种情况下更具可读性,所以你不妨使用更多有效的形式.
2你需要在条件中进行强制转换的原因是因为编译器不知道你真正意味着什么类型的"null" - 但它知道它无法转换null为int.的类型,条件表达式必须是任一所述第二操作数的类型或所述第三操作数的类型,而另一个必须是隐式转换债券.通过强制第三个操作数在int?这里类型一切都很好 - 因为你可以隐式转换int为int?.请注意,编译器不会采用您使用表达式来尝试计算类型的方式.另一种选择是使用new int?()而不是null.
通过解析和使用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)
编辑:我删除了空/空检查,因为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)