2010-11-24 12 views
5

जोड़ने से पहले आइटम संग्रह में मौजूद है या नहीं, मुझे लगता है कि मैं इसे अक्सर लिखता हूं।मूल सी # .NET विधि यह जांचने के लिए कि

Hashtable h = new Hashtable(); 
string key = "hahahahaahaha"; 
string value = "this value"; 
if (!h.Contains(key)) 
{ 
    h.Add(key, value); 
} 

वहाँ एक देशी विधि (शायद AddIf() ?? तरह कुछ) अगर यह संग्रह में मौजूद है देखने के लिए जाँच करता है कि है और अगर ऐसा नहीं होता, संग्रह में शामिल करता है? तो फिर मेरा उदाहरण बदल जाएगा:

Hashtable h = new Hashtable(); 
string key = "hahahahaahaha"; 
string value = "this value"; 
h.AddIf(key, value); 

यह एक हेस्टेबल से बाहर लागू होगा। असल में कोई भी संग्रह जिसमें एक। विधि है।

संपादित करें: जब Hashtable :)

उत्तर

10

अच्छा, आप शायद कोड नहीं लिखते हैं, क्योंकि Hashtable कुंजी/मूल्य जोड़े का उपयोग करता है, न केवल कुंजी।

यदि आप .NET 3.5 या उच्चतर का उपयोग कर रहे हैं, तो मेरा सुझाव है कि आप HashSet<T> का उपयोग करें, और फिर आप बिना शर्त शर्त Add पर कॉल कर सकते हैं - वापसी मूल्य इंगित करेगा कि यह वास्तव में जोड़ा गया था या नहीं।

संपादित करें: ठीक है, अब हम जानते हैं कि आप कुंजी/मूल्य जोड़े के बारे में बात कर रहे हैं - एक सशर्त जोड़ने के लिए अंतर्निहित कुछ भी नहीं है (ठीक है, ConcurrentDictionary आईआईआरसी में है, लेकिन ...), लेकिन यदि आप हैं - यह सिर्फ यह परिवर्तन कर देंगे

h[key] = value; 

Add के विपरीत, वहाँ पहले से ही कुंजी के लिए एक प्रवेश अगर है कि एक अपवाद फेंक नहीं होगा: मौजूदा मान ओवरराइट खुश, तो आप सिर्फ इंडेक्सर उपयोग कर सकते हैं।

+0

उत्तर जॉन के लिए धन्यवाद और आप सही हैं। मैं एक हैशटेबल के साथ काम कर रहा था और चाबियाँ और मूल्यों का उपयोग कर रहा था। जब मैं इस सवाल को लिखने गया तो मैं खुद से आगे निकल गया :) –

+0

@rodey: तो क्या आपको मूल्य की जांच करने की आवश्यकता है? –

+0

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

8

को जोड़ने एक मूल्य जोड़ने के लिए अपडेट किया गया वहाँ नेट ढांचे में इस तरह के एक तरीका नहीं है। एक HashTable के बाद से

public static TValue AddIfNotExists<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key) 
    where TValue : new() 
{ 
    TValue value; 
    if (!dict.TryGetValue(key, out value)) 
    { 
     value = new T(); 
     dict.Add(key, value); 
    } 
    return value; 
} 
+1

+1 इसके अलावा यह सुनिश्चित करें कि समान रूप से व्यवहार के रूप में समान/हैश परिभाषित किया गया है, जब तक कि वही संदर्भ न हो। –

0

आपका कोड मतलब नहीं है,:

public static void AddIfNotExists<T>(this ICollection<T> coll, T item) { 
    if (!coll.Contains(item)) 
     coll.Add(item) 
} 

IDictionary के लिए, मैं इस विधि (आम तौर पर Dictionary<TKey, List<TValue>> और बदलाव के लिए) का उपयोग: लेकिन आप आसानी से अपने खुद का विस्तार विधि लिख सकते हैं एक कुंजी और एक मूल्य दोनों की जरूरत है।

यदि आप एक HashSet<T> मतलब, Add बुला कोई कार्य नहीं करेगा यदि आइटम पहले से ही वहाँ है।

यदि आपका मतलब Dictionary<TKey, TValue> है, तो आप dict[key] = value लिख सकते हैं, जो कुंजी को जोड़ देगा यदि यह मौजूद नहीं है या यदि यह है तो इसे ओवरराइट करें।

+0

आप सही हैं।उदाहरण लिखते समय मैं खुद से आगे निकल गया। मैंने अपना कोड अपडेट किया। –

0

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

1

एक hashtable जहां दाहिने हाथ की ओर पहले की जाँच करेगा अगर myHashtable[key] शून्य पर मूल्यांकन किया जाता आप myHashtable[key] = myHashtable[key] ?? newValue लिख सकता है और अगर उस से समाधान नहीं अन्यथा करने के लिए newVale

0

मैं अक्सर अपने कस्टम शब्दकोश/Hashtable में एक समान विधि लिखने को हल करने के लिए Type FetchOrCreate(Key) के रूप में, void AddIf(Key)

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