我有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
答案 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();