2016-10-05 10 views
1

私はVersionsのリストを持っています。リスト内で選択したアイテムよりも大きなアイテムを取得する

List<Version> versions = GetVersions(); 

そして、私はselectedVersionを持っています。

私のVersionクラスはIComparableを実装しています。

public class Version : IComparable<Version> 

だから私はversions.Sort()を行うことができます。この時点で、私のVersionオブジェクトは、Nameプロパティによってリスト内でソートされています。

Versionsのリストから、selectedVersionより高いアイテムを取得したいと考えています。 Linqでどうしたらいいですか?

私が試したことは、selectedVersionIComparableにキャストしてから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

回避策? He-he、それは 'OrderBy'、' Min'、 'Max'が明示的なcomparerを指定していないときに内部的に使用しているものなので、これは解決策だと思います:) –

+0

それでは、 CompareTo'の実装ですか? – jmc

1

あなたはIComparableと同じではありませんIComparable<T>を実装しているように見えます。 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(); 
関連する問題