2011-11-24 75 views
1

我不能擁有相同的密鑰。但是一個簡單的(和有效的)解決方案是在關鍵之後加上一個後綴。避免字典中帶有後綴的相同密鑰錯誤

但是,因爲我在foreach中,我想知道一個快速而乾淨的方式來添加一個數字後綴重複鍵。

如:

我的foreach是:

foreach (Item item in items) { 
    dic.Add(item.SomeKey, item.SomeValue); 
} 

但我不想重複鍵,所以我需要 '把手' SomeKey到Origin成爲Result

SomeKey來源: key, clave, clave, chave, chave, chave
SomeKey結果:key, clave, clave1, chave, chave1, chave2


編輯: 我對@KooKiz的回答更好地解釋了這個問題。

我有幾個重複的條目。我只是想弄清楚如何then increment the suffix until you find no item。聽起來像重塑車輪,所以我想知道,如果有人知道一個很好的辦法做到這一點

+1

難道你不能只是添加一個簡單的增量整數,你的循環之外,你打電話++?像count = 0一樣,每個鍵上的數字都是++? –

+0

你的意思是你不能有重複的密鑰,因爲'Dictionary'不允許他們,或者是否有其他地方的要求非重複密鑰的要求? 'NameValueCollection'的工作方式與'Dictionary'幾乎一樣,但允許重複鍵。 – WickyNilliams

+4

如果你想要複製密鑰,你爲什麼要使用字典? –

回答

2

這也許不是最快,但這是我能想到的更具可讀性:

 var source = new List<Tuple<string, string>> 
     { 
      new Tuple<string, string>("a", "a"), 
      new Tuple<string, string>("a", "b"), 
      new Tuple<string, string>("b", "c"), 
      new Tuple<string, string>("b", "d"), 
     }; 

     var groups = source.GroupBy(t => t.Item1, t => t.Item2); 

     var result = new Dictionary<string, string>(); 

     foreach (var group in groups) 
     { 
      int index = 0; 

      foreach (var value in group) 
      { 
       string key = group.Key; 

       if (index > 0) 
       { 
        key += index; 
       } 

       result.Add(key, value); 

       index++; 
      } 
     } 

     foreach (var kvp in result) 
     { 
      Console.WriteLine("{0} => {1}", kvp.Key, kvp.Value); 
     } 
1

如果你想用幾個「子」項目的關鍵,試試這個

Dictionary<string, List<string>> myList = new Dictionary<string, List<string>>(); 
foreach (Item item in items) 
{ 
    if (myList[item.SomeKey] == null) 
     myList.Add(item.SomeKey, new List<string>()); 
    myList[item.SomeKey].Add(item.SomeValue); 
} 
+0

或items.GroupBy(i => i.SomeKey,i => i.SomeValue) –

+0

不,我想處理我的item.SomeKey列表中沒有重複 – Custodio

0
var a = items.GroupBy(p => p.SomeKey) 
.SelectMany(q => q.Select((value, index) => 
new Item { SomeKey = (q.Count() > 1 && index > 0) ? value.SomeKey + (index) : 
     value.SomeKey, SomeValue = value.SomeValue })) 
.ToDictionary(p => p.SomeKey, q => q.SomeValue); 
相關問題