System.Runtime.Кэширование возвращает неправильный счет при использовании OfType

#.net #caching #c#-4.0 #memorycache

#.net #кэширование #c #-4.0 #memorycache

Вопрос:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Caching;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            MemoryCache.Default.Add("C1", new Customer { Name = "C1" }, DateTime.Now.AddDays(1));

            MemoryCache.Default.Add("C2", new Customer { Name = "C2" }, DateTime.Now.AddDays(1));

            MemoryCache.Default.Add("C3", new Customer { Name = "C3" }, DateTime.Now.AddDays(1));

            Console.WriteLine("Total Cached Objects: {0}", MemoryCache.Default.GetCount());

            Console.WriteLine("Total cached objects of type Customer: {0}", MemoryCache.Default.OfType<Customer>().Count());

            Console.Read();

        }
    }


    public class Customer
    {
        public string Name { get; set; }
    }
}
  

Я добавляю 3 объекта типа Customer в MemoryCache, а затем пытаюсь отфильтровать MemoryCache, чтобы извлечь только те объекты, которые имеют тип Customer.

После выполнения приведенного выше кода я ожидал, что «Общее количество кэшированных объектов типа Customer» будет равно 3, но оно возвращает 0.

Кто-нибудь может указать мне, что здесь не так?

Ответ №1:

Объявление соответствующего метода MemoryCache является

   IEnumerator<KeyValuePair<string, Object>> GetEnumerator()
  

Этот метод возвращает список пар ключ-значение, вы ожидаете только значения.
Похоже, вам нужно что-то вроде

 // utested
MemoryCache.Default.Select(x => x.Value).OfType<Customer>().Count()