2012-09-07 20 views
-1

如何刪除的項目我有從字典

Dictionary<string, List<string>> Dic = new Dictionary<string, List<string>>(); 

如何刪除第1,2,3元素自DIC。我不知道怎麼用「的foreach」

foreach (KeyValuePair<string, List<string>> kvPair in Dic) 
      { 
       Console.WriteLine(kvPair.Key); 
       foreach (string str in kvPair.Value) 
       { 

       } 
      } 
+4

請從http://msdn.microsoft.com/en-us/library/xfhwa508.aspx注意*爲了枚舉的目的,字典中的每個項目都被視爲一個KeyValuePair 結構,表示一個值及其關鍵字。項目返回的順序未定義* –

回答

10

您無法從字典中獲得項目1,2,3做到,你只能在關鍵的基礎上去除。

Dictionary MSDN

The order in which the items are returned is undefined.

您可以使用Orderby排序的一個關鍵的基礎上的字典。但要刪除字典中的項目,您需要密鑰。

Dictionary.Remove

編輯:根據你用「的foreach」

不能修改字典,而在它枚舉編輯的問題。如果試圖在foreach去除字典中的項目,你會得到錯誤:

Collection was modified; enumeration operation may not execute.

您可以轉換字典數組,然後從字典刪除的項目(類似下面,可以改善或改變,它只是一個想法):

 var dicArrray = Dic.ToArray(); 
     foreach (KeyValuePair<string, List<string>> kvPair in dicArrray) 
     { 
      if (kvPair.Key.Equals("1")) 
       Dic.Remove(kvPair.Key); 
     } 

但要記住,訂單中的項目將在數組是不確定的。您無法確定它

0

要刪除字典中的項目,請使用Remove()方法。例如:

Dictionary<string, List<string>> dictionary = new Dictionary<string, List<string>>(); 
dictionary.Add("1", new List<string()); 
dictionary.Remove("1"); 

不添加順序字典元素。不過,如果你想刪除的最高鍵,例如,做這樣的事情:

dictionary.Remove(dictionary.Keys.OrderBy().First()); 
+0

爲什麼字典不能與「for」配合使用? –

+0

@RadzhabAhvahsky:在我們回答這個問題之前,你必須給出更具體的細節。 –

+0

@RadzhabAhvahsky你只能在數組中使用'for',因爲索引總是一個整數。字典可以使用其他類型作爲索引。然而,你可以在'Keys'和'Values'屬性上使用'foreach',或者在'KeyPair '上使用字典本身。 – akton

0

第一,創建密鑰的集合要刪除:

var toDelete = new List<string>(); 
int count = 3; 
foreach(var pair in dictionary) { 
    toDelete.Add(pair.Key); 
    count -= 1; 
    if(count==0) break; 
} 

// then when ready - delete 
foreach(string key in toDelete) dictionary.Remove(key); 

原因是通過枚舉時刪除項目來使字典枚舉器無效。

也認爲密鑰對出現的順序沒有在規範中明確設置,因此您可能不會依賴它 - 即使它現在可行,它可能會停止在下一個版本的框架中工作。因此,在創建要刪除的元素列表之前,您還需要確定「前3個」的含義。

+0

你的第7行是寫'var toDelete = dictionary.Keys.Take(3).ToList()' –

+0

的很長一段路我很清楚這一點,但是這個問題提示了更簡單的語法。 – aiodintsov

0

如果dic是一個「簡單」的Dictionary,使用LINQ可以從原來的創建一個新的字典,並重新分配給dic,像這樣:

dic = dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value); 

正如在評論中指出astander並在Habib的答案,字典項目的順序是不確定的,所以你可能只想在SortedDictionary上應用這種技術。

在這種情況下,你需要從LINQ的結果中創建一個新的SortedDictionary

dic = new SortedDictionary<string, List<string>>(
      dic.Skip(3).ToDictionary(kv => kv.Key, kv => kv.Value));