【问题标题】:C# Split a string of integers into an IEnumerable<int>C# 将整数字符串拆分为 IEnumerable<int>
【发布时间】:2011-10-11 18:05:04
【问题描述】:

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

最好的方法是什么?

我可以在下面这样做,但我担心性能 - 有没有更好更有效的方法来做到这一点?

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;
}

【问题讨论】:

标签: c# parsing syntax


【解决方案1】:

无需调用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;
        }
    }
}

【讨论】:

  • 我会将item =&gt; int.Parse(item) 缩短为int.Parse。 (速度没有显着提高,主要是纯粹的美学。)
  • 我喜欢的一个技巧是定义一个扩展方法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=&gt;s.MyTryParse()))......你可以做的任何事情都可以将变量的突变移动到较低的级别。
  • 谢谢标记,将使用第一个建议,因为我不担心它是否无法解析 - 我负责字符串,所以如果我配置这个错误(不应该发生!)它是直的出异常
【解决方案2】:

你至少可以省略第一个 ToList() 语句 - 所以它会是

  List<int> _result = Ids.Split(',').Select(item => int.Parse(item)).ToList();

【讨论】:

  • 由于声明的要求是IEnumerable&lt;int&gt;,因此也不需要第二个ToList()
【解决方案3】:

您可能可以循环拆分结果并执行 yield return int.Parse... 但除非您在原始字符串中有很多项目,否则我不会期望有很大差异。

【讨论】:

  • 无论字符串的大小如何,我都不会期望有太大的不同。你为什么要这样做?
  • 因为这样我们会忽略任何 ToString() 并且枚举将使用迭代器从头到尾滚动/扫描一次,因此 ToList 在每次调用时都会扫描它。我想到的正是马克答案中的第二个代码块,它被投票和标记。
【解决方案4】:

使用 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 = ';' });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    相关资源
    最近更新 更多