2009-11-30 68 views
0

我有一个字典第一个字符串,关键的一定不能改变..它不能被删除或任何..但值,我不断添加行,线和线的值..我只是创建新的线\ r \ n或\ r ..我只是想知道什么是最简单的方法来保留最后50行。并删除50行以上的任何东西..即时做到这一点,因为当我返回它时,我必须通过一个字符数组,并通过每个字母,这可以是缓慢的,如果有太多的数据。有什么建议么?从字符串中删除行+从C#中的字典中删除旧的条目

回答

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); 
+0

这是不可能的,因为我的程序读取字符串的方式。 – caesay 2009-11-30 06:56:58

+0

@sniperX:为什么呢? – Guffa 2009-11-30 06:59:25

+0

@Guffa:那么,这将是可能的,但最终,id仍然需要将它编译成一个大字符串,以便在我的程序中使用它。所以id基本上就是围绕着一圈。从一个大的字符串到一个字符串列表,再到一个大的字符串,我没有看到这一点? – caesay 2009-11-30 07:05:53

2

Guffa的总体思路是正确的 - 你的数据结构应该反映你真正想要,这是一个字符串列表而不是单个字符串。 “最后50行”的概念很明显与集合而非单个字符串有关,即使您最初是以这种方式阅读的。

但是,我建议使用LinkedList<T>而不是List<T>:每次删除List<T>的第一个元素时,其他所有内容都必须洗牌。 List<T>非常适合随机访问,并且在添加到最后时也不错,但是从一开始就很糟糕。 LinkedList<T>非常适合您提供迭代器访问,添加/删除开始以及添加/删除结束。这更合适。 (如果你真的想去镇上,你甚至可以编写自己的固定大小的循环缓冲区类型,它封装了你的逻辑;这将给两个世界的最好的,在你不希望能够扩展超过一定的尺寸。)

关于您对Guffa的回答的评论:将输入转换为更适合处理的表单很常见,然后将其转换回原始格式输出。你做这件事的原因正是“更合适”的一点。作为“更新字典”操作的一部分,您不希望为换行符解析字符串。特别是,您听起来像是目前介绍“行”的想法,其中原始文本正在以字符串形式读入。通过使用换行符分隔字符串,您可以有效地创建自己的“集合”类,该字符串由字符串支持。与使用内置集合相比,这种方法效率低下,容易出错,且难以管理。如果你想要的话,很容易在最后执行换行符到换行符分隔的字符串,但听起来你这样做太早了。