/ / IDfoxEnumerator संभावित पर लाइन क्वेरी? - c #, asp.net, linq, कैशिंग

IDictionaryEnumerator पर लिंक क्वेरी संभव है? - सी #, एएसपीनेट, लिनक, कैशिंग

मुझे कैश से आइटम साफ़ करने की आवश्यकता है जिसमें कुंजी में एक विशिष्ट स्ट्रिंग है। मैंने निम्नलिखित के साथ शुरुआत की है और सोचा है कि मैं एक linq क्वेरी करने में सक्षम हो सकता हूं

var enumerator = HttpContext.Current.Cache.GetEnumerator();

लेकिन मैं "टी! मैं ऐसा कुछ करने की उम्मीद कर रहा था

var enumerator = HttpContext.Current.Cache.GetEnumerator().Key.Contains("subcat");

मैं इसे कैसे प्राप्त कर सकता हूं इस पर कोई विचार?

उत्तर:

उत्तर № 1 के लिए 10

द्वारा निर्मित एन्यूमरेटर Cache उत्पन्न करता है DictionaryEntry वस्तुओं। इसके अलावा, ए 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);

हालांकि, यह एक संभावित धीमा ऑपरेशन हैजब कैश बड़ा होता है: कैश को इस तरह उपयोग करने के लिए डिज़ाइन नहीं किया जाता है। आपको अपने आप से पूछना चाहिए कि क्या वैकल्पिक डिजाइन संभव नहीं है और बेहतर है। आपको एक बार में कई कैश कुंजी निकालने की आवश्यकता क्यों है, और आप विकल्प द्वारा कैश कुंजी को समूहीकृत क्यों नहीं कर रहे हैं?


जवाब के लिए 5 № 2

चूंकि कैश एक IEnumerable है, आप स्वतंत्र रूप से सभी LINQ विधियों को लागू कर सकते हैं जिनकी आपको आवश्यकता है। केवल एक चीज जिसकी आपको आवश्यकता है उसे IEnumerable <DictionaryEntry> में डालना है:


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

अब KeyQuery "सबकैट" से शुरू होने वाली सभी चाबियों का एक गैर-सख्त संग्रह है। लेकिन अगर आपको ऐसी प्रविष्टियों को कैश से निकालने की आवश्यकता है, तो सबसे सरल तरीका यह है कि आप केवल फ़ार्च स्टेटमेंट का उपयोग करें।


जवाब के लिए 2 № 3

मुझे नहीं लगता कि यह संपूर्ण कैश चलना एक महान विचार है वैसे भी, लेकिन आप इसे गैर-LINQ के साथ कुछ इस तरह से कर सकते हैं:

    var iter = HttpContext.Current.Cache.GetEnumerator();
using (iter as IDisposable)
{
while (iter.MoveNext())
{
string s;
if ((s = iter.Key as string) != null && s.Contains("subcat"))
{
//... let the magic happen
}
}
}

LINQ के साथ करने के लिए आप कुछ ऐसा कर सकते हैं:

public static class Utils
{
public static IEnumerable<KeyValuePair<object, object>> ForLinq(this IDictionaryEnumerator iter)
{
using (iter as IDisposable)
{
while (iter.MoveNext()) yield return new KeyValuePair<object, object>(iter.Key, iter.Value);
}
}
}

और उपयोग की तरह:

var items = HttpContext.Current.Cache.GetEnumerator().ForLinq()
.Where(pair => ((string)pair.Key).Contains("subcat"));