您将如何在字节,短路和无符号值的集合上使用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 + short
是int
,例如).
你不得不说:
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
.
Enumerable.Sum
接受任一int
S,long
S,single
S或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)
我宣称sum
是int
因为认为short
s 的总和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)