我无法找到如何为泛型类实现IComparable
接口方法CompareTo
。
我有一个名为BindingProperty<T>
的类,用于创建List<BindingProperty<intOrString>>
以绑定到DataGrid
。问题是我无法执行排序操作,因为IComparable
类没有实现BindingProperty<T>
接口。比较的结果将取决于BindingProperty<T>
类的数据成员'Value',其中'Value'是T类。当我点击DataGrid的列标题时,我得到一个异常< / em>未实现CompareTo()
方法。
我需要帮助来实现此接口。我应该使用IComparable<T>
吗?如果是,我该怎么办?
提前致谢 沙克蒂
答案 0 :(得分:0)
如果Type是自定义类,那么您的自定义类需要是IComparable。
e.g。
List<FooClass>
,然后FooClass
需要继承/实施IComparable
。
答案 1 :(得分:0)
您可以使用通用约束来要求T
实现IComparable<T>
。然后,您可以通过比较他们的BindingProperty<T>
成员来比较两个Value
实例。我不清楚您是否需要您的班级来实施IComparable
或IComparable<T>
,但实施这两项工作并不需要额外的工作。
class BindingProperty<T>
: IComparable<BindingProperty<T>>, IComparable where T : IComparable<T> {
public T Value { get; set; }
public Int32 CompareTo(BindingProperty<T> other) {
return Value.CompareTo(other.Value);
}
public Int32 CompareTo(Object other) {
if (other == null)
return 1;
var otherBindingProperty = other as BindingProperty<T>;
if (otherBindingProperty == null)
throw new ArgumentException();
return CompareTo(otherBindingProperty);
}
}
答案 2 :(得分:0)
在T上设置泛型类型约束。
public class BindingProperty<T> : IComparable where T : IComparable
{
public T Value {get; set;}
public int CompareTo(object obj)
{
if (obj == null) return 1;
var other = obj as BindingProperty<T>;
if (other != null)
return Value.CompareTo(other.Value);
else
throw new ArgumentException("Object is not a BindingProperty<T>");
}
}
修改强>
如果值未实现IComparable
则处理的替代解决方案。这将支持所有类型,如果他们没有实现IComparable
,就不会排序。
public class BindingProperty<T> : IComparable
{
public T Value {get; set;}
public int CompareTo(object obj)
{
if (obj == null) return 1;
var other = obj as BindingProperty<T>;
if (other != null)
{
var other2 = other as IComparable;
if(other2 != null)
return other2.CompareTo(Value);
else
return 1; //Does not implement IComparable, always return 1
}
else
throw new ArgumentException("Object is not a BindingProperty<T>");
}
}