هل هناك طريقة أكثر أناقة لإضافة ints nullable؟
-
02-10-2019 - |
سؤال
أحتاج إلى إضافة العديد من المتغيرات من النوع Nullable 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();
}
}
}
المحلول
var nums = new int?[] {1, null, 3};
var total = nums.Sum();
هذا يعتمد على IEnumerable<Nullable<Int32>>
الحمل الزائد التابع Enumerable.Sum
الطريقة التي تتصرف كما تتوقع.
إذا كان لديك قيمة افتراضية لا تساوي الصفر ، فيمكنك القيام بذلك:
var total = nums.Sum(i => i.GetValueOrDefault(myDefaultValue));
أو الاختزال:
var total = nums.Sum(i => i ?? myDefaultValue);
نصائح أخرى
total += sum1.GetValueOrDefault();
إلخ.
فقط للإجابة على السؤال بشكل مباشر:
int total = (sum1 ?? 0) + (sum2 ?? 0) + (sum3 ?? 0);
وبهذه الطريقة ، يتم "التسلسل" معًا كما طلب باستخدام A +
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);
بهذه الطريقة يمكنك الحصول على العديد من القيم التي تريدها.
كيف تدور حول طريقة المساعد -
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, ...);
يمكنك أن تفعل
total += sum1 ?? 0;
total += sum2 ?? 0;
total += sum3 ?? 0;
ماذا عن مجرد استبدال (sumX ?? 0)
إلى عن على sumX
في التعبير غير المقابل غير القابل للفرق؟
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();
}
}
}
أبسط وأكثر استخدامًا أناقة لـ LINQ:
var list = new List<Nullable<int>> { 1, 2, null, 3 };
var sum = list.Sum(s => s ?? 0);
Console.WriteLine(sum);
أنت بحاجة إلى coalesce AFAIK للتأكد من أن النتيجة ليست قابلة للبطولة.