C # nullable int को int में कैसे कन्वर्ट करें


483

मैं एक nullable intको a में कैसे बदलूं int? मान लीजिए कि नीचे के रूप में मेरे पास 2 प्रकार के int हैं:

int? v1;  
int v2; 

मैं v1मान देना चाहता हूं v2v2 = v1;एक त्रुटि का कारण होगा। मैं कैसे परिवर्तित v1करने के लिए v2?


वांछित व्यवहार जब क्या है v1है null?
सोलोमन उको

जवाबों:


637

अब तक के अन्य उत्तर सभी सही हैं; मैं बस एक और जोड़ना चाहता हूं जो थोड़ा साफ हो:

v2 = v1 ?? default(int);

कोई भी Nullable<T>इसके लिए परिवर्तनीय है T, यह प्रमाणित है कि संपूर्ण अभिव्यक्ति का मूल्यांकन किया जा सकता है कभी भी एक वैल्यू टाइप के लिए एक अशक्त असाइनमेंट में परिणाम नहीं हो सकता है। अतः, अशक्त-संचालक ऑपरेटर ??टर्नरी ऑपरेटर के लिए सिंटेक्स चीनी है:

v2 = v1 == null ? default(int) : v1;

... जो बदले में अगर / के लिए सिंटैक्स चीनी है:

if(v1==null)
   v2 = default(int);
else
   v2 = v1;

.NET 4.0 के रूप में, Nullable<T>एक "GetValueOrDefault ()" विधि है, जो एक अशक्त-सुरक्षित गेट्टर है जो मूल रूप से ऊपर दिखाए गए अशक्त-सह-प्रदर्शन करता है, इसलिए यह भी काम करता है:

v2 = v1.GetValueOrDefault();

4
क्या default(int)वाकई जरूरत है? एक साधारण के साथ क्या गलत है 0?
कोल जॉनसन

4
यह इस उदाहरण के लिए काम करेगा, लेकिन सामान्य स्थिति में defaultजहां उपयुक्त हो उसका उपयोग करने की सिफारिश की जाती है । शून्य हमेशा एक मूल्य के रूप में मान्य नहीं होता है, बहुत कम डिफ़ॉल्ट होता है, इसलिए यदि आप intएक सामान्य के साथ प्रतिस्थापित करते हैं तो आपको Tमेरा कोड काम मिलेगा जबकि शून्य नहीं। कुछ भविष्य के फ्रेमवर्क संस्करण में, defaultअधिभार भी हो सकता है; यदि और ऐसा होता है, तो डिफ़ॉल्ट का उपयोग करने वाला कोड आसानी से लाभ ले सकेगा, जबकि स्पष्ट अशक्त या शून्य असाइनमेंट को बदलना होगा।
कीथ्स

5
यह ऊपर की ओर उठना चाहिए: .NET 4.0, Nullable <T> में "
GetValueOrDefault

GetValueOrDefault के साथ इसे संपादित करने के लिए वापस आने के लिए धन्यवाद!
सिंधी

डिफ़ॉल्ट का उपयोग करने पर आप डेटटाइम से सावधान रहना चाहते हैं। यह खाली के बजाय डिफ़ॉल्ट तिथि सम्मिलित कर सकता है।
Ranch Camal


92

आप असाइनमेंट के लिए मान गुण का उपयोग कर सकते हैं।

v2 = v1.Value;

8
इसके अलावा - यदि आप अनिश्चित हैं यदि v1 में अशक्त हैं - तो आप फ़ॉलबैक मान सेट करने के लिए नल-कोलेसिंग ऑपरेटर का उपयोग कर सकते हैं। जैसे v2 = v1 ?? 0;
अरजेन

12
और v1.HasValueपहले जांचना सुनिश्चित करें ।
नीरस

3
MSDN कहते हैं, अगर है कि यह एक अपवाद फेंक होगा v1है null। मेरी राय में, यह एक सही जवाब नहीं है।
वेंटीसिस

6
@ventiseis मुझे लगता है कि यह वांछनीय व्यवहार है - मुझे आश्चर्य है कि अन्य जवाबों में से कई ठीक हैं चुपचाप एक अशक्त को परिवर्तित करने के साथ 0. यदि आप एक अशक्त प्रकार को एक अशक्त प्रकार के लिए असाइन कर रहे हैं, तो आपको यह सुनिश्चित करना चाहिए कि मूल्य वास्तव में अशक्त नहीं है। ओपी ने यह नहीं कहा कि "मैं v1 से v2, या 0 अगर v1 शून्य है, को असाइन करना चाहता हूं", लेकिन यह वही है जो हर किसी को लगता है
माइकल Mrozek


49

यदि आप जानते हैं कि v1एक मूल्य है, तो आप Valueसंपत्ति का उपयोग कर सकते हैं:

v2 = v1.Value;

GetValueOrDefaultयदि कोई एक है, तो विधि का उपयोग करना , अन्यथा प्रकार के लिए डिफ़ॉल्ट, या आपके द्वारा निर्दिष्ट डिफ़ॉल्ट मान निर्दिष्ट करेगा:

v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value

v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value

HasValueयदि v1मान हो, तो आप संपत्ति का उपयोग कर सकते हैं :

if (v1.HasValue) {
  v2 = v1.Value;
}

GetValueOrDefault(T)विधि के लिए भाषा समर्थन भी है :

v2 = v1 ?? -1;

यदि मूल्य है तो यह देखने के लिए आपको पहले जाँच किए बिना मान का उपयोग नहीं करना चाहिए। उपयोग ?? इसके बजाय ऑपरेटर।
पीटर


28

GetValueOrDefault()

वस्तु का मूल्य पुनः प्राप्त करता है। यदि यह शून्य है, तो यह int का डिफ़ॉल्ट मान लौटाता है, जो कि 0 है।

उदाहरण:

v2= v1.GetValueOrDefault();


21

यदि किसी दिए गए प्रकार के लिए डिफ़ॉल्ट मान स्वीकार्य परिणाम है:

if (v1.HasValue)
    v2 = v1.GetValueOrDefault();

यदि आप परिणाम के अपरिभाषित होने पर एक अलग डिफ़ॉल्ट मान चाहते हैं:

v2 = v1.GetValueOrDefault(255);    // or any valid value for int in place of 255

यदि आप केवल मूल्य वापस चाहते हैं (भले ही विधि विफल हो या न हो):

v2 = v1.GetValueOrDefault();


.NET 4.7.2 .: GetValueOrDefault()बिना किसी जाँच के फ़ील्ड मान लौटाता है।


15

जहां तक ​​मेरा सवाल है सबसे अच्छा समाधान GetValueOrDefault()विधि का उपयोग कर रहा है।

v2 = v1.GetValueOrDefault();

यह मेरे लिए सबसे अच्छा उपयोगी था
Liakat


10

यह संभव है v2 = Convert.ToInt32(v1);


यह तकनीकी रूप से काम करेगा, लेकिन अन्य तकनीक जैसे कि हैसवेल्यू / वैल्यू या गेटवैल्यूऑर्डफॉल्ट बहुत अधिक कुशलता से चलते हैं।
ब्रैंडन बार्कले


9

के बीच एक साधारण रूपांतरण v1और v2क्योंकि संभव नहीं है v1की तुलना में मूल्यों का एक बड़ा डोमेन है v2। यह सब कुछ है v1जो nullराज्य को जोड़ सकता है। यह स्पष्ट करने के लिए कि राज्य intका नक्शा बनाने के लिए किस मूल्य का उपयोग किया जाएगा null। ऐसा करने का सबसे सरल तरीका ??ऑपरेटर है

v2 = v1 ?? 0;  // maps null of v1 to 0

यह लंबे रूप में भी किया जा सकता है

int v2;
if (v1.HasValue) {
  v2 = v1.Value;
} else {
  v2 = 0;
}

9

आपके उपयोग के संदर्भ के आधार पर, आप C # 7 के पैटर्न-मिलान सुविधा का उपयोग कर सकते हैं:

int? v1 = 100;
if (v1 is int v2)
{
    Console.WriteLine($"I'm not nullable anymore: {v2}");
}

संपादित करें:

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

  • सी # 7 का पैटर्न मिलान अब हमें एक मूल्य के प्रकार की जांच करने और इसे संक्षेप में डालने की अनुमति देता है। उपरोक्त स्निपेट में, if-condition केवल तभी पास होगी जब इसमें संग्रहित मूल्य v1प्रकार के लिए अनुकूल हो v2, जिसके लिए यह मामला है int। यह निम्नानुसार है कि जब मान के लिए v1है null, अगर-स्थिति विफल हो जाएगी क्योंकि अशक्त को नहीं सौंपा जा सकता है int। अधिक ठीक से, nullएक नहीं है int

  • मैं यह बताना चाहता हूं कि यह समाधान हमेशा इष्टतम विकल्प नहीं हो सकता है। जैसा कि मैं सुझाव देता हूं, मेरा मानना ​​है कि यह डेवलपर के सटीक उपयोग के संदर्भ पर निर्भर करेगा। यदि आपके पास पहले से ही एक है int?और सशर्त रूप से उसके मूल्य पर काम करना चाहता है अगर-और-ही-अगर निर्दिष्ट मूल्य शून्य नहीं है (यह एकमात्र समय है जब बिना जानकारी खोए एक अशक्त इंट को नियमित रूप से इंट में बदलना सुरक्षित है), तो पैटर्न मिलान शायद ऐसा करने के सबसे संक्षिप्त तरीकों में से एक है।


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

मुझे अभी इस विधि का कोई लाभ दिखाई नहीं दे रहा है। v1.asValue चेक के रूप में और फिर v1.Value अंतर्निहित मूल्य तक पहुँचने के लिए। मैं इसे कम नहीं करूंगा, लेकिन मुझे लगता है कि यह समस्या पहले से ही हल हो गई है और एक नई तकनीक समस्या को बहुत स्पष्टता नहीं देती है। मैंने इसे 8-9% धीमा बताया।
ब्रैंडन बार्कले

यह बेंचमार्किंग के लिए धन्यवाद, यह जानना अच्छा है! किसी भी तरह से आप इसे देखते हैं, अंतर सबसे अच्छा है (जब तक कि आप कुछ समय के लिए महत्वपूर्ण क्षेत्र में ऐसा नहीं करते हैं मुझे लगता है)। मैं इसे अधिक "संक्षिप्त" या संभवतः "मुहावरेदार" देखता हूं क्योंकि यह एपीआई की बजाय भाषा में पके हुए सिंटैक्स शर्करा पर निर्भर करता है। यह थोड़ा व्यक्तिपरक है, लेकिन शायद यह "अधिक बनाए रखने योग्य" है। हालांकि सही मायने में, मैं इस दृष्टिकोण को डिफ़ॉल्ट मान पर निर्भर करने से अधिक पसंद करता हूं क्योंकि बहुत सारे अन्य उत्तर सुझाते हैं।
निकोलस मिलर

3

यह मूल्य प्रदान करेंगे v1करने के लिए v2करता है, तो यह शून्य नहीं है, अन्यथा यह शून्य के रूप में एक डिफ़ॉल्ट मान ले जाएगा।

v2=v1??0

या नीचे यह लिखने का दूसरा तरीका है।

v2 = v1.HasValue?v1:0


-1
 int v2= Int32.Parse(v1.ToString());

5
हालांकि यह कोड इस प्रश्न का उत्तर दे सकता है, कि यह कोड क्यों और / या इस बारे में अतिरिक्त संदर्भ प्रदान करता है कि यह प्रश्न इसके दीर्घकालिक मूल्य में सुधार करता है।
xiawi

1
अंडरहैंड ट्रिक्स का उपयोग करने के बजाय, वैकल्पिकों को अनचेक करने के लिए "सर्वोत्तम अभ्यास" तरीके का उपयोग करना बेहतर है। संदर्भ के लिए docs.microsoft.com/en-us/dotnet/csharp/language-reference/… देखें
lorg

पंद्रह मौजूदा उत्तरों के साथ एक आठ साल पुराने प्रश्न का उत्तर देते समय, यह बताना महत्वपूर्ण है कि आपके उत्तर को संबोधित करने वाले प्रश्न का कौन सा नया पहलू है, और यह नोट करने के लिए कि क्या समय बीतने पर उत्तर बदल गया है। कोड केवल उत्तर कुछ स्पष्टीकरण के अलावा लगभग हमेशा सुधार किया जा सकता है।
जेसन एलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.