2010-08-30 31 views
27

Tôi cần phải thêm nhiều biến của kiểu nullable int. Tôi đã sử dụng toán tử kết hợp rỗng để biến nó xuống một biến trên mỗi dòng, nhưng tôi có cảm giác có một cách ngắn gọn hơn để thực hiện điều này, ví dụ: Tôi không thể xích các câu lệnh này với nhau bằng cách nào đó, tôi đã thấy điều đó trước khi ở mã khác.Có cách nào thanh lịch hơn để thêm int vô giá trị không?

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(); 
     } 
    } 
} 

Trả lời

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

này dựa trên IEnumerable<Nullable<Int32>>overload của phương pháp Enumerable.Sum, mà cư xử như bạn mong đợi.

Nếu bạn có một mặc định giá trị đó không phải là bằng không, bạn có thể làm:

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

hoặc viết tắt:

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

+2

đơn giản, súc tích, và nó hoạt động với những gì đã có. +1 – stakx

+0

Cách tiếp cận của bạn tốt hơn (hiệu suất khôn ngoan) hơn là chỉ đơn giản là 'int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);'? Tôi có nghĩa là bạn đang tạo ra một mảng chỉ để tổng hợp các giá trị của chúng. Nó có ảnh hưởng nhiều không? Tôi chỉ muốn biết, mặc dù tôi đã viết chính xác mã tương tự đầu tiên, và sau đó đã tìm kiếm nó ;-) –

18
total += sum1.GetValueOrDefault(); 

, vv

1

Làm thế nào để về phương pháp helper -

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

IMO, không phải là rất tao nhã nhưng ít nhất thêm bao nhiêu số như bạn muốn trong một đi.

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

Bạn có thể làm

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); 

cách này bạn có thể có nhiều giá trị như bạn muốn.

1

Làm thế nào về chỉ thay (sumX ?? 0) cho sumX trong biểu thức không thể null tương ứng?

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

đơn giản, sử dụng thanh lịch nhất của LINQ:

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

Bạn cần AFAIK liên hiệp để đảm bảo kết quả là không nullable.

+0

Vì phần mở rộng Linq 'Sum' bỏ qua các phần tử' null', bạn cũng có thể nói 'var sum = list.Sum() .Value' hoặc 'var sum = list.Sum() ?? 0'. –

9

Chỉ cần trả lời câu hỏi trực tiếp nhất:

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

Bằng cách này những điều khoản được "xích" với nhau như hỏi sử dụng +

+0

Hoàn hảo !! Đây là những gì tôi đang tìm kiếm ... –

Các vấn đề liên quan