是否有一个通用的字典实现,其中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没有附带这样的类。

是否有一个通用的字典实现,其中IsFixedSize为True

。. 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更好,或者不使用是完全不同的讨论。