2012-11-28 201 views
0

我有以下字典:在字典的鍵中刪除重複

Dictionary<string, string> test = new Dictionary<string, string>(); 
test.Add("1|1", "blue"); 
test.Add("1|2", "Nice"); 
test.Add("1|3", "Jaish"); 
test.Add("2|2", "Muna"); 
test.Add("3|1", "haha"); 
test.Add("3|2", "green"); 
test.Add("4|1", "red"); 
Dictionary<string, string> test2 = new Dictionary<string, string>(); 
foreach (KeyValuePair<string, string> entry in test) 
{ 
    if (!test2.ContainsValue(entry.Key)) 
     test2.Add(entry.Key, entry.Key); 
} 

我想刪除下面的重複值:

test.Add("1|2", "Nice"); 
test.Add("1|3", "Jaish"); 
test.Add("3|2", "green") 

因此,移除重複的Dictionary的密鑰計數後應4.

+7

它們不是重複的。你不能在字典中有重複的鍵 – Habib

+0

我知道字典鍵不包含重複項,但我想要唯一的字典鍵數。 – KCS

+0

你對*重複*的定義是什麼? '1 | 2','1 | 3'和'3 | 2'是三個不同的值,因此它們不是重複的。 –

回答

5

假設通過管道拆分字符串的第一部分定義了重複項:

var uniques = test.GroupBy(kv => kv.Key.Split('|')[0]) 
        .Select(g => g.First()) 
        .ToDictionary(kv => kv.Key, kv => kv.Value); 

這總是選擇每個組的第一個鍵值對。

+1

+1來澄清問題,但蒂姆,你能確定它總是選擇'1 | 1'對'First()',我認爲順序不能得到保證。 – Habib

+0

謝謝蒂姆你的代碼對我來說是完美的解決方案。 – KCS

+0

@Habib:訂單對於OP來說並不重要,至少他沒有提到它。所以,首先要把'首先'理解爲_whatever_。如果有需要排序的東西,他需要'First'之前的'OrderBy'或者使用[predicate重載](http://msdn.microsoft.com/en-us/library/bb535050.aspx)。 –

0

假設你的例子是人爲的,你不想使用那些管道分隔鍵...

要做到這一點最簡單的方法是不使用Dictionary.Add(..),而是剛纔設置的值

test["1"] = "blue"; 
test["1"] = "NICE"; 
test["1"] = "Jaish"; 

Debug.Assert(test.Count == 1); 

但是,你必須決定,如果這是你想要的邏輯,它只是覆蓋每次

1

實施IEqualityComparer<string>這將不會允許您插入重複的項目

var test = new Dictionary<string, string>(new MyStringEqualityComparer()); 

...

public class MyStringEqualityComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Split('|')[0] == y.Split('|')[0]; 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.Split('|')[0].GetHashCode(); 
    } 
} 
+0

感謝分享你的想法,但我需要這種類型的字典。 – KCS

0

我認爲在你輸入的鍵|符號應該被解釋爲「或」。如果是這樣的話,你可以先打出鍵產生新的鍵值對每個關鍵部分:

var test2 = test.SelectMany(kvp => 
    kvp.Key.Split('|').Select(k => 
     new KeyValuePair<string, string>(k, kvp.Value))); 

...然後取適量的第一個值對每個新的關鍵:

var test3 = test2.GroupBy(kvp => kvp.Key) 
       .Select(g => g.First()) 
       .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
0

如果|意味着或然後你可以產生這樣一個新的獨特的字典。

var oredDict = new Dictionary<int, string>(); 
foreach (var kv in test.ToArray()) 
{ 
    var keys = kv.Key.Split('|').Select(int.Parse); 
    oredDict[keys.First() | keys.Last()] = kv.Value; 
}