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

C# Cannot use Linq DefaultIfEmpty in ushort list items?

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

例如:

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

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

'IEnumerable' does not contain a definition for 'DefaultIfEmpty' and the best extension method overload 'Queryable.DefaultIfEmpty(IQueryable, int)' requires a receiver of type 'IQueryable'

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

问题是 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();

你可以试试这个:

 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' does not contain a definition for 'DefaultIfEmpty' and the best extension method overload 'Queryable.DefaultIfEmpty(IQueryable, int)' requires a receiver of type 'IQueryable'

附带说明一下,尽管 dasblinkenlight 已经在他的 post 中提到了这一点,但您根本不需要 Select,因为您没有在那里进行任何投影.您只想获得列表中包含的数字的最大值。

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

因此您必须转换到源代码才能键入 ushort。

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