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

本文关键字:项目 列表 大于 获取 | 更新日期: 2023-09-27 18:11:47

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

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

正确的方法是使用Comparer<T>.Default,一旦类型实现IComparable<T>IComparableT就会起作用:

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

您似乎已经实现了与IComparable不同的IComparable<T>。要么也实现IComparable,要么投射到IComparable<Version>,你应该能够做你想做的事。

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

或者,如果显式实现IComparable<Version>

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