我有一个字典第一个字符串,键,必须永远不会改变..它不能删除或任何东西..但值,我继续添加行,行和行到值..我只是创建新的带\ r \ n或\ r \ n的行和我只是想知道保留最后50行的最简单方法是什么。并删除50行以上的任何东西..我这样做是因为当我返回它时,我必须通过一个char数组放置值,并通过每个字母,如果有太多的数据,这可能会很慢。有什么建议吗?
答案 0 :(得分:2)
Guffa的总体思路是正确的 - 您的数据结构应该反映您实际需要的内容,即字符串列表而不是单个字符串。 “最后50行”的概念很明显与集合而不是单个字符串有关,即使您最初是以这种方式阅读它。
但是,我建议使用LinkedList<T>
而不是List<T>
:每次删除List<T>
的第一个元素时,其他所有内容都必须随机播放。 List<T>
非常适合提供随机访问,并且在添加到最后时不是太糟糕,但是从一开始就很难删除。 LinkedList<T>
非常适合为您提供迭代器访问权限,从开头添加/删除,以及从末尾添加/删除。这更合适。 (如果你真的想去城里,你甚至可以编写你自己的固定大小的循环缓冲区类型,它为你封装了逻辑;这将在两个世界中给你最好的,在你不希望能够的情况下超出一定的规模。)
关于你对Guffa答案的评论:将输入转换为更适合处理的形式,然后将其转换回原始格式以进行输出是很常见的。你这样做的原因恰恰是“更合适”的一点。作为“更新字典”操作IMO的一部分,您不希望必须解析换行符的字符串。特别是,听起来你正在引入“线条”的概念,其中原始文本只是作为字符串读取。您可以通过使用换行符分隔字符串来有效地创建由字符串支持的自己的“集合”类。与使用内置集合相比,这样效率低,容易出错,并且难以管理。如果你需要,可以很容易地在最后执行转换为换行符分隔的字符串,但听起来你太早了。
答案 1 :(得分:1)
使用Dictionary<string, List<string>>
而不是连接线条。当您要将一个字符串添加到列表中时,您可以检查计数并删除第一个字符串(如果列表已有50个字符串):
List<string> list;
if (!theDictionary.TryGetValue(key, out list)) {
theDictionary.Add(list = new List<string>());
}
if (list.Count == 50) {
list.RemoveAt(0);
}
list.Add(line);