检测连续整数并折叠为字符串

Jac*_*ler 3 c# algorithm list

免责声明:这里已经在 Python 上下文中提出了一个非常相似的问题。这是关于 C#。

我有一个包含整数的枚举,例如:

[1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14]
Run Code Online (Sandbox Code Playgroud)

我想获得一个字符串,列出连续整数的范围:

1-4, 7-8, 10-14
Run Code Online (Sandbox Code Playgroud)

我想出了:

public static void Main()
{
    System.Diagnostics.Debug.WriteLine(FindConsecutiveNumbers(new int[] { 1,2, 7,8,9, 12, 15, 20,21 }));
}

private static string FindConsecutiveNumbers(IEnumerable<int> numbers)
{
    var sb = new StringBuilder();
    int? start = null;
    int? lastNumber = null;
    const string s = ", ";
    const string c = "-";

    var numbersPlusIntMax = numbers.ToList();
    numbersPlusIntMax.Add(int.MaxValue);
    foreach (var number in numbersPlusIntMax)
    {
        var isConsecutive = lastNumber != null && lastNumber + 1 == number;
        if (!isConsecutive)
        {
            if (start != null)
            {
                if (sb.Length > 0) { sb.Append(s); }
                if (start == lastNumber)
                {
                    sb.Append(start); ;
                }
                else
                {
                    sb.Append(start + c + lastNumber); ;
                }
            }

            start = number;
        }
                
        lastNumber = number;
    }

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

该算法适用于有序输入。是否有内置/LINQ/较短的 C# 方法来执行此操作?

shi*_*ngo 6

int[] numbers = { 1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14 };

return string.Join(", ",
    numbers
        .Select((n, i) => new { value = n, group = n - i })
        .GroupBy(o => o.group)
        .Select(g => g.First().value + "-" + g.Last().value)
);
Run Code Online (Sandbox Code Playgroud)