我想取ushort列表的最大值,当该列表为空时,我想设置" 1"默认值。
例如:
List<ushort> takeMaxmumId = new List<ushort>();
var max = takeMaxmumId.Select(x=>x).DefaultIfEmpty(1).Max();
在我的示例Visual Studio中显示此错误:
&#39; IEnumerable的&#39;不包含的定义 &#39; DefaultIfEmpty&#39;和最好的扩展方法重载 &#39; Queryable.DefaultIfEmpty(IQueryable,int)&#39;需要一个 接收器类型&#39; IQueryable&#39;
当我的列表类型为int时我没有任何问题,ushort类型中的这个问题是什么?我怎样才能以最佳方式解决这个问题?
答案 0 :(得分:3)
问题是Select
产生IEnumerable<ushort>
,而DefaultIfEmpty
提供int
默认值。因此,类型不匹配。
您可以通过在默认情况下强制ushort
类型来解决此问题:
var max = takeMaxmumId.Select(x=>x).DefaultIfEmpty<ushort>(1).Max();
// ^^^^^^^^^^^^^
// This part can be removed
您还可以将序列元素转换为int
:
var max = takeMaxmumId.Select(x => (int)x).DefaultIfEmpty(1).Max();
答案 1 :(得分:0)
你可以尝试这个:
var max = takeMaximumId.DefaultIfEmpty((ushort)1).Select(x => x).Max();
问题是由于将没有强制转换的{1}传递给ushort
,您无法应用扩展方法DefaultIfEmpty
,因为1被解释为int
并且列出了你想要应用此类型List<ushort>
。如果你写下面的
var max = takeMaximumId.DefaultIfEmpty(1).Select(x => x).Max();
你会得到下面的错误信息,这解释了上面的
语句:
'List'不包含'DefaultIfEmpty'的定义 最好的扩展方法是重载 'Queryable.DefaultIfEmpty(IQueryable,int)'需要一个 “IQueryable”类型的接收器
作为旁注,尽管dasblinkenlight已经在他的帖子中提到了这一点,但你根本不需要Select
,因为你没有在那里进行任何投影。您只想获得列表中包含的数字的最大值。
答案 2 :(得分:0)
由于您的数据类型是ushort,因此您必须满足DefaultIfEmpty扩展方法的替代orverload。即DefaultIfEmpty(此IEnumerable源,TSource defaultValue);
因此,您必须向源代码输入以输入ushort。
result