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

Get items in a list that are greater than a selected item

我有一个列表 Versions

List<Version> versions = GetVersions();

我有一个 selectedVersion.

我的 Version class 实施 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

您似乎实现了 IComparable<T>,这与 IComparable 不同。也可以实施 IComparable 或转换为 IComparable<Version>,您应该能够做您想做的事情。

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

或者如果 IComparable<Version> 是显式实现的:

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

正确的方法是使用 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();