C#不能在ushort列表项中使用Linq DefaultIfEmpty吗?

时间:2017-06-25 15:40:18

标签: c# linq ushort

我想取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类型中的这个问题是什么?我怎样才能以最佳方式解决这个问题?

3 个答案:

答案 0 :(得分:3)

问题是Select产生IEnumerable<ushort>,而DefaultIfEmpty提供int默认值。因此,类型不匹配。

您可以通过在默认情况下强制ushort类型来解决此问题:

var max = takeMaxmumId.Select(x=>x).DefaultIfEmpty<ushort>(1).Max();
//                    ^^^^^^^^^^^^^
//            This part can be removed

Demo.

您还可以将序列元素转换为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