我可以用它的名字引用集合中的对象吗?

时间:2011-07-24 10:59:17

标签: c# collections dictionary

我有一个Collection对象(基于System.Collections.CollectionBase)但是为了访问该集合中对象的值,我必须使用当前的索引。是否可以根据集合中对象的名称获取值?

例如,而不是......

MyCollection[0].Value

......我怎么能按照以下方式做点什么:

MyCollection["Birthday"].Value

6 个答案:

答案 0 :(得分:4)

为了做到这一点,你需要Dictionary<string,object>。不幸的是,集合只允许通过索引进行随机访问。

你可以这样做:

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

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

但这远不如索引随机访问那么高效。

答案 1 :(得分:2)

您可以使用Dictionary<TKey, TValue>,它允许您通过键访问其元素。因此,如果示例中的键是字符串,则可以使用Dictionary<string, TValue>

答案 2 :(得分:2)

为什么你认为集合中的对象有名字?他们没有。您可以使用Dictionary<String, SomethingElse>启用语法。

答案 3 :(得分:2)

正如其他人所说,你需要Dictionary<>才能做到这一点。如果您无法更改提供集合的代码,您可以使用LINQ的ToDictionary()方法将其自身转换为字典:

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

从那以后,你可以这样做:

var value = dict["Birthday"].Value;

答案 4 :(得分:1)

您可以使用此[]访问者

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

在MyCollectionClass上有这个getter属性

答案 5 :(得分:0)

一种解决方法可能是

private const int BIRTHDAY = 0;

var value = MyCollection["Birthday"].Value;