我有一个Collection对象(基于System.Collections.CollectionBase)但是为了访问该集合中对象的值,我必须使用当前的索引。是否可以根据集合中对象的名称获取值?
例如,而不是......
MyCollection[0].Value
......我怎么能按照以下方式做点什么:
MyCollection["Birthday"].Value
答案 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;