获取列表中大于所选项目的项目

时间:2016-10-05 09:16:25

标签: c# linq compareto icomparable

我有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

3 个答案:

答案 0 :(得分:1)

您似乎已实施IComparable<T>,但与IComparable不同。也可以实施IComparable或投射到IComparable<Version>,你应该能够做你想做的事。

答案 1 :(得分:1)

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

IComparable<Version>是否明确实施:

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

答案 2 :(得分: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();