Могу ли я ссылаться на объект в коллекции по его имени? - PullRequest
0 голосов
/ 24 июля 2011

У меня есть объект Collection (основанный на System.Collections.CollectionBase), но для доступа к значениям объектов в этой коллекции я должен использовать индекс в настоящее время.Можно ли получить значения, основанные на имени объекта в коллекции?

Например, вместо ...

MyCollection[0].Value

... как я могу что-то сделать вместестроки:

MyCollection["Birthday"].Value

Ответы [ 6 ]

4 голосов
/ 24 июля 2011

Для этого вам понадобится Dictionary<string,object>.К сожалению, коллекции разрешают только произвольный доступ по индексу.

Вы можете сделать что-то вроде этого:

var item = MyCollection
              .Where(x => x.SomeProp == "Birthday")
              .FirstOrDefault();

// careful - item could be null here
var value = item.Value;

Но это будет далеко не так эффективно, как произвольный доступ по индексу.

2 голосов
/ 24 июля 2011

Как уже говорили другие, вам нужен словарь <> , чтобы сделать это. Если вы не можете изменить код, который предоставляет коллекцию, вы можете использовать метод LINQ ToDictionary () , чтобы самостоятельно преобразовать его в словарь:

var dict = MyCollection.ToDictionary(obj => obj.Name);

С этого момента вы можете сделать:

var value = dict["Birthday"].Value;
2 голосов
/ 24 июля 2011

Почему вы думаете, что объекты в коллекции имеют имена?Они неЧто вы можете сделать, это использовать Dictionary<String, SomethingElse> для включения вашего синтаксиса.

2 голосов
/ 24 июля 2011

Вы можете использовать Dictionary<TKey, TValue>, который позволяет получить доступ к его элементу с помощью ключа. Поэтому, если ключ в вашем примере - строка, вы можете использовать Dictionary<string, TValue>.

1 голос
/ 24 июля 2011

Вы можете использовать этот [] аксессор

public Item this[string name]
{
get
{
  // iterate through the elements of the collection 
  //and return the one that matches with name
}
}

Имейте это свойство getter на вашем MyCollectionClass

0 голосов
/ 24 июля 2011

Один обходной путь может быть

private const int BIRTHDAY = 0;

var value = MyCollection["Birthday"].Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...