2010-02-24 25 views
5

Son zamanlarda benim sonuçlarını önbelleğe küçük pasajı ve ben şöyle bir Sözlüğü kullanıyordu yapıyordu şekilde uygulanması üzerinde çalışıyordu:HashSet IQueryable vs

private Dictionary<ID, IQueryable<Results>> _simpleCache; 

fikri tüm sonuçları aramak oldu 'ID' ile belirtilen kimliğe sahip olan ve Sözlük anahtar == kimliğini içeriyorsa, yalnızca bir veritabanı gezisi yapmak yerine IQueryable'de bulunan değerleri ararız.

Bu sabah mantığı bu parça üzerinde gidiyordu ve ben şöyle HashSet ile IQueryable yerine düşünüyordum:

private Dictionary<ID, HashSet<Results>> _simpleCache; 

bu değişiklik tavsiye mı yapıyor?

cevap

13

Evet, öyle. Genel olarak, IQueryable<T>, her seferinde sorgulanacağı sorgulanan bir veri kaynağı sağlayıcısı kullandığınızı ima eder (tabii ki, bu her zaman örneğidir, IEnumerable<T> üzerinde AsQueryable uzantı yöntemini çağırabileceğiniz gibi) uygulaması, IEnumerable<T> uygulamasına göre). Bu amaçla, bir sözlükte IQueryable<Results> saklamak, aslında ikinci kez numaralandırdığınızda veri kaynağında herhangi bir isabet olmasını engellemez. Üste | Veri numaralandırıcısını her numarasına göre numaralandırır. Bu nedenle

, genellikle genellikle sözlüğün TValue tipi parametresi olarak IEnumerable<Results> veya Results[] kullanarak sonra ToList veya ToArray uzatma yöntemleri çağırmadan ve, istemci tarafında sonuçları gerçekleştirmek istiyoruz. Eğer Nesnelerinizi saklamak için bir HashSet<T> kullanabilirsiniz, ancak varsayılan eşitlik karşılaştırıcısı Results türüne göre maruz ID örneğinde bir karşılaştırma yapacak böylece IEquatable<T> uygulamak ve GetHashCode geçersiz emin olmak zorunda

Not , ya, ya da aynı şeyi yapacak bir IEqualityComparer<T> uygulama sağlamak zorunda. Tasarımcının ürettiği kodları kullanma olasılığından daha fazlasıdır ve bunu sizin için yapmayacaktır ve nesneleriniz, değere göre değil, referans olarak belirlenen eşitliğe sahip olacaktır.