将string 转换为int?

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

那么,这两个方面是:

  • 如何将数组从一种类型转换为另一种?
  • 如何将字符串转换为可空的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()更有效,因为它有更多信息。 它可以立即创建最终数组 – 不需要resize。 调用Enumerable.ToArray() (带有Select()的结果)没有相同的信息,因此它实际上必须将结果添加到List (可能在整个过程中多次resize),然后通常resize最后也是。 (它实际上并没有使用List但概念是相同的。)绝对值得了解Select / ToArray解决方案,但在这种情况下我认为它实际上不比ConvertAll更可读,所以你可能以及使用更有效的forms。

2你需要在条件中进行强制转换的原因是因为编译器不知道你真正意味着什么类型的“null” – 但它知道它不能从null转换为int 。 条件表达式的类型必须是第二个操作数的类型第三个操作数的类型,另一个必须是可隐式转换的。 通过强制第三个操作数是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(); 

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

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

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

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

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

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

你需要使用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; } 
 List ints = new List(); foreach (string str in strs) { int val; if (int.TryParse(str, out val)) { ints.Add(val); } else { ints.Add(null); } } return ints.ToArray(); 

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

关于转换

创建一个相同长度的整数数组或一个arraylist

 int [] _arr=new int[strArray.length]; for(int i=0;i