C # Ссылочный объект в коллекции по строке вместо целого числа - PullRequest
5 голосов
/ 10 ноября 2011

У меня есть коллекция объектов, хранящихся в списке.

Я хотел бы обратиться к объекту, используя строковое имя вместо целого числа.

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

вместо:

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

Я думал, что мне нужно создать класс коллекции, который наследуется от List, но оттуда я не уверен.

Ответы [ 7 ]

14 голосов
/ 10 ноября 2011

Dictionary<string, Foo> - это тип, который вы хотите.

2 голосов
/ 10 ноября 2011

Ответ Джорена - переход, но если вам нужно сохранить последовательный порядок для какой-то другой логики, И имя, к которому вы хотите обратиться к объекту, может быть членом этого объекта, чем маленький Linq также может сделать хитрость:

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

Вы можете поместить это в свойство indexer пользовательской коллекции, которая выводится из списка:

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

... который позволяет вам получить желаемый синтаксис, поддерживая последовательное упорядочение (что не гарантируется при использовании словаря)

1 голос
/ 10 ноября 2011

Вы можете просто использовать Dictionary<string,Your_Object_type>;

Так как вам не нужен последовательный порядок, это самый простой способ.

0 голосов
/ 10 ноября 2011

Вместо использования словаря можно использовать 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"; });
0 голосов
/ 10 ноября 2011

вам нужно написать свой собственный индексатор, например

    public datat-type this[int x]
    {
    get{
    //getter code
    }
    set{
    //Setter code
    }
    }
    public data-type this[string x]
    {
    get{
    //setter code
    }
    set{
    //setter doe
    }
    }
0 голосов
/ 10 ноября 2011

Вместо List<T> вам понадобится Dictionary<TKey, TValue>.

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

fooDictionary.Add("Foo Name", new Foo());
Foo myFoo = fooDictionary["Foo Name"];
0 голосов
/ 10 ноября 2011

Вы всегда можете использовать словарь. Тогда вы можете сделать:

var fooList = new Dictionary<string, Foo>();
fooList.Add("Foo Name", new Foo());
var item = fooList["Foo Name"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...