我有这个枚举标志:
[Flags()]
public enum Levels
{
Beginner, Medium, Advanced, Master
}
我有一个名为Bank的属性,这是一个
Dictionary<Levels, ...>
,并且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;
}
但是不幸的是,当我这样做时,抛出一个错误,指出该键不存在。如何匹配钥匙?
最佳答案
首先,我应该指出:
Levels keyA = Levels.Beginner | Levels.Medium | Levels. Advanced;
Levels keyB = Levels.Medium;
然后:
Debug.Assert(keyA.GetHashCode() != keyB.GetHashCode());
Debug.Assert(keyA != keyB);
在字典中查找值时,字典首先使用键的哈希值来确定正确的存储桶,然后使用相等比较来确定存储桶中的正确键。
如果哈希值不相等,则找不到密钥。如果键值不相等,则将找不到该值。
通过使用以下LINQ表达式查看密钥中是否存在位模式,可以获取具有包含
Levels.Medium
的密钥的所有条目:var mediumEntries = Bank.Where(entry => 0 != ((int)entry.Key & (int)Levels.Medium));
或者,正如@Ria所指出的,在.Net 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
}
关于c# - 如何将枚举标志与字典键进行比较?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11489556/