2012-07-15 51 views
3

我有了這個枚舉標誌:如何將枚舉標誌與Dictionary關鍵字進行比較?

[Flags()] 
public enum Levels 
{ 
    Beginner, Medium, Advanced, Master 
} 

我有一個叫做銀行,在那裏,這是一個Dictionary<Levels, ...>和層次上,你可以選擇的可能選項屬性

讓我們去假設我的第一個KeyValuePair包含以下Key = Levels.Beginner | Levels.Medium | Levels. Advanced。因此,如果我輸入字典Levels.Medium,則返回最後一個對象,因爲Medium是可能的值。

public Worksheet LoadWorksheet(Levels level) 
{ 
    Worksheet worksheet = new Worksheet(this.Bank[level].Value, this.Bank[level].Key); 
    return worksheet; 
} 

但不幸的是,當我這樣做時,會引發錯誤指出密鑰不存在。我該如何配合鑰匙?

回答

2

首先,我要指出的是,如果:

Levels keyA = Levels.Beginner | Levels.Medium | Levels. Advanced; 
Levels keyB = Levels.Medium; 

則:

Debug.Assert(keyA.GetHashCode() != keyB.GetHashCode()); 
Debug.Assert(keyA != keyB); 

當尋找在字典中的值,該字典第一個使用密鑰的哈希值,以確定正確的桶,然後使用相等比較來標識桶中的右鍵。

如果散列值不相等,則不會找到密鑰。如果鍵值不相等,則不會找到該值。

你可以看到,如果是位模式獲得具有含Levels.Medium一個關鍵的所有條目存在於具有以下LINQ表達的關鍵:

var mediumEntries = Bank.Where(entry => 0 != ((int)entry.Key & (int)Levels.Medium)); 

或者,如@Ria指出,英寸網4您可以使用HasFlags成員:

var mediumEntries = Bank.Where(entry => entry.Key.HasFlag(Levels.Medium)); 

好點在另一個答案(@dasblinkenlight,@Ria)您的枚舉值需要有非重疊這個工作位模式提出:

[Flags()]   
public enum Levels   
{   
    Beginner = 0x01, 
    Medium = 0x02, 
    Advanced = 0x04, 
    Master = 0x08 
} 
+0

我明白了,但在這種情況下,我該如何處理這個問題?在這種情況下,keyB在A中包含一個值,所以我試圖匹配..但我不知道 – 2012-07-15 05:15:43

+0

@DarfZon我想要拿出一個示例。什麼是KeyValuePair值的類型? – 2012-07-15 05:16:27

+0

這是一個列表其中T是一個自定義類 – 2012-07-15 05:18:53

0

以2的冪次定義枚舉常量,即1,2,4,8等等。這意味着合併枚舉常量的個人標誌不重疊:

[Flags] 
public enum Levels 
{ 
    Beginner = 1, 
    Medium = 2, 
    Advanced = 4, 
    Master = 8 
} 

,你必須定義詞典Key作爲整數:Dictionary<int, ...>。和轉換爲int添加到字典時:使用.NET4使用HasFlag

if (this.Bank[level].Key.HasFlag(Levels.Advanced)) 
{ 
    // Do something 
} 

注意

if ((this.Bank[level].Key & Levels.Advanced) == Levels.Advanced) 
{ 
    // Do something 
} 

,如果:

Bank.Add((int) (Levels.Medium|Levels.Master), ...); 

然後比較關鍵枚舉標誌:

Dictionary.Key必須是唯一的。否則在嘗試添加重複鍵時拋出ArgumentException。因此Flag枚舉不建議用於Dictionary.Key。嘗試存儲一些地方。

+0

爲什麼鍵類型必須是'int'?這不就是說,OP將不得不始終將關鍵值轉換回枚舉類型?我認爲在執行按位操作時將枚舉值轉換爲int更好。 – 2012-07-15 05:45:47