C# 是否存在IsFixedSize为真的通用IDictionary实现?

C# 是否存在IsFixedSize为真的通用IDictionary实现?,c#,C#,我想知道在标准库中是否有一个IDictionary接口的实现,其属性为IsFixedSize==true 在我的代码中,我使用的是由枚举索引的字典,如下所示: Dictionary<EMyEnum, string> myDictionary = new Dictionary<EMyEnum, string>(); foreach (EMyEnum myEnum in Enum.GetValues(typeof(EMyEnum))) { m

我想知道在标准库中是否有一个IDictionary接口的实现,其属性为IsFixedSize==true

在我的代码中,我使用的是由枚举索引的字典,如下所示:

Dictionary<EMyEnum, string> myDictionary = new Dictionary<EMyEnum, string>();
    foreach (EMyEnum myEnum in Enum.GetValues(typeof(EMyEnum)))
    {
        m_myDictionary.Add(myEnum, "");
    }
enum EMyEnum
{
    meValue1,
    meValue2,
    meValue3
}
所以我的字典实际上有一个固定的大小。用字典来写它感觉有点“错误”,我想知道是否有更好的类型我错过了

我正在查找System.Collections.Generic和System.Collections命名空间,但找不到任何合适的名称

在回答其中一个问题时,枚举只是一组值,如下所示:

Dictionary<EMyEnum, string> myDictionary = new Dictionary<EMyEnum, string>();
    foreach (EMyEnum myEnum in Enum.GetValues(typeof(EMyEnum)))
    {
        m_myDictionary.Add(myEnum, "");
    }
enum EMyEnum
{
    meValue1,
    meValue2,
    meValue3
}
编辑:

我接受了supermem的答案,因为它最接近原始问题的要点。为了详细说明我最初的担忧,一个普通字典可以删除其中一个键/项,然后任何依赖于迭代字典的键也会迭代enum的所有值这一事实的代码都将被破坏

我知道我可以创建一个固定大小的数组,但将枚举强制转换为int并不是很好,而且它只适用于连续的枚举(在我的例子中已经足够好了)


我认为使用枚举值作为键的Dictionary是一个很好的例子,遗憾的是,这样的类没有随.Net一起提供。

不,CLR中没有固定大小的IDictionary实现。(只读*排序除外,但不适用于您的问题。)


您可以自己使用,但除非您已经分析了这段代码,并确定字典的使用存在一个有意义的瓶颈(依我看,这是非常罕见的),否则我会说保持原样。您还可以从可读性中获益,因为字典非常容易理解和阅读。

.NET4.5实际上引入了一个新的界面,听起来它可能就是您所需要的,
IReadOnlyDictionary


另外,
IReadOnlyList

如果您使用的是简单的
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] = "";
类枚举字典
{
私有只读ValueType[]数组=新的ValueType[Enum.GetValues(typeof(EnumType)).Length];
public ValueType此[EnumType索引]
{
获取{返回数组[Convert.ToInt32(索引)];}
设置{array[Convert.ToInt32(index)]=value;}
}
}
EnumDictionary EnumDictionary=新建EnumDictionary();
foreach(Enum.GetValues中的EMyEnum myEnum(typeof(EnumType))
enumDictionary[myEnum]=“”;

现在,如果这比使用<代码>字典更好,这是一个完全不同的讨论。

它是什么类型的<代码>枚举呢?我们能看到它的实际代码吗?它没有错。继续。你的<代码>枚举的值是连续的,还是你手动分配它们(例如,作为两个幂的列表)?如果您查看MSDN上的文档,那么字典是相当大的,因此您可以像以下字典一样初始化字典myDictionary=new Dictionary(100);这就是所谓的能力。如果它真的困扰你,你可以使用
KeyValuePair
数组。我不会这么做。谢谢。我开始按照这些思路编写一些东西,但后来发现这个系统。Enum不能用作泛型的约束。在你的代码中,应该验证EnumType实际上是一个Enum。确切地说,System.Enum不是一个有效的约束。如果将非Enum作为第一个类型,则在运行时该约束将中断