2016-10-05 13 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'가 명시 적으로 비교자를 지정하지 않을 때 내부적으로 사용하는 것입니다. 그래서 그들은 이것을 해결책으로 생각합니다 : –

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