2010-07-06 72 views
2

什麼是「重置」Dictionary<int, bool>結構類型(將所有值設置爲truefalse)的最佳方法是什麼?目前我正在使用ToDictionary()擴展方法。有沒有辦法通過重用當前實例來做到這一點?設置IDictionary的所有值

此代碼拋出一個異常:

[TestFixture] 
public class Sample 
{ 
    [Test] 
    public void SampleTest() 
    { 
     var dictionary = new Dictionary<int, bool>{{1, false}, {2, true}, {3, false}}; 
     foreach (var key in dictionary.Keys) 
     { 
      dictionary[key] = true; 
     } 

     Assert.That(dictionary[3], Is.True); 
    } 
} 
+0

你能澄清還是添加幾行代碼?從它的聲音,我認爲你想設置字典中的每個項目的特定值,除非有一個內置的方法,它聽起來像一個foreach循環... – Kendrick 2010-07-06 13:29:29

+0

循環在字典中的所有鍵,並設置他們的價值觀是「真」還是「虛」?我懷疑是否有更有效的方法 - 並且它的可讀性可能幾乎不會比使用相同的令人費解的LINQ語句更難讀。 – Joey 2010-07-06 13:29:57

+0

@Kendrick,是的我想要設置所有的值,foreach循環拋出一個集合修改的異常 – Kimi 2010-07-06 13:31:11

回答

11
foreach (int key in dictionary.Keys.ToList()) 
    dictionary[key] = true; 
+0

我還沒有做過任何測試,但我認爲這是不必要地創建一個List來循環,而循環的KeyValuePair將是更快:'foreach(var kvp in dictionary)dictionary [kvp.Key] = true;' – manixrock 2010-07-06 14:31:48

+1

@manixrock,你的建議會拋出同樣的異常,因爲它試圖修改正在循環的集合。對ToList的調用的重點是完全創建和循環不同的集合。 – 2010-07-06 14:58:00

2

順便說一句,你不妨考慮使用BitArray類(System.Collections.BitArray)。它有一個SetAll方法,將所有位設置爲true或false:

BitArray ba = new BitArray(8); //BitArray with 8 bits 

ba[3] = true; //set some bits 
ba[6] = true; 

ba.SetAll(false); //Clear all 

如果你不需要字典,你可以考慮這個類。

+0

對於BitArray爲+1,但在這種情況下,它必須是字典(非順序ID)。 – Kimi 2010-07-07 09:42:17