C# 获取列表中大于选定项的项
我有一个C# 获取列表中大于选定项的项,c#,linq,compareto,icomparable,C#,Linq,Compareto,Icomparable,我有一个版本列表 List<Version> versions = GetVersions(); 所以我可以做versions.Sort()。此时,我的Version对象在列表中按Name属性排序 从版本列表,我想获得比我的所选版本更高的项目。我怎么能和Linq一起做呢 我尝试的是将selectedVersion强制转换为IComparable,然后使用CompareTo,但我得到了一个invalidcastedexception错误 IComparable comparable
版本列表
List<Version> versions = GetVersions();
所以我可以做versions.Sort()
。此时,我的Version
对象在列表中按Name
属性排序
从版本列表
,我想获得比我的所选版本
更高的项目。我怎么能和Linq一起做呢
我尝试的是将selectedVersion
强制转换为IComparable
,然后使用CompareTo
,但我得到了一个invalidcastedexception
错误
IComparable comparable = (IComparable)selectedVersion;
if(comparable.CompareTo(selectedVersion)) > 0
您似乎实现了
IComparable
,这与IComparable
不同。也可以实现IComparable
,或者转换为IComparable
,您应该能够做您想做的事情
versions.Where(x => x.CompareTo(selectedVersion) > 0).ToList();
或者如果显式实现了i可比较
:
versions.Where(x => (x as IComparable<Version>).CompareTo(selectedVersion) > 0).ToList();
versions.Where(x=>(x为可比较的)。CompareTo(selectedVersion)>0.ToList();
正确的方法是使用类型T
实现IComparable
或IComparable
后立即生效的:
var result = versions
.Where(version => Comparer<Version>.Default.Compare(version, selectedVersion) > 0)
.ToList();
当版本仅实现
IComparable
时,为什么要强制转换为IComparable
?IComparable是一种比较对象的方法,而selectedVersion是一种类型版本。@PatrickHuizinga注意到。我应该选择IComparable
解决方案?他,这就是<代码> OrderBy <代码> >代码> MIN <代码> > <代码>马克斯>代码>当你不指定显式比较器时,内部使用,所以我猜他们认为这是一个解决方案:)所以它仍然依赖于我的代码> CuasReto < /Cord>实现?绝对如此。您可以放置断点并查看。它只是一个通用方法,因此您不必考虑类实现了什么样的确切接口。这是一个更通用的解决方案:)
var result = versions
.Where(version => Comparer<Version>.Default.Compare(version, selectedVersion) > 0)
.ToList();
public static class EnumerableExtensions
{
public static IEnumerable<T> GreaterThan<T>(this IEnumerable<T> source, T value, IComparer<T> comparer = null)
{
if (comparer == null) comparer = Comparer<T>.Default;
return source.Where(item => comparer.Compare(item, value) > 0);
}
}
var result = versions.GreaterThan(selectedVersion).ToList();