2010-08-30 11 views
27

मुझे टाइप करने योग्य int int के कई चर जोड़ने की जरूरत है। मैंने नल कोलेसिंग ऑपरेटर का इस्तेमाल प्रति पंक्ति एक चर के लिए करने के लिए किया था, लेकिन मुझे लगता है कि ऐसा करने के लिए एक और संक्षिप्त तरीका है, उदाहरण के लिए क्या मैं इन बयानों को किसी भी तरह से श्रृंखलाबद्ध नहीं कर सकता, मैंने इसे दूसरे कोड में पहले देखा है।क्या नालीबल इन्स जोड़ने के लिए एक और शानदार तरीका है?

using System; 

namespace TestNullInts 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int? sum1 = 1; 
      int? sum2 = null; 
      int? sum3 = 3; 

      //int total = sum1 + sum2 + sum3; 
      //int total = sum1.Value + sum2.Value + sum3.Value; 

      int total = 0; 
      total = total + sum1 ?? total; 
      total = total + sum2 ?? total; 
      total = total + sum3 ?? total; 

      Console.WriteLine(total); 
      Console.ReadLine(); 
     } 
    } 
} 

उत्तर

40
var nums = new int?[] {1, null, 3}; 
var total = nums.Sum(); 

यह Enumerable.Sum विधि है, जो के रूप में आप उम्मीद करेंगे बर्ताव की IEnumerable<Nullable<Int32>>overload पर निर्भर करता है।

आप एक डिफ़ॉल्ट-मूल्य है कि शून्य के बराबर नहीं है है, तो आप कर सकते हैं:

var total = nums.Sum(i => i.GetValueOrDefault(myDefaultValue)); 

या आशुलिपि:

var total = nums.Sum(i => i ?? myDefaultValue);

+2

, सरल, संक्षिप्त, और यह क्या पहले से ही वहाँ है के साथ काम करता है। +1 – stakx

+0

क्या आपका दृष्टिकोण केवल 'int कुल = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0) + (sum3 ?? 0) करने से बेहतर है (प्रदर्शन के अनुसार); '? मेरा मतलब है कि आप सिर्फ अपने मूल्यों को पूरा करने के लिए एक सरणी बना रहे हैं। क्या इससे ज्यादा प्रभावित होता है? मैं बस जानना चाहता हूं, हालांकि मैंने पहले बिल्कुल समान कोड लिखा था, और फिर इसके लिए खोज आया ;-) –

18
total += sum1.GetValueOrDefault(); 

आदि

1

कैसे करें सहायक विधि के बारे में -

static int Sum(params int?[] values) 
{ 
    int total = 0; 
    for(var i=0; i<values.length; i++) { 
    total += values[i] ?? 0; 
    } 
    return total; 
} 

IMO, बहुत ही सुंदर नहीं है, लेकिन जैसा कि आप एक एक बार में ही चाहते हैं तो कम से कम के रूप में कई नंबर जोड़ें।

total = Helper.Sum(sum1, sum2, sum3, ...); 
1

आप

total += sum1 ?? 0; 
total += sum2 ?? 0; 
total += sum3 ?? 0; 
2
List<Nullable<int>> numbers = new List<Nullable<int>>(); 
numbers.Add(sum1); 
numbers.Add(sum2); 
numbers.Add(sum3); 

int total = 0; 
numbers.ForEach(n => total += n ?? 0); 

इस तरह के रूप में आप जितने चाहें उतने मान हो सकते हैं कर सकते हैं।

1

कैसे बस में sumX के लिए (sumX ?? 0) प्रतिस्थापन के बारे में संबंधित गैर-शून्य अभिव्यक्ति?

using System; 

namespace TestNullInts 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int? sum1 = 1; 
      int? sum2 = null; 
      int? sum3 = 3; 

      int total = 0; 
      total += (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0); 

      Console.WriteLine(total); 
      Console.ReadLine(); 
     } 
    } 
} 
0

सरल, LINQ के सबसे सुरुचिपूर्ण उपयोग:

var list = new List<Nullable<int>> { 1, 2, null, 3 }; 
var sum = list.Sum(s => s ?? 0); 
Console.WriteLine(sum); 

तुम्हें यकीन परिणाम नल नहीं है बनाने के लिए सम्मिलित AFAIK की जरूरत है।

+0

चूंकि लिंक 'Sum' एक्सटेंशन' शून्य 'तत्व छोड़ते हैं, तो आप यह भी कह सकते हैं कि' var sum = list.Sum() । वैल्यू 'या 'var sum = list.Sum() ?? 0'। –

9

बस सबसे सीधे सवाल का जवाब देने:

int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0); 

इस तरह बयान "श्रृंखलित" जाता है के रूप में उपयोग करते हुए पूछा एक +

+0

बिल्कुल सही !! यह वही है जिसे मैं देख रहा था... –

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

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