我有一个字符串 s = "158,141,90,86"
我该如何把它们转换为 int[] 数组?
我有一个字符串 s = "158,141,90,86"
我该如何把它们转换为 int[] 数组?
int[] result = "158,141,90,86".Split(',').Select(int.Parse).ToArray();
使用 LINQ 就像这样:
int[] array = s.Split(',')
.Select(x => int.Parse(x))
.ToArray();
注意,如果文本中的任何元素不是整数,这将引发异常。如果您想使其更具弹性(例如,如果这是用户输入的数据),则需要使用 int.TryParse
;在这一点上,在LINQ查询方面,生活变得有点复杂了。int?[]
(每个无效子字符串对应一个null值),您可以执行以下操作:int?[] array = s.Split(',')
.Select(x => {
int value;
return int.TryParse(x, out value) ? value : (int?)null;
})
.ToArray();
就像我说的那样,这并不是非常好看 :(
编辑:在评论中,丹(Dan)评论了上述方法的“固执”,而不是(可能)更加命令式的方法。在我的观点中,即使是不太愉快的第二个版本仍然比命令式代码更容易阅读。丑陋只是由于int.TryParse
的丑陋本质造成的,当它用于命令式代码时也同样丑陋。
如果int.TryParse
返回的是int?
或Tuple<bool, int>
,那么它就和第一个版本一样简单了。甚至将元组形式转换为可空形式也很简单,只需要一个额外的映射:
int[] array = s.Split(',')
.Select(x => int.TryParseTuple(x))
.Select(tuple => tuple.First ? tuple.Second : (int?) null)
.ToArray();
return int.TryParse(x, out value) ? (int?) value : null
替换它,以便你条件语句的两个分支具有相同的类型。 - Tim Goodmanint.TryParse()
的丑陋性(我已经阅读了你的《C#深入》一书,并喜欢你使用可空类型以一种新颖和“更好”的方式执行此操作)。 - Dan Diplo当然,一种命令式的解决方案是:
string[] sa = s.Split(',');
int?[] array = new int?[sa.Length];
int value;
for (int i = 0; i < sa.Length; i++)
if (int.TryParse(sa[i], out value))
array[i] = value;
else
array[i] = null;
null
,所以你可以完全跳过else
语句。不过,这仍然是一个可行的非LINQ解决方案,所以我很高兴给它点赞(并帮助你获得足够的声望来使用评论功能)。 - Steven Sudit使用LINQ/int?[]的另一种解决方案是:
return source.Split(',')
.Select(x => {
int? value = null;
int parsed;
if (int.TryParse(x, out parsed)) {
value = parsed;
}
return value;
})
.ToArray();