Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取列表中大于选定项的项_C#_Linq_Compareto_Icomparable - Fatal编程技术网

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();