6

我想取 ushort 列表的最大值,当该列表为空时,我想将“1”设置为默认值。

例如:

List<ushort> takeMaxmumId = new List<ushort>();
var max = takeMaxmumId.Select(x=>x).DefaultIfEmpty(1).Max();

在我的示例 Visual Studio 中显示此错误:

“IEnumerable”不包含“DefaultIfEmpty”的定义,并且最佳扩展方法重载“Queryable.DefaultIfEmpty(IQueryable, int)”需要“IQueryable”类型的接收器

当我的列表类型是 int 时,我没有任何问题,ushort 类型的这个问题是什么?我怎样才能用最好的方法解决这个问题?

4

3 回答 3

6

问题是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();
于 2017-06-25T15:48:25.780 回答
0

由于您的数据类型是 ushort,您将不得不使用 DefaultIfEmpty 扩展方法的替代或加载。即 DefaultIfEmpty(this IEnumerable source, TSource defaultValue);

所以你必须转换到你的源才能输入 ushort。

var max = takeMaxmumId.Select(x => x).DefaultIfEmpty( (ushort) 1).Max();
于 2017-06-25T15:52:57.013 回答
0

你可以试试这个:

 var max = takeMaximumId.DefaultIfEmpty((ushort)1).Select(x => x).Max();

问题是由于传递 1 而没有强制转换给ushort您无法应用扩展方法DefaultIfEmpty,因为 1 被解释为int并且您要应用它的列表是 type List<ushort>。如果你写以下

 var max = takeMaximumId.DefaultIfEmpty(1).Select(x => x).Max();

您会收到下面的错误消息,它解释了上述内容

陈述:

'List' 不包含'DefaultIfEmpty' 的定义,并且最佳扩展方法重载'Queryable.DefaultIfEmpty(IQueryable, int)' 需要'IQueryable' 类型的接收器

作为旁注,尽管 dasblinkenlight 已经在他的帖子中提到了这一点,但您根本不需要Select,因为您没有在那里进行任何投影。您只想获取列表中包含的数字的最大值。

于 2017-06-25T15:48:36.300 回答