我有这个枚举标志:

[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/

10-11 01:43