【问题标题】:Accessing List<MyClass> through string index通过字符串索引访问 List<MyClass>
【发布时间】:2013-11-08 22:45:57
【问题描述】:

如果我有

List<MyClass> MyObj;

我可以像这样访问特定成员:

MyObj[0] = new MyClass();

但前段时间,我在 msdn 的某个地方读到过,可以像这样访问我的对象:

MyObj["mykey"] = new MyClass();

这可能吗,还是我在这里编造的?

【问题讨论】:

    标签: c#


    【解决方案1】:

    List 中这是不可能的,因为它只有int 索引器(this[int index]),它允许按索引获取对象。

    为此,您应该使用Dictionary&lt;string, MyClass&gt;,这将允许您通过键获取对象,例如:

    MyDictionary["MyKey"] = new MyClass();
    

    MSDN Dictionary

    【讨论】:

      【解决方案2】:

      索引器采用字符串的方式有很多种。您可能正在查看Dictionary

      【讨论】:

        【解决方案3】:

        不是直接的,因为 List&lt;T&gt; 只有一个 int 索引器。但是,如果您想通过属性查找对象,您可以使用 LINQ:

        MyClass obj = MyObj.FirstOrDefault(c => c.SomeProp == "mykey");
        if(obj != null)
        {
           // yes
        }
        

        另一种方法是使用Dictionary&lt;string, MyClass&gt;(键必须是唯一的):

        MyClass obj;
        if(MyObjDictionary.TryGetValue("mykey", out obj))
        {
            // yes
        }
        

        【讨论】:

          【解决方案4】:

          好吧,这可能通过this 覆盖实现,例如:

          public class MyClass : List<int> 
          {
              public int this[string key] {
                  get {
                      return this.Where(x=>x==int.Parse(key)).SingleOrDefault();
                  }
              }
          }
          

          所以在代码中你会像这样使用它:

            var a = new MyClass() {1,2,3,4,5,6,7}; 
            a["5"]; //this will return 5 integer
          

          不需要任何字典或额外的数据结构。值得一提的是,在这种情况下,您可能在大型集合上遇到性能问题,但如果您的集合足够小,请继续使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-15
            • 1970-01-01
            • 2019-05-28
            • 2012-05-13
            • 2015-10-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多