比较实现IComparable的项目的问题
我正在研究一种扩展方法,它通过特定的选择器找到最小项目。代码下方
public static T MinBy<T, K>(this IEnumerable<T> src, Func<T, K> selector) where K : struct, IComparable, IConvertible
{
var min = default(K);
T minItem = default(T);
foreach (var item in src)
{
var current = selector(item);
if (current < min)
{
min = current;
minItem = item;
}
}
return minItem;
}
它给出错误Error Operator '<' cannot be applied to operands of type 'K' and 'K'
。但是我已经指定了通用约束K应该是Struct and IComparable
。我相信所有数字数据类型都可以满足于此。
那为什么这是一个无效的操作。
没有找到相关结果
已邀请:
2 个回复
爆刺疤灯
不会(也不能)说出有关运营商的任何信息。你应该使用:
运算符是静态的,只是过载而不是重载。您不能在接口中要求运算符,并且方法的存在不会神奇地改变运算符将执行的操作。 (例如,覆盖
不会改变
的行为方式。) 您还应该注意,由于您的约束仅涉及非泛型
接口,因此您将在每次操作时进行装箱。我建议你改为将约束改为
。 (或者放弃约束,然后像Marc建议的那样使用
。) 关于您的方法的其他一些评论: 如果所有键值都大于
的默认值(例如K = int且所有键都为正),那么您将找不到项目 你可能希望有一个接受特定
的重载(但只有在你删除了类似的约束时) 没有必要将
约束为值类型。如果我想找到具有词典最早名称的人,该怎么办? 如果没有元素,它将返回
的默认值;为了适应LINQ的其余部分,我建议扔掉
我建议使用
和
作为类型参数,以更加符合LINQ 您可能希望将MoreLINQ MinBy实现视为替代方案。 (再看一遍,我不确定我们要求
非空是一个好主意;如果比较器为空,它应该使用默认比较器,就像普通LINQ一样。)
疮痪徘弦漏
不提供操作员支持 - 您需要使用
。或者更好,使用
- 然后你可以放弃约束,它将自动处理空值等,它将避免装箱。