2014-03-03 95 views
5

我可以确保在C#中的字典中只有一个特定的值吗?关于字典

例如,如果我定义一个字符串,其中的键是char并且value是char,那么我可以确保如果字符'a'已经是一个现有值,那么在字符'a'中不会有另一个值'a'字典?

我有一个解决方案,但我想知道如果有一个更好的:

static void Main() 
{ 
    Dictionary<int, int> dic = new Dictionary<int, int>(); 
    bool valExists = false; 
    Console.WriteLine("please enter key and value"); 
    int key = int.Parse(Console.ReadLine()); 
    int val = int.Parse(Console.ReadLine()); 
    foreach (KeyValuePair<int,int> keyval in dic) 
    { 
     if (keyval.Value == val) 
     { 
      valExists = true; 
      break; 
     } 
    } 
    if (!valExists) 
     dic.Add(key, val); 
} 
+0

可能您应该使用该值作为密钥? http://stackoverflow.com/questions/9438060/c-sharp-dictionary-type-with-unique-keys-and-values可能有帮助吗? – Siva

回答

5

我可以确保在C#中的字典中只有一个特定的值吗?

不是这样(它不会跟随该点的正常字典合同),但它听起来像是你想有效的双向字典。你可以通过撰写两本词典来完成这个任务,每个词典都是一个方向。我有一个answer on another question与示例代码。

这将允许你直接从“值”到“钥匙” - 如果你不需要这个,你总是可以保持HashSet<TValue>以及正常的TDictionary<TKey, TValue>,并且如果调用者试图添加一个已经存在的值。

同样,我会建议你不要从Dictionary<,>派生来做到这一点 - 而不是仅仅组成一个Dictionary<,>HashSet<>。 (我甚至不会执行IDictionary<,>,因为你有额外的约束,正常字典不包括在内。)

0

这就告诉你,如果你有重复的值或者不:

dic.Values.Distinct().Count() == dic.Values.Count() // true if no duplicates found 

为了防止重复:

if (!dic.ContainsValue(val)) {  
    dic[key] = val; 
} 

为了获得更好的性能,请使用HpaSetHashSet。

var values = new HashSet<int>(); 

if (!values.Contains(val)) { 
    values.Add(val); 
    dic[key] = val; 
} 
+1

这里的意图是在为每个“添加”*添加新值*之前查看是否存在值。而不是在添加一堆重复项后检查。 – Servy

+0

如果(!dic.ContainsValue(val)){ dic [key] = val;则可以使用ContainsValue: 。 } – 2014-03-03 20:06:05

+0

这使得代码比OP所做的更短,但这确实是全部。您每次都仍然通过字典进行线性搜索。 – Servy

2

为了避免需要通过整个字典每Add做线性搜索,你可以保持一个HashSet<TValue>以及字典。当你添加一个新值时,你可以先检查这个集合。如果它在那里,它在字典里。如果您最终添加了该项目,请将其添加到该设置中。从字典中删除项目时,还需要将其从集合中删除。

2

字典类中有一个内置的方法来检查值是否存在。请注意,这是一个线性搜索,所以它不是最有效的方法,但它确实存在...

static void Main() 
{ 
    Dictionary<int, int> dic = new Dictionary<int, int>(); 

    Console.WriteLine("please enter key and value"); 
    int key = int.Parse(Console.ReadLine()); 
    int val = int.Parse(Console.ReadLine()); 

    if (!dic.ContainsValue(val)) 
     dic.Add(key, val); 
} 
+0

这比OP的代码短,但它仍然通过字典为每个“添加”进行线性搜索。 – Servy

+0

@Servy谢谢,已更新以反映“ContainsValue”搜索完成的方法。 OP已经标记了Jon的答案,所以表现可能是心中的目标而不是简短。 –