【发布时间】:2013-11-08 22:45:57
【问题描述】:
如果我有
List<MyClass> MyObj;
我可以像这样访问特定成员:
MyObj[0] = new MyClass();
但前段时间,我在 msdn 的某个地方读到过,可以像这样访问我的对象:
MyObj["mykey"] = new MyClass();
这可能吗,还是我在这里编造的?
【问题讨论】:
标签: c#
如果我有
List<MyClass> MyObj;
我可以像这样访问特定成员:
MyObj[0] = new MyClass();
但前段时间,我在 msdn 的某个地方读到过,可以像这样访问我的对象:
MyObj["mykey"] = new MyClass();
这可能吗,还是我在这里编造的?
【问题讨论】:
标签: c#
在List 中这是不可能的,因为它只有int 索引器(this[int index]),它允许按索引获取对象。
为此,您应该使用Dictionary<string, MyClass>,这将允许您通过键获取对象,例如:
MyDictionary["MyKey"] = new MyClass();
【讨论】:
索引器采用字符串的方式有很多种。您可能正在查看Dictionary。
【讨论】:
不是直接的,因为 List<T> 只有一个 int 索引器。但是,如果您想通过属性查找对象,您可以使用 LINQ:
MyClass obj = MyObj.FirstOrDefault(c => c.SomeProp == "mykey");
if(obj != null)
{
// yes
}
另一种方法是使用Dictionary<string, MyClass>(键必须是唯一的):
MyClass obj;
if(MyObjDictionary.TryGetValue("mykey", out obj))
{
// yes
}
【讨论】:
好吧,这可能通过this 覆盖实现,例如:
public class MyClass : List<int>
{
public int this[string key] {
get {
return this.Where(x=>x==int.Parse(key)).SingleOrDefault();
}
}
}
所以在代码中你会像这样使用它:
var a = new MyClass() {1,2,3,4,5,6,7};
a["5"]; //this will return 5 integer
不需要任何字典或额外的数据结构。值得一提的是,在这种情况下,您可能在大型集合上遇到性能问题,但如果您的集合足够小,请继续使用。
【讨论】: