2012-10-01 14 views
12

मेरे पास List<KeyValuePair<string, othertype>> है। मैंसूची <T> कैसे काम करता है जब टी संरचना है?

list.Find(x=>x.Key=="foobar") 

हालांकि की तर्ज पर कुछ करने की जरूरत है, कि यदि सूची में मौजूद नहीं है, व्यवहार क्या होगा? आम तौर पर यह शून्य वापस आ जाएगा, लेकिन structs शून्य नहीं हो सकता है।

+2

'int' साथ यह कोशिश करो और देखो क्या होता है। – Oded

+2

टाइप टी के लिए डिफ़ॉल्ट मान, अधिक विशेष रूप से 'डिफ़ॉल्ट (टी) '। –

+0

यदि आप कोई मिलान नहीं मिलने पर शून्य वापस लौटना चाहते हैं, तो KeyValuePair के बजाय Tuple का उपयोग करने पर विचार करें। – JamieSee

उत्तर

13

यह default(T) वापस करेगा जो new KeyValuePair<string, othertype>>() जैसा होगा, जो एक डिफ़ॉल्ट प्रारंभिक संरचना है।

असल में, संदर्भ प्रकारों के लिए डिफ़ॉल्ट हमेशा null है, और (struct सहित) मूल्य प्रकार के लिए यह डिफ़ॉल्ट (numerics के लिए 0, bool के लिए false, हर क्षेत्र के साथ एक struct संरचनाओं के लिए चूक, आदि)

है

तो, एक default(KeyValuePair<string, othertype>>) के लिए तुम वापस एक केवीपी जहां Key था null (string के लिए डिफ़ॉल्ट) और जो कुछ भी default(othertype) होगा मिल चाहते हैं (उपरोक्त उदाहरण में बताया) ...

MSDN से:

पहला तत्व है कि स्थिति निर्दिष्ट विधेय द्वारा परिभाषित से मेल खाता है, अगर पाया; अन्यथा, प्रकार टी

के लिए डिफ़ॉल्ट मान इस का उपयोग करना, अगर आप की जाँच करें और देखना चाहता था अगर तुम वापस default मिला है, मैं yourResult.Key != null के लिए सुझाव देते हैं कि चाहते हैं देखने के लिए अगर आप एक परिणाम मिला, या आप कर सकते थे Olivier के सुझाव के रूप में FindIndex जैसे Find विधि का उपयोग करें।

डिफ़ॉल्ट मान:

+0

का लक्ष्य रख रहे हैं, यह ध्यान देने योग्य हो सकता है कि विशेष मान प्रकार के लिए 'Nullable ', क्योंकि डिफ़ॉल्ट प्रारंभिक परिणाम 'HasValue' में गलत है (जैसा कि कोई होगा किसी भी संरचना के बूलियन क्षेत्र), यह संरचना को कई संदर्भों में एक शून्य मान के रूप में व्याख्या करने का कारण बनता है। – supercat

14

मेरी सलाह गैर नल प्रकार

int index = list.FindIndex(x => x.Key == "foobar"); 
if (index >= 0) { 
    // found! 
    UseResult(list[index]); 
} 
के लिए FindIndex उपयोग करने के लिए है

डिफ़ॉल्ट मान default(T) वापस किया गया है यदि Find() सफल नहीं है। गैर नामुमकिन प्रकारों के लिए, यह परिणाम डिफ़ॉल्ट मान वाले नियमित प्रविष्टियों से अलग नहीं किया जा सकता है। यह शून्य प्रकारों के लिए भी सही है जब सूची में नियमित null प्रविष्टियां हो सकती हैं।

+1

+1: यह बेहतर समाधान है। इस मामले में, एक शून्य कुंजी वाला एक कुंजी-मूल्य जोड़ी वैध मान होने की संभावना नहीं है, लेकिन यह संभव है। बहुत से लोग इसे भूल जाते हैं, या, उदाहरण के लिए, 'सूची ' में शून्य मान हो सकते हैं। – phoog

+1

+1: बहुत अच्छा। मैं एक डिफ़ॉल्ट के खिलाफ तुलना नहीं करना चाहता था; जैसे आपने कहा, ज्यादातर मामलों में, अंतर निर्धारित करने का कोई तरीका नहीं है। –

3

संरचना एक मूल्य प्रकार है। इसलिए, संरचना के मामले में खोजें संरचना के डिफ़ॉल्ट मान वापस कर देगा।

उदाहरण:

चलें कहते हैं कि हम नीचे के रूप में संरचना है,

public struct Test 
{ 
    public int i; 
} 

List<Test> list = new List<test>() { new Test { i = 1 } }; 
Test result = list.Find(o => o.i == 2); 

नया टेस्ट की तरह ऊपर ढूँढें परिणाम मूल्य में()। आप नीचे कोड से मूल्य की तुलना कर सकते हैं।

if (resul.Equals(new Test())) 
{ 

     //Do something 
} 
else 
{ 
        //Do something  
} 

या

if (resul.Equals(default(Test))) 
{ 

     //Do something 
} 
else 
{ 
        //Do something  
} 
+0

हे, अगर स्थिति ऐसी दिखती है ... गलत। यह संदर्भ प्रकारों के लिए कभी भी काम नहीं करेगा :) structs निश्चित रूप से कुछ नहीं है जो मैं रोजाना उपयोग करता हूं हालांकि – Earlz

+0

मैंने '==' को बराबर में बदल दिया। –

+0

मैं '== नया टेस्ट()' करने के खिलाफ अनुशंसा करता हूं, जो 'स्ट्रक्चर' पर '==' के बाद से थोड़ा भारी है। मैं इसके बजाय 'ओपी' उदाहरण में 'शून्य' के लिए 'कुंजी' फ़ील्ड की जांच करने की सिफारिश करता हूं। –

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