C#通过字符串而不是整数引用集合中的引用对象

时间:2011-11-09 21:47:10

标签: c# list collections

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

我想通过使用字符串名称而不是整数来解决对象。

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

而不是:

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

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

7 个答案:

答案 0 :(得分:14)

Dictionary<string, Foo>是您想要的类型。

答案 1 :(得分:2)

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

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

您可以将其放入源自list:

的自定义集合的“indexer”属性中
public class MyList:List<Foo>
{
   public Foo this[string name]
   {
      get { return this.FirstOrDefault(f=>f.Name == "Foo Name"); }
   }
}

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

答案 2 :(得分:1)

您可以使用Dictionary<string,Your_Object_type>;

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

而不是List<T>,您需要Dictionary<TKey, TValue>

Dictionary<string, Foo> fooDictionary = new Dictionary<string, Foo>();

fooDictionary.Add("Foo Name", new Foo());
Foo myFoo = fooDictionary["Foo Name"];

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

可以将List.Find与谓词一起使用,而不是使用字典。请注意,这是字典的替代方法,但可以灵活地找到项(对象)的方式。 Name将是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"; });