2016-10-05 119 views
1

我有一个Versions的列表。获取列表中的项目大于所选项目

List<Version> versions = GetVersions(); 

而且我有一个selectedVersion

我的Version类实现IComparable

public class Version : IComparable<Version> 

所以我可以做versions.Sort()。在这一点上,我的Version对象在列表中排序,比如Name属性。

Versions的列表中,我想获得比我的selectedVersion更高的物品。我如何用Linq做到这一点?

我试过的是将selectedVersion改为IComparable然后使用CompareTo但我得到了InvalidCastException错误。

IComparable comparable = (IComparable)selectedVersion; 
if(comparable.CompareTo(selectedVersion)) > 0 
+1

你为什么强制转换为'IComparable'时版本只实现了IComparable接口''? –

+0

IComparable是一种比较对象的方法,而selectedVersion是一种类型的版本。 – jdweng

+0

@PatrickHuizinga指出。我应该投射到'IComparable ' – jmc

回答

1

正确的方法是使用Comparer<T>.Default将尽快工作作为类型T工具要么IComparable<T>IComparable

var result = versions 
    .Where(version => Comparer<Version>.Default.Compare(version, selectedVersion) > 0) 
    .ToList(); 

你甚至可以用自定义的扩展方法封装它(所以你DRY ):

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

伟大的解决方法! – jmc

+0

解决方法?他 - 他,这是什么'OrderBy','Min','Max'内部使用时,当你不指定明确的比较,所以我想他们认为这是一个解决方案:) –

+0

所以它仍然依靠我' CompareTo'实现? – jmc

1

你似乎已经实现IComparable<T>这是不一样的IComparable。要么执行IComparable,要么投到IComparable<Version>,你应该可以做你想做的。

+0

这是指出的... – jmc

1
versions.Where(x => x.CompareTo(selectedVersion) > 0).ToList(); 

,或者如果IComparable<Version>实现明确的:

versions.Where(x => (x as IComparable<Version>).CompareTo(selectedVersion) > 0).ToList();