gpt4 book ai didi

c# - 如何将枚举标志与字典键进行比较?

转载 作者:行者123 更新时间:2023-11-30 17:11:12 28 4
gpt4 key购买 nike

我有这个枚举标志:

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

我有一个名为 Bank 的属性,这是一个 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;
}

但不幸的是,当我这样做时,抛出一个错误指出 key 不存在。我该怎么做才能匹配 key ?

最佳答案

首先,我应该指出,如果:

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

然后:

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

在字典中查找值时,字典首先使用键的哈希值来确定正确的桶,然后通过相等比较来确定桶中正确的键。

如果哈希值不相等,则无法找到 key 。如果键值不相等,则找不到该值。

您可以获取所有具有包含 Levels.Medium 的键的条目,方法是使用以下 LINQ 表达式查看键中是否存在位模式:

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com