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
您还可以将序列元素转换为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();
我想获取 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
您还可以将序列元素转换为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();