2016-10-05 31 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();