c# - 缩短一串数字
问题描述
我有以下数字序列:
你可以看到这些数字很多。我想缩短那个字符串。假设字符串包含超过 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
请注意,我只想要快速的方法。
解决方案
这个版本比其他答案快大约 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;
}
}
推荐阅读
- php - Twilio whatsapp api电话号码的问题
- discord - 检查特定用户是否对 discord.py 做出反应
- javascript - 排序和合并对象列表
- angular - 如何定制
颜色? - bash - 使用 Cloud Build 重启 GCE 实例上的服务
- python - 彩票循环通过列表中的随机数找到找到它需要多少计数
- asp.net - 我如何将链接按钮 oncommand 事件挂钩到另一种方法,比如 gridview OnPageIndexChanging 事件
- javascript - 有没有比异步函数回调更简单的方法来暂停执行?
- html - Angular 中反应式表单的验证器指令
- c# - 窗口最小化时如何强制刷新缩略图?(C#WPF)