c# - Problem comparing items implementing IComparable -
i working on extension method finds min item specific selector. below code
public static t minby<t, k>(this ienumerable<t> src, func<t, k> selector) 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; } it gives error error operator '<' cannot applied operands of type 'k' , 'k'. have specified generic constraint k should struct , icomparable. believe numeric data type can satisfied this.
then how come invalid operation.?
icomparable doesn't (and can't) operators. should using:
if (current.compareto(min) < 0) operators static, , ever overloaded rather overridden. can't require operators within interfaces, , presence of method doesn't magically change operator do. (for example, overriding equals not change how == behaves.)
you should note constraint talks nongeneric icomparable interface, you're going boxing @ every operation. suggest change constraint icomparable<k> instead. (or drop constraint , use comparer<k>.default marc suggested.)
some other comments method:
- if of key values more default value
k(e.g. k=int , keys positive) won't find item - you may wish have overload accepts particular
icomparare<k>(but if drop comparable constraint) - there's no real need constrain
kvalue type. if wanted find person lexicographically earliest name? - if there no elements, return default value
t; fit in rest of linq suggest throwinginvalidoperationexception - i suggest using
tsource,tkeytype parameters more consistent linq
you may want @ morelinq minby implementation alternative. (looking on again, i'm not sure it's idea require comparer non-null; should use default comparer in same way normal linq if comparer null.)
Comments
Post a Comment