我想知道标准库中是否有IDictionary接口的实现,它具有IsFixedSize == true属性。
在我的代码中,我使用的是由枚举索引的词典,如下所示:
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.Collections命名空间但找不到合适的内容。
在回答其中一个问题时,枚举只是一堆价值观,如下:
enum EMyEnum
{
meValue1,
meValue2,
meValue3
}
编辑:
我已经接受了supermem的答案,因为它最符合原始问题。为了详细阐述我最初的关注点,普通字典可以删除其中一个键/项,然后依赖于遍历字典键的迭代遍历所有枚举值的任何代码都将被破坏。
我知道我可以创建一个固定大小的数组但是将枚举转换为整数并不是那么漂亮,除了它只适用于连续的枚举(在我的情况下足够好)。
我认为Dictionary有一个很好的例子,它将枚举值作为键,很遗憾这样的类没有附带.Net。
答案 0 :(得分:1)
.Net 4.5实际上引入了一个听起来像你需要的新界面IReadOnlyDictionary<TKey, TValue>
。
此外,IReadOnlyList<T>
答案 1 :(得分:0)
不,CLR没有固定大小的IDictionary实现。 (除了ReadOnly *排序,但不适用于您的问题。)
你可以自己动手,但除非你已经对这段代码进行了描述并确定使用词典提出了一个有意义的瓶颈(IMO,非常罕见),我会说保持原样。您还可以获得可读性,因为词典非常容易理解且易于理解。
答案 2 :(得分:0)
如果您使用简单的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
,那么这是完全不同的讨论。