2011-06-28 38 views
1

我有一個對象字典,所有不同的類型,但派生自相同的基類,並希望找到一個特定的。我想我可以使用「.OfType()」過濾給定類型的對象的字典,但沒有找到任何東西。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

這是因爲字典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

這樣的空查詢表達式也沒有意義。只是'critters.OfType ().FirstOrDefault()'將是最好的...... –

+0

+1喬恩Skeet同意,我上面更新。 – Nix

+0

0.1對於寬鬆vs失去:)。 – Shibumi

0

看起來它是因爲 「小動物」 字典。您應該爲查詢添加「值」屬性。請嘗試下一步:

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; 
    } 
+0

+1打我給它。 – RPM1984