【问题标题】:List to be accessible only with Enumeration列表只能通过枚举访问
【发布时间】:2014-07-07 09:38:18
【问题描述】:

制作只能由enum 访问的System.Collections.Generic.List 的最佳方法是什么?为了帮助描述我在寻找什么,这是我现在的做法:

enum MyEnum
{
    First,
    Second,
    Count
}

class MyClass
{
    List<SomeClass> myList = new List<SomeClass>((int)MyEnum.Count);

    MyClass()
    {
        myList[(int)MyEnum.First] = new SomeClass(1);
        myList[(int)MyEnum.Second] = new SomeClass(2);
    }
}

我觉得我错过了什么。有没有更好的方法来做到这一点?很抱歉,如果答案是显而易见的,我发现很难搜索听起来如此笼统的东西。


作为一些背景知识,我将使用此列表来访问我的代码中的不同纹理,例如enum 将具有纹理名称,每个纹理将被放入并稍后使用该纹理名称从 List 访问。

【问题讨论】:

  • 改用Dictionary&lt;MyEnum,SomeClass&gt;
  • 为什么不在MyClass 上简单地拥有三个(或两个)属性?

标签: c# list enums


【解决方案1】:

是否可以使用Dictionary 代替List

var myDict = new Dictionary<MyEnum, SomeClass>();
...
myDict[MyEnum.First] = new SomeClass(1);
myDict[MyEnum.Second] = new SomeClass(2);

或者,正如@JimHurley 建议的那样(参见http://msdn.microsoft.com/en-us/library/bb531208.aspx

var myDict = new Dictionary<MyEnum, SomeClass>()
{
    { MyEnum.First, new SomeClass(1)},
    { MyEnum.Second, new SomeClass(2)}
};

【讨论】:

  • 我根本不明白Dictionary&lt;MyEnum, SomeClass&gt; 类型的用途,MyEnum 只是用来分隔不同的对象。为什么不只使用属性?
  • 这样我可以通过一个方法作为参数传递字典。
  • @IlyaIvanov 例如,能够枚举字典中的所有值。
  • @JimHurley 在没有一些合理的情况下什么也说不出来。实际上,您会得到最大容量为两对的字典的行为。但是myDict[MyEnum.Count] = new SomeClass(3); 呢?这有效吗?
  • MyEnum.Count 仅在获取列表大小之前是必需的(当我用 C++ 编写数组时,这是我的常见做法)。
【解决方案2】:

如果您想向List&lt;T&gt; 添加一个新元素,您必须使用它的Add 方法。索引器可以用于修改现有项目。我认为在这种情况下使用Dictionary&lt;MyEnum, SomeClass&gt; 会更合适。

【讨论】:

  • 我不能使用索引器,因为我用适当大小的默认值初始化了列表? List&lt;SomeClass&gt; myList = new List&lt;SomeClass&gt;((int)MyEnum.Count);
  • @JimHurley 不,因为它只是设置容量,它不会增加计数。请参阅我的old question 和答案以获取更多信息:
猜你喜欢
  • 2019-09-13
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 2013-06-09
  • 2011-03-05
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多