我是c#的新手。我有一个Windows窗体程序,可以显示从1到n的奇数。 这是源代码:
List<int> t = Enumerable.Range(1, 123456).ToList();
var oddNumbers = t.Where(num => num % 2 != 0);
txtHasil.Text += oddNumbers.Sum() + Environment.NewLine;
txtHasil.Text += string.Join(",", oddNumbers.Select(n => n.ToString()).ToArray()) + Environment.NewLine;
txtHasil.Text += oddNumbers.Count() + Environment.NewLine;
如果我在范围内使用1234,程序运行良好。如果我在范围内使用12345,程序仍然可以正常工作。但是如果我在范围内使用123456,则程序错误“算术运算导致溢出” oddNumbers.Sum()行。
我该如何处理123456数据?
答案 0 :(得分:3)
您可以使用较大的类型,例如Long
或Decimal
:
List<long> t = Enumerable.Range(1, 123456).Select(i => (long)i).ToList();
var oddNumbers = t.Where(num => num % 2 != 0);
long sum = oddNumbers.Sum();
如果您想支持任意尺寸,可以使用System.Numerics.BigInteger
:
List<BigInteger> t = Enumerable.Range(1, 123456).Select(i => new BigInteger(i)).ToList();
var oddNumbers = t.Where(num => num % 2 != 0);
BigInteger sum = oddNumbers.Aggregate(new BigInteger(0), BigInteger.Add);
答案 1 :(得分:3)
这一行
oddNumbers.Sum()
将返回一个整数。您的总和超过了整数最大值的限制。
您可以使用Int64,为您提供更大的容量。
List<Int64> t = Enumerable.Range(1, 123456).Select(i => (Int64)i).ToList();
var oddNumbers = t.Where(num => num % 2 != 0);
decimal sum = oddNumbers.Sum();