2017-03-15 34 views
0

查詢如果我有一個類Foo的Hashset用於緩存的對象,並根據ID

public class Foo { 
    int FooId; 
    string FooName; 
    // etc; 
} 

而且我要對它們進行緩存和基於ID詢問他們,我現在做這樣的事情:

private List<Foo> cachedFoos; 

public Foo GetFoo (int fooId) { 
    Foo foo = cachedFoos.FirstOrDefault(s => s.FooId == fooId) 
    if (foo != null){ 
     return foo; 
    } 
    else { 
     foo = GetFooFromDb; 
     cachedFoos.Add(foo); 
     return foo; 
    } 
} 

但我想我應該在這裏使用HashSet,所以我不必擔心併發問題(插入重複的Foos)。 HashSets通過對象查詢我需要通過PK查詢的位置。我應該不知何故在這裏利用HashSets?

+0

「_HashSets通過對象查詢_」你是什麼意思? 'HashSet '是一個'IEnumerable ',就像List一樣。所以你可以像使用list一樣使用LINQ方法。 –

+0

我不認爲HashSet會幫助你。你的意思是詞典? – hatchet

+0

使用'字典' –

回答

0

如果你想使用ID作爲密鑰,並且害怕併發問題,我覺得ConcurrencyDictionary是你需要的類,它也有一個非常有用的功能GetOrAdd

private ConcurrencyDictionary<int, Foo> cachedFoos = new ConcurrencyDictionary<int, Foo>(); 

public Foo GetFoo (int fooId) { 
    return cachedFoos.GetOrAdd(fooId, GetFooFromDb); 
} 

注意然而,著名的有是編程中的兩個難題:命名和緩存失效。而我的示例並沒有開始緩存無效緩存。此外,除非你明白自己做得非常好,否則你不應該翻開自己的緩存。爲什麼不使用已經包含緩存的標準,比如EntityFramework?