C# 将字符串解析为具有范围的整数列表

C# 将字符串解析为具有范围的整数列表,c#,.net,string,list,parsing,C#,.net,String,List,Parsing,我有一组字符串,我想解析它们,它们都是这样的: "1001, 1003, 1005-1010" "1015" "900-903" "200, 202-209, 211-220" 有时这些字符串只是一个整数,有时是由逗号分隔的多个整数,有时是一个范围,后两个字符串可以以任何顺序同时出现在单个字符串中 我想做的是创建一个函数,该函数接收字符串并通过解析字符串返回整数集合。例如,第一个字符串应该返回: [1001, 1003, 1005, 1006, 1007, 1008, 1009, 1010]

我有一组字符串,我想解析它们,它们都是这样的:

"1001, 1003, 1005-1010"
"1015"
"900-903"
"200, 202-209, 211-220"
有时这些字符串只是一个整数,有时是由逗号分隔的多个整数,有时是一个范围,后两个字符串可以以任何顺序同时出现在单个字符串中

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

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

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

.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();

.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();

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

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

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

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

到目前为止你试过什么?一个简单的方法可以是,按、、拆分,检查令牌是否包含-,如果包含-,循环其边界并将其添加到最终数组中,否则添加令牌。然后,对数组重新排序。@RodrigoSilva我尝试了一种方法,我有两个指针,其中一个指针一直运行,直到它找到一个“-”或一个“,”,并解析第一个和第二个指针之间的内容,然后将它们向上移动,在“-”的情况下,循环添加范围内的所有内容。然而,我很难避免超出索引界限的情况,判断什么时候出错,并在出错时抛出异常。到目前为止,您做了哪些尝试?一个简单的方法可以是,按、、拆分,检查令牌是否包含-,如果包含-,循环其边界并将其添加到最终数组中,否则添加令牌。然后,对数组重新排序。@RodrigoSilva我尝试了一种方法,我有两个指针,其中一个指针一直运行,直到它找到一个“-”或一个“,”,并解析第一个和第二个指针之间的内容,然后将它们向上移动,在“-”的情况下,循环添加范围内的所有内容。但是我很难避免超出索引界限的情况,判断什么时候出了问题,并在出现问题时抛出异常。我对Linq不太熟悉,该解决方案如何处理逗号前后缺少空格或额外空格以及无效范围(如1001-900或1001-)等问题?它将处理额外空格,但在无效范围内失败。在这种情况下,这非常适合我的需要。我仍然希望看到其他人提供一些非Linq解决方案。谢谢我对Linq不太熟悉,这个解决方案如何处理诸如逗号前后缺少空格或额外空格,以及诸如1001-900或1001-之类的无效范围?它将处理额外的空格,但在无效范围时会失败。在这种情况下,这非常适合我的需要。我仍然希望看到其他人提供一些非Linq解决方案。谢谢这是非常好的,它提供了比Linq解决方案更好的可读性,而代码行数也只是稍微多一点。这是非常好的,它提供了比Linq解决方案更好的可读性,而代码行数也只是稍微多一点。