你原来的代码会给取决于所返回的项目的顺序不同的结果来自_tags;我非常怀疑这不是你的意图。
相反,标签分类成订单,然后将它们添加到正确的顺序字符串生成器:
private string restoreText(string text)
{
StringBuilder sb = new StringBuilder();
foreach(KeyValuePair<int, string> pair in _tags.OrderBy(t => t.Key))
{
sb.Append(pair.Value);
}
return sb.ToString();
}
如果你真的想使这个去尽可能快,初始化StringBuilder
起来的能力正面:
StringBuilder sb = new StringBuilder(_tags.Sum(k => k.Value.Length));
更新
我错过了text
参数最初用于初始化StringBuilder
。
为了避免在内存中乱码文本(如由StringBuilder.Insert()
引起),我们希望坚持使用StringBuilder.Append()
。
我们可以通过将原始文本转换为KeyValuePair
实例的另一个序列,将这些实例合并到原始列表并按顺序处理。
它看起来像这样(注:即席代码):
private string restoreText(string text)
{
var textPairs
= text.Select((c,i) => new KeyValuePair<int,string>(i, (string)c));
var fullSequence
= textPairs.Union(_tags).OrderBy(t => t.Key);
StringBuilder sb = new StringBuilder();
foreach(KeyValuePair<int, string> pair in fullSequence)
{
sb.Append(pair.Value);
}
return sb.ToString();
}
注 - 我对你们的上下文假设整个堆,所以这可能不是你完全正确工作。特别要注意的是,.Union()
会丢弃重复项目,尽管这有一些简单的解决方法。
请告诉我该数据源使用追加? –
如果它将'_tags'添加到一个词典中,那么'text'中的内容是什么? – MPelletier