LINQ对字节、短值和无符号值聚合函数

本文关键字:无符号 函数 LINQ 字节 | 更新日期: 2023-09-27 17:58:59

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

我做错了什么?

LINQ对字节、短值和无符号值聚合函数

Enumerable.Sum<T>()仅为IEnumerable<T>定义,其中中的T

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

这是因为对于short或任何其他基元类型(例如,short + shortint)不存在加法运算符*

你必须说:

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意义上的"算子"。

Enumerable.Sum接受int s、long s、single s或double s。

您可以将数字强制转换为参数:

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

作为替代方案,您可以提供一个Func<TSource, int> lambda,为您选择int s:

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,因为认为shorts的和本身就是short是非常不安全的
这甚至反映在添加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 ();

Sum扩展方法没有使用IEnumerable<short>的重载。

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

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

这让我很困惑,但我能够让它像一样工作

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