2014-03-03 87 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的答案,所以表現可能是心中的目標而不是簡短。 –