我正确使用LINQ .OfType()运算符吗?

时间:2012-08-22 01:03:21

标签: c# .net linq

public class Stock
{
}

class Program
{
    static void Main(string[] args)
    {
        ObjectCache cache = MemoryCache.Default;
        cache["test"] = new Stock();
        var x = cache.OfType<Stock>().ToList();
    }
}

这是空的...我认为OfType应该返回T类型集合中的所有实例?

只是为了排除ObjectCache作为可能的罪魁祸首我也试过

List<object> lstTest = new List<object>();
        lstTest.Add(new Stock());
        var y = lstTest.OfType<Stock>().ToList();

然而这很有用 - 所以看起来问题出现在ObjectCache上,它是下面一个Dictionary的实例

cache.Select(item => item.Value).OfType<T>().ToList()

谢谢阿列克谢!

4 个答案:

答案 0 :(得分:5)

MemoryChache返回KeyValuePair<string,Object>的枚举器,而不仅仅是值:MemoryChache.GetEnumerator()

您需要相应地获取物品。类似的东西:

var y = cache.Select(item => item.Value).OfType<Stock>();

答案 1 :(得分:2)

这样可行

cache.GetValues(new string[] {"test"}).Values.OfType<Order>()

但我不认为你应该使用它。 缓存的工作方式类似于词典...因此您可以使用KeyValuePairs

获取GetValues

答案 2 :(得分:0)

呀。对不起自己。 ObjectCache是​​一个IEnumerable&gt; 不是一个IDictionary。

这有效:

var c = cache.Select(o => o.Value).OfType<Stock>().ToList();

答案 3 :(得分:0)

这对我有用。

公共类股票     {         公共股票()         {             姓名=&#34;艾琳&#34 ;;         }         public string Name {get;组; }     }

class Program
{
    static void Main(string[] args)
    {
        System.Collections.ArrayList fruits = new System.Collections.ArrayList(4);
        fruits.Add("Mango");
        fruits.Add("Orange");
        fruits.Add("Apple");
        fruits.Add(3.0);
        fruits.Add("Banana");
        fruits.Add(new Stock());

        // Apply OfType() to the ArrayList.
        var query1 = fruits.OfType<Stock>();

        Console.WriteLine("Elements of type 'stock' are:");
        foreach (var fruit in query1)
        {
            Console.WriteLine(fruit);
        }

    }
}

记住IEnumerable是懒惰评估的。使用foreach循环遍历query1,您将看到它只找到Stock对象。