LINQ聚合在字节,短路和无符号值上起作用

时间:2011-06-13 18:53:37

标签: c# linq

如何在字节,短路和无符号值的集合上使用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等。

我做错了什么?

4 个答案:

答案 0 :(得分:15)

Enumerable.Sum<T>()仅定义在IEnumerable<T> 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 intlongsingledouble 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);