是否有一个通用的字典实现,其中IsFixedSize为True
本文关键字:其中 IsFixedSize True 实现 字典 有一个 是否 | 更新日期: 2023-09-27 18:18:33
我想知道在标准库中是否有一个具有属性IsFixedSize == true的字典接口的实现。
在我的代码中,我使用一个由enum索引的Dictionary,如下所示:
Dictionary<EMyEnum, string> myDictionary = new Dictionary<EMyEnum, string>();
我总是在字典中为MyEnum的所有可能值设置值,使用如下代码:
foreach (EMyEnum myEnum in Enum.GetValues(typeof(EMyEnum)))
{
m_myDictionary.Add(myEnum, "");
}
所以我的字典实际上有一个固定的大小。它感觉有点"错误"使用字典,我想知道是否有一个更好的类型,我错过了。
我正在查找System. collections . generic和System。集合命名空间,但找不到合适的。
在回答其中一个问题时,枚举只是一堆值,如下所示:
enum EMyEnum
{
meValue1,
meValue2,
meValue3
}
编辑:我接受了supermem的回答,因为它最切中问题的要害。为了详细说明我最初的问题,一个普通的字典可以删除其中一个键/项,然后任何依赖于迭代字典的键也迭代enum的所有值的代码都将被破坏。
我知道我可以创建一个固定大小的数组,但是将枚举转换为整型并不是那么漂亮,除此之外,它只适用于连续的枚举(在我的情况下已经足够好了)。
我认为用枚举值作为键的Dictionary是一个很好的例子,遗憾的是。net没有附带这样的类。
。. Net 4.5实际上引入了一个新的接口,听起来可能是您需要的,IReadOnlyDictionary<TKey, TValue>
。
同样,IReadOnlyList<T>
不,CLR中没有固定大小的字典实现。(除了ReadOnly*排序,但不适用于您的问题。)
您可以自己编写,但除非您对这段代码进行了分析,并确定使用Dictionary会产生有意义的瓶颈(在我看来,这种情况非常罕见),否则我建议保持它的原封不动。您还可以获得可读性的好处,因为Dictionary非常易于理解和理解。
如果您正在使用简单的enum
声明,而不是显式地为元素赋值,则可以仅使用数组:
Array values = Enum.GetValues(typeof(EMyEnum));
string[] myDictionary = new string[values.Length];
foreach (EMyEnum myEnum in values)
{
myDictionary[(int)myEnum] = "";
}
您甚至可以将此方法包装在自定义类中,该类将枚举类型视为索引器,如果您对int
的显式强制转换感到困扰:
class EnumDictionary<EnumType, ValueType>
{
private readonly ValueType[] array = new ValueType[Enum.GetValues(typeof(EnumType)).Length];
public ValueType this[EnumType index]
{
get { return array[Convert.ToInt32(index)]; }
set { array[Convert.ToInt32(index)] = value; }
}
}
EnumDictionary<EMyEnum, string> enumDictionary = new EnumDictionary<EMyEnum, string>();
foreach ( EMyEnum myEnum in Enum.GetValues(typeof(EnumType))
enumDictionary[myEnum] = "";
现在,如果比使用Dictionary
更好,或者不使用是完全不同的讨论。