如何解决LINQ聚合函数的字节,短裤和无符号值
| 您将如何在字节,短裤和无符号值的集合上使用LINQ聚合函数(例如,求和,平均值)?当然,我是一名新的C#程序员,但我什至无法弄清楚如何获得可以正确编译的东西,更不用说编译了。 这是我尝试做的一个简单例子:short[] numbersArray = { 5,4,1,3,9,8,6,7,2,0 };
short sumArray = numbersArray.Sum();
要么
List<short> numbersList = new List<short> { 5,0 };
short sumList = numbersList.Sum();
我无法使用这些示例中的任何一个。如果我将数据类型更改为int,则可以使用,但不能使它适用于短裤,字节,uint等。
我究竟做错了什么?
解决方法
for2ѭ仅定义为
IEnumerable<T>
,其中T
double,double?
int,int?
decimal,decimal?
long,long?
float,float?
这是因为没有用于short
或其他任何原始类型的加法运算符*(例如,ѭ7no是int
)。
你不得不说:
short[] numbersArray = { 5,4,1,3,9,8,6,7,2,0 };
int sumArray = numbersArray.Sum(x => (int)x);
而且不太明确,你可以摆脱
short[] numbersArray = { 5,0 };
int sumArray = numbersArray.Sum(x => x);
在这种情况下,您现在正在调用重载:
int Enumerable.Sum<short>(
this IEnumerable<short> source,Func<short,int> selector
)
*:在这里,我的意思是\ operoperator \,代表函数F:(short x short) -> short
。
, Enumerable.Sum
接受int
s,long
s,single
s或double
s。
您可以将数字强制转换为合格的参数:
short [] numbers = { 5,0 };
int sum = numbers.Cast<int> ().Sum ();
或者,您可以提供一个Func<TSource,int>
lambda来为您选择int
:
short [] numbers = { 5,0 };
int sum = numbers.Sum (x => x); // lambda type is inferred as Func<short,int>
我将sum
声明为int
,因为认为short
的总和本身就是short
是不安全的。
这甚至反映在以下事实上:添加ѭ6时必须进行显式转换:
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
扩展方法没有需要method30ѭ的重载。
相反,您可以传递一个lambda表达式,该表达式将short
s隐式转换为int
s:
short sumList = (short)numbersList.Sum(i=>i);
, 这让我感到困惑,但是我能够使它像这样工作:
List<short> li = new List<short> {1,5};
short l = (short)li.Sum(i => i);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。