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

Jac*_*der 8 c# linq

您将如何在字节,短路和无符号值的集合上使用LINQ聚合函数(例如Sum,Average)?当然,我是一个新的C#程序员,但我甚至无法弄清楚如何获得编译的东西,更不用说有适当的输出了.

这是我想要做的一个简单的例子:

short[] numbersArray = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
short sumArray = numbersArray.Sum();
Run Code Online (Sandbox Code Playgroud)

要么

List<short> numbersList = new List<short> { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
short sumList = numbersList.Sum();
Run Code Online (Sandbox Code Playgroud)

我无法使用这些样本中的任何一个.如果我将数据类型更改为int它可以工作,但我不能让它适用于short,bytes,uints等.

我究竟做错了什么?

jas*_*son 16

Enumerable.Sum<T>()仅用于定义IEnumerable<T>其中T

double,
double?
int,
int?
decimal,
decimal?
long,
long?
float,
float?
Run Code Online (Sandbox Code Playgroud)

这是因为不存在加法运算符*short或任何其它原语类型(的short + shortint,例如).

你不得不说:

short[] numbersArray = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int sumArray = numbersArray.Sum(x => (int)x);
Run Code Online (Sandbox Code Playgroud)

并且不太明确,你可以逃脱

short[] numbersArray = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int sumArray = numbersArray.Sum(x => x);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您现在正在调用重载:

int Enumerable.Sum<short>(
    this IEnumerable<short> source,
    Func<short, int> selector
)
Run Code Online (Sandbox Code Playgroud)

*:这里我的意思是"操作员"的功能F:(short x short) -> short.


Dan*_*mov 5

Enumerable.Sum 接受任一intS,longS,singleS或double秒.

您可以转换数字以使其符合参数:

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

作为替代方案,您可以提供一个Func<TSource, int>int为您选择s 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>
Run Code Online (Sandbox Code Playgroud)

我宣称sumint因为认为shorts 的总和short本身就是不安全的.
甚至反映在添加s 时你必须进行显式转换short:

int sum = a + b; 
short shortSum = (short)(a + b); // you can use an explicit casting to get short
Run Code Online (Sandbox Code Playgroud)

所以如果你确定你不会溢出,只需转换结果:

short shortSum = (short) numbers.Cast<int> ().Sum ();
Run Code Online (Sandbox Code Playgroud)