如何在字节,短路和无符号值的集合上使用LINQ聚合函数(例如Sum,Average)?当然,我是一个新的C#程序员,但我甚至无法弄清楚如何获得编译的东西,更不用说有适当的输出了。
这是我想要做的一个简单的例子:
short[] numbersArray = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
short sumArray = numbersArray.Sum();
或
List<short> numbersList = new List<short> { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
short sumList = numbersList.Sum();
我无法使用这些样本中的任何一个。如果我将数据类型更改为int它可以工作,但我不能让它适用于short,bytes,uints等。
我做错了什么?
答案 0 :(得分:15)
Enumerable.Sum<T>()
仅定义在IEnumerable<T>
double,
double?
int,
int?
decimal,
decimal?
long,
long?
float,
float?
这是因为short
或任何其他原始类型(例如short + short
都不是int
)没有添加运算符 * 。 / p>
你必须说:
short[] numbersArray = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int sumArray = numbersArray.Sum(x => (int)x);
并且不那么明确地说你可以逃脱
short[] numbersArray = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int sumArray = numbersArray.Sum(x => x);
在这种情况下,您现在正在调用overload:
int Enumerable.Sum<short>(
this IEnumerable<short> source,
Func<short, int> selector
)
* :这里我指的是函数F:(short x short) -> short
意义上的“运算符”。
答案 1 :(得分:5)
Enumerable.Sum
accepts int
,long
,single
或double
s。
您可以投射数字以使其符合参数:
short [] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int sum = numbers.Cast<int> ().Sum ();
作为替代方案,您可以provide a Func<TSource, int>
为您选择int
的lambda:
short [] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int sum = numbers.Sum (x => x); // lambda type is inferred as Func<short, int>
我将sum
声明为int
因为认为short
的总和本身是short
本身真的不安全。
甚至反映在you have to do explicit casting添加short
s:
int sum = a + b;
short shortSum = (short)(a + b); // you can use an explicit casting to get short
所以如果你确定你不会溢出,只需投出结果:
short shortSum = (short) numbers.Cast<int> ().Sum ();
答案 2 :(得分:2)
Sum
扩展方法没有带IEnumerable<short>
的重载。
相反,您可以传递一个lambda表达式,隐式将short
转换为int
s:
short sumList = (short)numbersList.Sum(i=>i);
答案 3 :(得分:0)
这让我很困惑,但我能够让它像以下一样工作:
List<short> li = new List<short> {1,2,3,4,5};
short l = (short)li.Sum(i => i);