【问题标题】:Parsing String Into List of Integers with Ranges将字符串解析为具有范围的整数列表
【发布时间】:2014-02-20 18:26:09
【问题描述】:

我有一堆我想解析的字符串,它们看起来像这样:

"1001, 1003, 1005-1010"
"1015"
"900-903"
"200, 202-209, 211-220"

这些字符串有时只是一个整数,有时是多个以逗号分隔,有时是一个范围,后两者可以以任意顺序同时出现在一个字符串中。

我想做的是创建一个函数,该函数接收字符串并通过解析字符串返回整数集合。所以例如第一个字符串应该返回:

[1001, 1003, 1005, 1006, 1007, 1008, 1009, 1010]

在 .NET 4.0 中有哪些聪明的方法可以做到这一点?

【问题讨论】:

  • 到目前为止你尝试过什么?一个简单的方法是,用“,”分割,检查令牌是否包含“-”,如果是,循环遍历其边界并将它们添加到最终数组中,否则添加令牌。然后,只需重新排序数组。
  • @RodrigoSilva 我尝试了一种方法,其中我有两个指针,一个一直持续到找到'-'或','并解析第一个和第二个指针之间的内容,然后将它们都向上移动在“-”的情况下,会循环添加范围内的所有内容。但是,我无法避免超出索引范围并决定何时出现问题并在出现异常时抛出异常的情况。

标签: c# .net string list parsing


【解决方案1】:

.NET 4.0 意味着您可以使用 LINQ,因此您应该使用它:

var input = "1001, 1003, 1005-1010";

var results = (from x in input.Split(',')
               let y = x.Split('-')
               select y.Length == 1
                 ? new[] { int.Parse(y[0]) }
                 : Enumerable.Range(int.Parse(y[0]), int.Parse(y[1]) - int.Parse(y[0]) + 1)
               ).SelectMany(x => x).ToList();

【讨论】:

  • 我对 Linq 不太熟悉,这个解决方案如何处理逗号前后缺少或多余空格以及“1001-900”或“1001-”等无效范围等问题?
  • 它将处理额外的空格,但会因范围无效而失败。
  • 在这种情况下,这非常适合我的需求。不过,我仍然希望看到其他人的一些非 Linq 解决方案。谢谢!
【解决方案2】:

可能更容易阅读的传统循环:

string input = "1001, 1003, 1005-1010";

List<int> result = new List<int>();
foreach (string part in input.Split(','))
{
    int i = part.IndexOf('-');
    if (i == -1)
    {
        result.Add(int.Parse(part));
    }
    else
    {
        int min = int.Parse(part.Substring(0, i));
        int max = int.Parse(part.Substring(i + 1));
        result.AddRange(Enumerable.Range(min, max - min + 1));
    }
}

【讨论】:

  • 这非常好,它提供了比 Linq 解决方案更高的可读性,同时代码行数也稍微多一些。
猜你喜欢
  • 1970-01-01
  • 2017-08-20
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多