C#将一个整数字符串拆分为IEnumerable<int>

5

我需要将一个由逗号分隔的整数字符串转换为整数列表。

有什么最好的方法?

我可以像下面这样做,但担心性能 - 是否有更好、更有效的方法来完成此操作?

public IEnumerable<int> GetListOfIds()
{
    string Ids = "1,4,5,7,12"; // would be passed into method
    List<int> _result = Ids.Split(',')
                           .ToList()
                           .Select(item => int.Parse(item))
                           .ToList();

    return _result;
}

2
如果你担心性能问题,那么正确的做法是测量你的性能。这样你就会知道你是否不必要地担心了。 - Eric Lippert
非常相似:http://stackoverflow.com/questions/10861833/split-string-extension-with-generic-type - nawfal
4个回答

14

没有必要调用 ToList,除此之外你的代码看起来很好:

public IEnumerable<int> GetListOfIds(string ids)
{
    return ids.Split(',').Select(item => int.Parse(item));
}

如果输入字符串无效,您也可以考虑添加错误处理:

public IEnumerable<int> GetListOfIds(string ids)
{
    foreach (string part in ids.Split(','))
    {
        int x;
        if (!int.TryParse(part, out x))
        {
            throw new ArgumentException(
                string.Format("The value {0} cannot be parsed as an integer.", part),
                "ids");
        }
        else
        {
            yield return x;
        }
    }
}

5
我会将item => int.Parse(item)简化为int.Parse。(这样做并没有显著提高速度,主要是出于美学考虑。) - Vlad
我喜欢的一个技巧是定义一个扩展方法 static int? MyTryParse(this string s) { int x; return int.TryParse(s, out x) ? (int?)x : (int?)null; },然后你可以这样做 foreach(int? part in ids.Split(',').Select(s=>s.MyTryParse())) ... 任何你能做到将变量的改变移动到更低层次的事情都是好的。 - Eric Lippert
谢谢Mark,我会使用第一个建议,因为如果解析失败我不担心——我负责这个字符串,所以如果我配置错误(应该永远不会发生!),那就是一个明显的异常。 - Noel

1
您可以至少省略第一个ToList()语句 - 这样就是
  List<int> _result = Ids.Split(',').Select(item => int.Parse(item)).ToList();

1
由于所述要求是一个 IEnumerable<int>,因此也不需要第二个 ToList() - phoog

0

使用Stringify.Library NuGet包

  1. 示例1(默认分隔符隐式地采用逗号)
    var ids = "1, 4, 5, 7, 12"; var splitComma = new StringConverter().ConvertTo<List<int>>(ids);

  2. 示例2(显式指定分隔符)
    var ids = "1; 4; 5; 7; 12";
    var splitColon = new StringConverter().ConvertTo<List<int>>(ids, new ConverterOptions { Delimiter = ';' });


0
你可以循环拆分结果并使用 yield return int.Parse...,但是除非原始字符串中有很多项,否则我不会期望有太大的差异。

无论字符串的大小,我都不会期望有太大的差异。你为什么会这样想呢? - phoog
因为这样我们会忽略任何ToString(),并且可枚举对象只会被迭代器从头到尾滚动/扫描一次,而ToList则在每次调用时都会扫描整个对象。我想的正是Mark答案中第二个代码块,它得到了投票和标记。 - Davide Piras

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