首页 > 解决方案 > 缩短一串数字

问题描述

我有以下数字序列:

在此处输入图像描述

你可以看到这些数字很多。我想缩短那个字符串。假设字符串包含超过 20 个数字,它应该显示 18 个数字,然后是“...”,然后是序列的最后两个。

我可以通过在List<int>or中添加这些数字来做到这一点HashSet<int>(在这种情况下,HashSet 可能会更快),但我认为它会很慢。

StringBuilder temp = new StringBuilder();

for (...)
{
    temp.Append($"{number} ");
}

var sequence = temp.ToString();

我想要的示例:

7 9 12 16 18 21 25 27 30 34 36 39 43 45 48 52 54 57 ... 952 954

请注意,我只想要快速的方法

标签: c#

解决方案


这个版本比其他答案快大约 8 倍,并且只分配大约 6% 的内存。我认为您将很难找到更快的版本:

static string Truncated(string input)
{
    var indexOfEighteenthSpace = IndexOfCharSeekFromStart(input, ' ', 18);
    if (indexOfEighteenthSpace <= 0) return input;

    var indexOfSecondLastSpace = IndexOfCharSeekFromEnd(input, ' ', 2);
    if (indexOfSecondLastSpace <= 0) return input;

    if (indexOfSecondLastSpace <= indexOfEighteenthSpace) return input;

    var leadingSegment = input.AsSpan().Slice(0, indexOfEighteenthSpace);
    var trailingSegment = input.AsSpan().Slice(indexOfSecondLastSpace + 1);

    return string.Concat(leadingSegment, " ... ", trailingSegment);

    static int IndexOfCharSeekFromStart(string input, char value, int count)
    {
       var startIndex = 0;
       for (var i = 0; i < count; i++)
       {
           startIndex = input.IndexOf(value, startIndex + 1);
           if (startIndex <= 0) return startIndex;
       }

        return startIndex;
    }

    static int IndexOfCharSeekFromEnd(string input, char value, int count)
    {
       var endIndex = input.Length - 1;
       for (var i = 0; i < count; i++)
       {
           endIndex = input.LastIndexOf(value, endIndex - 1);
           if (endIndex <= 0) return endIndex;
       }

        return endIndex;
    }
}   

推荐阅读