2013-07-09 50 views
4

我有一個請求緩存查找鍵,使用HttpContext.Current.Items這樣實現的通過一個特定的字符串,因此,我在想一個方法,像這樣使用HttpContext.Current.Items lambda表達式緩存

public IEnumerable<string> GetKey (Func<string, bool> condition) 

,然後通過循環的結果,並清除它們(我甚至可以直接在清除清除acepting lambda表達式,我猜)。但是,如果實際上可能的話,我會試圖實施這種方法。

任何幫助?

感謝

編輯:

Servy,我試圖(一直盲目地嘗試一些東西,但更多或更少的這條路)

public IEnumerable<string> GetKeys(Func<string, bool> condition) 
{ 
    List<string> list = new List<string>(); 

    foreach (var key in HttpContext.Current.Items.Keys) 
    { 
     if (condition(key as string)) 
     { 
      list.Add(key as string); 
     } 
    } 

    return list; 
} 

但我發現了:

未設置對象實例的對象引用

我現在要試試p.s.w.g,除了它可能起作用之外,它對我來說更加優雅。

第二編輯:

我需要稍微改變p.s.w.g解決方案。我不存儲在緩存中,但其他類型的對象的字符串,所以我用這個現在

public IEnumerable<string> GetKeys (Func<string, bool> condition) 
{ 
    return HttpContext.Current.Items 
     .Cast<DictionaryEntry>() 
     .Where(e => e.Key is string && condition(e.Key as string)) 
     .Select(e => e.Key as string); 
} 

和呼叫清除緩存例如這一個

public void ClearCache() 
{ 
    var ownedItemSummaryKeys = CacheCurrentCall.Instance.GetKeys(k => k.Contains("OwnedItemSummaryCurrent")); 

    foreach (var ownedItemSummaryKey in ownedItemSummaryKeys.ToList()) 
    { 
     CacheCurrentCall.Instance.Clear(ownedItemSummaryKey); 
    } 
} 
+1

你嘗試過什麼?你自己實施這個解決方案有什麼問題?你是否收到錯誤,錯誤的輸出或什麼? – Servy

回答

4

Items屬性一個IDictionary,所以你必須要做到這一點:

public IEnumerable<string> GetKey (Func<string, bool> condition) 
{ 
    return HttpContext.Current.Items 
     .Cast<DictionaryEntry>() 
     .Where(e => e.Key is string && 
        e.Value is string && 
        condition(e.Key as string)) 
     .Select(e => e.Value as string); 
} 

或查詢語法:

public IEnumerable<string> GetKey (Func<string, bool> condition) 
{ 
    return 
     from e in HttpContext.Current.Items.Cast<DictionaryEntry>() 
     where e.Key is string && 
       e.Value is string && 
       condition(e.Key as string) 
     select e.Value as string; 
} 

更新我錯過閱讀的問題。我以爲你想選擇根據某些標準的關鍵。如果你想只選擇鍵,它實際上是一個更容易一些:

public IEnumerable<string> GetKey (Func<string, bool> condition) 
{ 
    return HttpContext.Current.Items.Keys 
     .OfType<string>() 
     .Where(condition); 
} 

或者在查詢語法:

public IEnumerable<string> GetKey (Func<string, bool> condition) 
{ 
    return 
     from k in HttpContext.Current.Items.Keys.OfType<string>() 
     where condition(k) 
     select k; 
} 
+0

謝謝,我最終需要做一些小小的改動(問題不是那麼清楚,我的錯)到你的代碼中(請參閱第二次編輯),但它可以工作。 – mitomed

+0

@mitomed對不起,我起初誤解了你的問題。查看我更新的答案以獲得更好的解決方案 –