2012-07-06 85 views
0

目前我使用它来寻找一个新的字符串,用字典收藏比较如何更快比较的DictionaryEntry值比“的foreach”循环

foreach (DictionaryEntry value in hd)    
{ 
    if (value == newWordIn) 
    { 
     // assign existing word 
    } 
    else 
    { 
     // assign new word into collection 
    } 
} 

HD包含这么多键并循环很长。 任何事情我可以做,使其快速检查,不要等待检查字典集合这么久?

谢谢你的建议。

+0

你的第一个错误是使用散列表像列表。改用索引器。 – leppie 2012-07-06 08:24:59

+2

'if(hd.ContainsValue(value))' – paul 2012-07-06 08:29:06

+0

正如我在回答的评论中指出的那样,你给出的代码甚至不会编译(你会比较DictionaryEntry和字符串)。如果你没有提供准确的代码,那真的很难提供帮助。此外,您甚至在没有评论的情况下更改了问题中的代码,使我的答案的一半显得怪异。 – 2012-07-06 09:21:13

回答

3

基本上,不 - 如果您尝试按值查找字典条目,那么它将始终是O(N)操作。相反,如果您需要这种行为,您应该创建一个值为HashSet<T>的值。

(请注意,你真的不应该使用非泛型集合在第一时间将这些天,除非你真的到。)

+0

尽管O(n)对于小的n ..可能比O(1)更快。 – 2012-07-06 08:28:06

+0

@pst:当然 - 但“高清包含这么多的关键,并使循环很长”是在问题。 – 2012-07-06 08:29:18

+0

啊,完全跳过: – 2012-07-06 08:29:54

0

你可以引入额外的词典中,关键是值从原来的字典和值是原始字典中这些值的计数。如果原始字典中的值是唯一的(因此计数总是1),那么您可以使用HashSet而不是Dictionary

您需要确保两个结构始终保持同步。

0

您是否还可以包含代码以显示您正在使用hdnewWordIn的哪些类型以使示例更清晰?

假设在您的示例中newWordInstring类型,那么该代码将不会编译,因为您将其与DictionaryEntry类型进行比较。

由于乔恩斯基特已经指出的那样,你可能需要的是一个HashSet<string>

看起来好像(从你的代码中的注释),那是你正在尝试做的是确保你的集合不包含重复的条目。那么你的代码应该是这样的:

HashSet<string> hd = new HashSet<string>(); 

... 

// Only add distinct entries 
if (!hd.Contains(newWordIn)) 
{ 
    hd.Add(newWordIn); 
}