Linq查询IDictionaryEnumerator可能吗?

lee*_*n3o 4 c# linq asp.net caching

我需要从缓存中清除包含密钥中特定字符串的项目.我已经从以下开始,并认为我可以做一个linq查询

var enumerator = HttpContext.Current.Cache.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

但我不能?我希望做类似的事情

var enumerator = HttpContext.Current.Cache.GetEnumerator().Key.Contains("subcat");
Run Code Online (Sandbox Code Playgroud)

有关如何实现这一目标的任何想法?

Eam*_*nne 10

Cache生成DictionaryEntry对象创建的枚举器.此外,a Cache可能只有string键.

因此,您可以编写以下内容:

var httpCache = HttpContext.Current.Cache;
var toRemove = httpCache.Cast<DictionaryEntry>()
    .Select(de=>(string)de.Key)
    .Where(key=>key.Contains("subcat"))
    .ToArray(); //use .ToArray() to avoid concurrent modification issues.

foreach(var keyToRemove in toRemove)
    httpCache.Remove(keyToRemove);
Run Code Online (Sandbox Code Playgroud)

但是,当缓存很大时,这是一个可能很慢的操作:缓存不是设计为像这样使用.您应该问自己,替代设计是否可行且不可取.为什么需要一次删除多个缓存键,为什么不按子串对缓存键进行分组?


Kon*_*hin 5

由于Cache是​​IEnumerable,因此您可以自由地应用所需的所有LINQ方法.您唯一需要的是将其强制转换为IEnumerable <DictionaryEntry>:


var keysQuery = HttpContext.Current.Cache
    .Cast<DictionaryEntry>()
    .Select(entry => (string)entry.Key)
    .Where(key => key.Contains("subcat"));

现在keysQuery是从"subcat"开始的所有键的非严格集合.但是如果你需要从缓存中删除这些条目,最简单的方法就是使用foreach语句.