如何将这个字符串转换为整数数组?

7

我有一个字符串 s = "158,141,90,86"

我该如何把它们转换为 int[] 数组?


1
你想要在 Int[] 数组中有 4 个元素吗? - TalentTuner
1
@saurabh:相对于什么? - Steven Sudit
@Steve Townsend:这个和ET.PhoneHome()类似吗? - Steven Sudit
4个回答

28
int[] result = "158,141,90,86".Split(',').Select(int.Parse).ToArray();

17

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

如果您必须尝试解析int,那么它会如何改变呢? - Jack Kada
在他的回答中,Grif声称这会产生一个错误。我承认我没有尝试过,但是你可能需要用return int.TryParse(x, out value) ? (int?) value : null替换它,以便你条件语句的两个分支具有相同的类型。 - Tim Goodman
为什么要追求一行代码完成所有操作,甚至牺牲可读性?(这不仅是针对Jon,而是所有答案都似乎遵循这个原则)。 - Dan Diplo
@Dan:说实话,我认为这比其他方案更易读。编辑以反映这一点... - Jon Skeet
@Jon 我通常同意函数式版本可能更易读,但这似乎有些牵强。我认为在函数式方法中包含条件逻辑似乎有点“不对”。然而,你很可能是正确的,这是由于 int.TryParse() 的丑陋性(我已经阅读了你的《C#深入》一书,并喜欢你使用可空类型以一种新颖和“更好”的方式执行此操作)。 - Dan Diplo
显示剩余3条评论

1

当然,一种命令式的解决方案是:

        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;

@Andrey:啊,是的。在这种情况下,我的代码并没有比这个好多少,但在其他情况下可能非常有用。知道这是可能的很好。谢谢。 - Grif
@Grif:如果你在我的答案下面添加了评论,那就更有帮助了,而不是添加自己的答案。我已经修复了它。 - Jon Skeet
@Jon Skeet:不知怎么回事,我好像做不到。或者是我漏了什么?(声望低?) - Grif
@Grif:是的,你需要50个声望才能评论其他人的答案。 - Tim Goodman
@Grif:啊,那样是有道理的——对于不合适的建议我很抱歉。我忘记了这样的事情:( - Jon Skeet
@Grif:你可以把这个简化一下。例如,默认值是null,所以你可以完全跳过else语句。不过,这仍然是一个可行的非LINQ解决方案,所以我很高兴给它点赞(并帮助你获得足够的声望来使用评论功能)。 - Steven Sudit

1

使用LINQ/int?[]的另一种解决方案是:

return source.Split(',') 
                .Select(x => {  
                      int? value = null; 
                      int parsed;
                      if (int.TryParse(x, out parsed)) {
                          value = parsed;
                      }
                      return value; 
                 }) 
                .ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接