【问题标题】:C# Reference object in a collection by a string instead of integerC# 通过字符串而不是整数在集合中引用对象
【发布时间】:2011-11-09 21:47:10
【问题描述】:

我有一个存储在列表中的对象集合。

我想使用字符串名称而不是整数来寻址对象。

List<Foo> fooList = new List<Foo>;
Foo item = fooList["Foo Name"]

代替:

List<Foo> fooList = new List<Foo>;
Foo item = fooList[0]

我在想我需要创建一个从 List 继承的集合类,但我不确定。

【问题讨论】:

  • 词典呢?

标签: c# list collections


【解决方案1】:

Dictionary&lt;string, Foo&gt; 是你想要的类型。

【讨论】:

  • 啊啊啊啊!我知道这很简单;p
  • 不错的是,您可以使用任何对象作为键,而不仅仅是字符串或整数
【解决方案2】:

Joren 的答案是首选,但如果您需要为其他一些逻辑保留顺序,并且您想要引用该对象的名称可以是该对象的成员,那么一点 Linq 也可以做到诀窍:

List<Foo> fooList = new List<Foo>;
Foo item = fooList.FirstOrDefault(f=>f.Name == "Foo Name");

您可以将其放入从列表派生的自定义集合的“索引器”属性中:

public class MyList:List<Foo>
{
   public Foo this[string name]
   {
      get { return this.FirstOrDefault(f=>f.Name == "Foo Name"); }
   }
}

...它允许您获得所需的确切语法,同时保持顺序排序(字典不能保证)

【讨论】:

    【解决方案3】:

    你可以使用Dictionary&lt;string,Your_Object_type&gt;;

    由于您不关心顺序,这是最简单的方法。

    【讨论】:

      【解决方案4】:

      您始终可以使用字典。然后你可以这样做:

      var fooList = new Dictionary<string, Foo>();
      fooList.Add("Foo Name", new Foo());
      var item = fooList["Foo Name"];
      

      【讨论】:

        【解决方案5】:

        您需要Dictionary&lt;TKey, TValue&gt;,而不是List&lt;T&gt;

        Dictionary<string, Foo> fooDictionary = new Dictionary<string, Foo>();
        
        fooDictionary.Add("Foo Name", new Foo());
        Foo myFoo = fooDictionary["Foo Name"];
        

        【讨论】:

          【解决方案6】:

          您需要编写自己的索引器,例如

              public datat-type this[int x]
              {
              get{
              //getter code
              }
              set{
              //Setter code
              }
              }
              public data-type this[string x]
              {
              get{
              //setter code
              }
              set{
              //setter doe
              }
              }
          

          【讨论】:

          • 就其本身而言,这将一事无成。将“foo name”变为0的核心逻辑是逻辑中比较重要的部分。
          • 他还说如果他继承做一个新的类
          【解决方案7】:

          可以将 List.Find 与谓词一起使用,而不是使用字典。请注意,这是字典的替代方法,但在如何找到项目(对象)方面提供了灵活性。名称将是 Foo 的字符串属性。

          例子:

          List<Foo> fooList = new List<Foo>; 
          Foo item = fooList["Foo Name"] 
          
          //Find Using Inline 
          Foo foo = fooList.Find(delegate(Foo f) { return f.Name == "Foo Name"; });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多