获取列表中大于选定项的项目
本文关键字:项目 列表 大于 获取 | 更新日期: 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>
或IComparable
,T
就会起作用:
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();