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等。
我做错了什么?
Enumerable.Sum<T>()
仅为IEnumerable<T>
定义,其中中的T
double,
double?
int,
int?
decimal,
decimal?
long,
long?
float,
float?
这是因为对于short
或任何其他基元类型(例如,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
意义上的"算子"。
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
,因为认为short
s的和本身就是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);