2010-10-27 9 views
10

मैं उपयोगकर्ता के लिए दो प्रमुख चेक बॉक्स से मूल्यों का चयन करने के लिए अपने मुख्य डेटा कंटेनर के रूप में सी # में लुकअप क्लास का उपयोग कर रहा हूं।सी # System.Linq.Lookup कक्षा मूल्यों को हटाने और जोड़ने

लुकअप क्लास क्लास डिक्शनरी का उपयोग करने से कहीं अधिक आसान है> हालांकि, मुझे लुकअप क्लास में मूल्यों को हटाने और जोड़ने के तरीकों को नहीं मिल रहा है।

मैंने कहां और संघ का उपयोग करने के बारे में सोचा, लेकिन मुझे यह सही नहीं लगता है।

अग्रिम धन्यवाद।

+0

आप आप लुक कार्यान्वयन ही क्यों बनाना न:

public class MyClass { public string Key { get; set; } public string Value { get; set; } } //We have a fully populated set: var set = new List<MyClass>() //Populate this. var lookup = set.ToLookup(m => m.Key, m => m); //Remove the item where the key == "KEY"; //Now you can do something like that, modify to your taste. lookup = lookup .Where(l => !String.Equals(l.Key, "KEY")) //This just flattens the set - up to you how you want to accomplish this .SelectMany(l => l) .ToLookup(l => l.Key, l => l.Value); 

सूची में जोड़ने के लिए, हम कुछ इस तरह कर सकता है? इसे एक शब्दकोश पर बेसिंग करना, कोड की कुछ पंक्तियों से अधिक नहीं लेना चाहिए। – leppie

+0

यहां लेप्पी से सहमत हैं। लुकअप क्लास केवल डेटा देखने के लिए है, इसे संशोधित नहीं करता है। इसके अलावा शब्दकोश का उपयोग करने के लिए बहुत कठिन नहीं है, बस एक शब्दकोश के शीर्ष पर एक रैपर लिखने के लिए अच्छा हो सकता है। –

+0

लुकअप में एक शब्दकोश पर वास्तविक लुकअप करने के लिए एक अलग तंत्र भी है। लेकिन कुछ सरल परीक्षणों के साथ, वे दोनों बहुत जल्दी प्रदर्शन करते हैं। –

उत्तर

11

दुर्भाग्य से लुकअप क्लास का निर्माण .NET ढांचे के लिए आंतरिक है। जिस तरह से लुकअप बनाया गया है, लुकअप क्लास पर स्थिर फैक्टरी तरीके के माध्यम से है। ये हैं:

internal static Lookup<TKey, TElement> Create<TSource>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer); 
    internal static Lookup<TKey, TElement> CreateForJoin(IEnumerable<TElement> source, Func<TElement, TKey> keySelector, IEqualityComparer<TKey> comparer); 

हालांकि, ये विधियां आंतरिक हैं और हमारे द्वारा उपभोग के लिए नहीं हैं। लुकअप क्लास में आइटम हटाने का कोई तरीका नहीं है।

एक तरीका जो आप जोड़ और निकालने के लिए कर सकते हैं वह लगातार नए ILookups बनाना है। उदाहरण के लिए - तत्व को कैसे हटाएं।

//We have a fully populated set: 
var set = new List<MyClass>() //Populate this. 
var lookup = set.ToLookup(m => m.Key, m => m); 

var item = new MyClass { Key = "KEY1", Value = "VALUE2" }; 

//Now let's "add" to the collection creating a new lookup 
lookup = lookup 
    .SelectMany(l => l) 
    .Concat(new[] { item }) 
    .ToLookup(l => l.Key, l => l.Value); 
+0

हटाने के काम, क्या आप कृपया मुझे बता सकते हैं लुकअप सूची में आइटम कैसे जोड़ें। कृपया मुझे बताएं कि आंतरिक सूची में आइटम जोड़ने और निकालना संभव है या नहीं। –

+0

अभी जोड़ा गया है, मुझे बताएं कि आपको क्या लगता है –

+0

यह काम करता है, बहुत बहुत धन्यवाद। मुझे लगता है कि आंतरिक सूची से डेटा को हटाने के लिए प्रक्रिया आसान है, क्योंकि अब मेरे पास ToLookup विधि कॉल से पहले एक सूची है। –

संबंधित मुद्दे