सवाल निरर्थक प्रकारों की तुलना कैसे करें?


मेरे पास कुछ ऐसे स्थान हैं जहां मुझे 2 (शून्य) मानों की तुलना करने की आवश्यकता है, यह देखने के लिए कि वे समान हैं या नहीं।

मुझे लगता है कि इसका समर्थन करने के लिए ढांचे में कुछ होना चाहिए, लेकिन कुछ भी नहीं मिल रहा है, इसलिए इसके बजाय निम्नलिखित हैं:

public static bool IsDifferentTo(this bool? x, bool? y)
{
    return (x.HasValue != y.HasValue) ? true : x.HasValue && x.Value != y.Value;
}

फिर, मेरे पास कोड के भीतर है if (x.IsDifferentTo(y)) ...

इसके बाद मेरे पास नामुमकिन इन्स, नबलबल डबल्स इत्यादि के लिए समान तरीके हैं।

क्या यह देखने का कोई आसान तरीका नहीं है कि दो शून्य प्रकार समान हैं या नहीं?

अद्यतन करें:

यह पता चला है कि इस विधि का कारण मौजूद था क्योंकि कोड को VB.Net से परिवर्तित कर दिया गया है, जहां कुछ भी नहीं = कुछ भी झूठा नहीं लौटाता है (सी # की तुलना करें जहां शून्य == नल सत्य लौटाता है)। VB.Net कोड का उपयोग किया जाना चाहिए था .Equals... बजाय।


44
2018-02-26 12:53


मूल


इस पर थोड़ा देर हो गई लेकिन मुझे अपडेट उपयोगी पाया। एक ही परिदृश्य में भाग गया - hubson bropa


जवाब:


सी # ऑपरेटरों को "उठाया" का समर्थन करता है, इसलिए यदि प्रकार (bool? इस मामले में) संकलन में जाना जाता है, आपको बस उपयोग करने में सक्षम होना चाहिए:

return x != y;

यदि आपको जेनेरिक की आवश्यकता है, तो EqualityComparer<T>.Default आपका दोस्त है:

return !EqualityComparer<T>.Default.Equals(x,y);

नोट, हालांकि, इन दोनों दृष्टिकोणों का उपयोग "null == null"दृष्टिकोण (एएनएसआई एसक्यूएल के विपरीत)। अगर आपको"null != null"तो आपको इसे अलग से जांचना होगा:

return x == null || x != y;

60
2018-02-26 12:57





Nullable.Equals<T>?


27
2018-02-26 12:56



सी # और वीबी.Net दोनों के साथ काम करने के लिए +1। - Crono
अन्य उत्तरों का दावा है कि x.Equals(y) तथा x == y एक्स और / या वाई के उदाहरण होने पर बस ठीक काम करें Nullable<T>। लिंक की गई विधि अलग कैसे है? इसका इस्तेमाल कब किया जाना चाहिए? - MarioDS
या Nullabe.Compare<T> यदि आप एक की तलाश में हैं IComparable<T> impl - Sepehr


if (x.Equals(y)) 

17
2018-02-26 12:59



क्या आप कृपया मुझे बता सकते हैं कि यह डाउनवोट क्यों है। बस जानना चाहता था कि मैं कहां गलत हूं। - Kashif
मैंने तुम्हें कम नहीं किया, लेकिन क्या होता है यदि एक्स शून्य है? एक नल संदर्भ पर एक विधि का आह्वान करने के परिणामस्वरूप शायद NullReferenceException में परिणाम होगा। - Chris Shouts
@ क्रिस: आपको जवाब फिर से ऊपर उठाना चाहिए। एक शून्य प्रकार T? एक संदर्भ प्रकार नहीं है, यह एक है System.Nullable<T>। और यह एक संरचना है, इसलिए: एक मूल्य प्रकार। मुहम्मद का कोड पूरी तरह से कानूनी है और यदि शून्य शून्य है तो NullReferenceException नहीं फेंक देगा। - Slauma
@Chris: ओह, क्षमा करें, क्षमा करें, मुझे गलत लगता है कि आपने जवाब को कम नहीं किया है, इसलिए आप ऊपर उठाने के लिए स्वतंत्र हैं या नहीं;) - Slauma


आप स्थिर का उपयोग कर सकते हैं के बराबर होती है सिस्टम पर विधि। ऑब्जेक्ट:

var equal = object.Equals(objA, objB);

6
2018-02-26 12:56





महज प्रयोग करें ==, या .Equals()


5
2018-02-26 12:56





तुलना करें का प्रयोग करें:

http://msdn.microsoft.com/en-us/library/dxxt7t2a.aspx


3
2018-02-26 12:56



समानता की जांच के लिए आपको तुलना की आवश्यकता नहीं है; यह केवल वास्तविक तुलना के लिए जरूरी है जैसे सॉर्टिंग के लिए। - Lucero