LINQ聚合函数对字节、短整型和无符号值的应用

10

如何在字节、短整型和无符号值的集合上使用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,它可以工作,但我无法使其适用于shorts、bytes、uints等。

我做错了什么?

4个回答

19

Enumerable.Sum<T>()仅适用于IEnumerable<T>,其中T为:

double,
double?
int,
int?
decimal,
decimal?
long,
long?
float,
float?

这是因为短整型或其他原始类型中没有加法运算符*(例如,short + short的结果是int)。
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);

在这种情况下,您现在正在调用重载
int Enumerable.Sum<short>(
    this IEnumerable<short> source,
    Func<short, int> selector
)

*: 在这里,我所说的 "操作符" 是指一个函数 F:(short x short) -> short


+1 很好的观察,但他们为什么要这样做呢,是否有任何原因?也许是为了避免溢出检查? - Akash Kava
1
@Akash:大多数基于C的语言在进行任何算术运算之前都会自动提升为int。你可能需要回到K&R时代才能找到那个。 - Billy ONeal
不是为了避免检查溢出,而是使用short类型很容易发生溢出。请参考:https://dev59.com/wG855IYBdhLWcg3wbzxl - jason

5

Enumerable.Sum 接受 intlongsingle 或者 double 类型的参数。

您可以将数字强制转换为适合的参数类型:

short [] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int sum = numbers.Cast<int> ().Sum ();

作为替代方案,您可以提供一个选择intFunc<TSource, 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本身实在太危险了
这甚至反映在添加short时需要进行显式转换

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
< p > Sum扩展方法没有接受IEnumerable<short>类型参数的重载。

相反的,您可以传递一个lambda表达式,将short隐式转换为int

short sumList = (short)numbersList.Sum(i=>i);

0

这让我感到困惑,但我最终成功地让它工作了:

List<short> li = new List<short> {1,2,3,4,5};
short l = (short)li.Sum(i => i);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接