2012-09-02 13 views
8

मेरे पास एक साधारण परिदृश्य है जहां मैं किसी मौजूदा आइटम का मान अपडेट करना चाहता हूं। केवल AddOrUpdate विधि एक प्रतिनिधि प्रदान करता है जहां मैं पुराना मान अपडेट कर सकता हूं। हालांकि अगर कुंजी मौजूद नहीं है तो मैं कुछ भी जोड़ना नहीं चाहता हूं। TryUpdate विधि में कोई ओवरलोड नहीं है जिसे मैं पुराना मान प्राप्त कर सकता हूं। क्या वर्तमान एपीआई के साथ ऐसा करने का कोई तरीका है?क्या लैम्बडा अभिव्यक्ति के साथ ConcurrentDictionary.TryUpdate का उपयोग करने का कोई तरीका है?

bool TryUpdate(TKey key, Func<TValue,TValue> updateValueFactory) 
+0

ऐसा कोई तरीका नहीं है जो यह करता है। क्या आपने कोई विशेष मूल्य जोड़ने पर विचार किया है यदि कुंजी मौजूद नहीं है और उस मान का इलाज उसी तरह करें जैसे प्रविष्टि मौजूद नहीं थी? – dtb

+0

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

+0

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

उत्तर

13

आप पाश करने के लिए तैयार रहने की और शायद एक बार से अधिक Func (GetOrAdd का अधिभार एक का उपयोग करता है के साथ के रूप में ही) कहते हैं:

यहाँ हस्ताक्षर मैं देख रहा हूँ है। इसका मतलब है कि यदि Func के दुष्प्रभाव हैं, तो यह बाहर से परमाणु प्रतीत नहीं होता है। वास्तव में, Func रों दुष्प्रभाव नहीं करना चाहिए था, लेकिन वे हमेशा कुछ लागत तो दोहराने कॉल करने की संभावना को नजरअंदाज नहीं किया जा सकता है:,

public static bool TryUpdate<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> dict, 
    TKey key, 
    Func<TValue, TValue> updateFactory) 
{ 
    TValue curValue; 
    while(dict.TryGetValue(key, out curValue)) 
    { 
     if(dict.TryUpdate(key, updateFactory(curValue), curValue)) 
      return true; 
     // if we're looping either the key was removed by another thread, 
     // or another thread changed the value, so we start again. 
    } 
    return false; 
} 

के रूप में कहा है, क्योंकि यह कर सकते हैं पाश, यह केवल परमाणु के रूप में मनाया Func में कोई दुष्प्रभाव नहीं होने पर बाहर से बाहर।

(संपादित करें: एक संभावित शॉर्ट-कट को हटाना जो वास्तव में उपयोग करने के लिए वास्तव में बहुत ही बेकार है, और जिसने इसे आजमाया है) काटने की संभावना है।

+0

ग्रेट उत्तर, धन्यवाद। –

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

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