IEnumerable.OfType()无法按预期工作

时间:2011-06-28 12:29:24

标签: linq ienumerable

我有一个对象字典,所有不同的类型,但派生自相同的基类,并希望找到一个特定的。我以为我可以使用“.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 { }

谢谢,

罗斯

2 个答案:

答案 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;
  }