我有一个对象字典,所有不同的类型,但派生自相同的基类,并希望找到一个特定的。我以为我可以使用“.OfType()”过滤给定类型对象的字典,但没有找到任何内容。
我不明白什么?
class Program
{
static Dictionary<String, Animal> critters;
static void Main(string[] args)
{
critters = new Dictionary<String, Animal>();
critters.Add("Tiddles", new Cat());
critters.Add("Rover", new Dog());
critters.Add("Bob", new Fish());
Animal rover = GetAnimal<Dog>();
}
// Finds first animal of the specified type.
static T GetAnimal<T>() where T : Animal
{
var qry = from animal in critters.OfType<T>()
select animal;
return (qry.Count() > 0) ? qry.First() : null;
}
}
class Animal { }
class Dog : Animal { }
class Cat : Animal { }
class Fish : Animal { }
谢谢,
罗斯
答案 0 :(得分:2)
这是因为字典IEnumarable正在返回<KeyValuePair<TKey, TValue>
。使用其中的Values。
我还建议您从
更改GetAnimal中的最后一行return (qry.Count() > 0) ? qry.First() : null;
没有必要在qry上浪费.Count()操作,只需使用FirstOrDefault,就可以做同样的事情。
return qry.FirstOrDefault();
您可以减少它,并且不会失去任何可读性:
return critters.Values.OfType<T>().FirstOrDefault();
答案 1 :(得分:0)
看起来这是因为“小动物”字典。您应该在查询中添加“Values”属性。尝试下一步:
static T GetAnimal<T>() where T : Animal
{
var qry = from animal in critters.Values.OfType<T>()
select animal;
return (qry.Count() > 0) ? qry.First() : null;
}