我想弄清楚我需要实现哪些接口.它们基本上都做同样的事情.我何时会使用一个而不是另一个?
这两个接口似乎都在比较对象是否相等,那么它们之间的主要区别是什么?
我正在使用类的实例填充数组:
BankAccount[] a;
. . .
a = new BankAccount[]
{
new BankAccount("George Smith", 500m),
new BankAccount("Sid Zimmerman", 300m)
};
Run Code Online (Sandbox Code Playgroud)
一旦我填充这个数组,我想按余额金额对它进行排序.为了做到这一点,我希望能够检查每个元素是否可以使用排序IComparable
.
我需要使用接口来做到这一点.到目前为止,我有以下代码:
public interface IComparable
{
decimal CompareTo(BankAccount obj);
}
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否是正确的解决方案.有什么建议?
如何比较泛型类型的值?
我把它减少到最小的样本:
public class Foo<T> where T : IComparable
{
private T _minimumValue = default(T);
public bool IsInRange(T value)
{
return (value >= _minimumValue); // <-- Error here
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:
运算符'> ='不能应用于'T'和'T'类型的操作数.
到底怎么回事!?T
已被约束到IComparable
,甚至它限制值类型(的时候where T: struct
),我们仍然不能将任何运营商<
,>
,<=
,>=
,==
或!=
.(我知道,涉及到解决方法Equals()
的存在==
和!=
,但它并不能帮助对于关系运算符).
那么,有两个问题:
IComparable
?它不是以某种方式打败了通用约束的整个目的吗?(我意识到已经有一些问题与这个看似简单的问题有关 - 但没有一个线程能给出详尽或可行的答案,所以在这里.)
我注意到这两个接口,以及几个相关的类,已经在.NET 4中添加了.它们对我来说似乎有点多余; 我已经阅读了几个关于它们的博客,但我仍然无法弄清楚它们在.NET 4之前解决了哪些棘手问题.
什么是使用IStructuralEquatable
和IStructuralComparable
?
IComparable
和IComparer
Interfaces有什么区别?是否有必要始终使用此Array.Sort()
方法
任何人对是否有任何意见IEquatable<T>
或IComparable<T>
一般应要求T
是sealed
(如果是class
)?
这个问题发生在我身上,因为我正在编写一组旨在帮助实现不可变类的基类.基类要提供的部分功能是自动实现相等比较(使用类的字段以及可应用于字段来控制相等比较的属性).当我完成时它应该是相当不错的 - 我正在使用表达式树为每个动态创建一个编译的比较函数T
,因此比较函数应该非常接近正则相等比较函数的性能.(我使用键入的不可变字典System.Type
和双重检查锁定以合理的方式存储生成的比较函数)
尽管如此,有一件事是用来检查成员字段相等性的函数.我的初衷是检查每个成员字段的类型(我将调用X
)是否实现IEquatable<X>
.但是,经过一番思考后,除非X
是这样,否则我认为这是不安全的sealed
.原因在于,如果X
不是sealed
,我无法确定是否X
正确地将等式检查委托给虚拟方法X
,从而允许子类型覆盖相等比较.
这就提出了一个更普遍的问题 - 如果一个类型没有被密封,它是否应该真正实现这些接口?我想不会,因为我认为接口契约是比较两种X
类型,而不是两种类型,可能是也可能不是X
(虽然它们当然必须是X
或者是子类型).
你们有什么感想?应该IEquatable<T>
和IComparable<T>
避免对开封类?(也让我想知道是否有一个fxcop规则)
我现在的想法是让我产生比较功能只能用IEquatable<T>
在成员字段,其T
为sealed
,而是用虚拟的Object.Equals(Object obj)
,如果T
是密封的,即使T
工具IEquatable<T>
,因为该领域可能的潜在店亚型T
和我怀疑的大多数实现IEquatable<T>
适当设计的传承.
我应该实现两者IComparable
和通用IComparable<T>
吗?如果我只执行其中一个,是否有任何限制?
假设我有一个实现IComparable的类型.
我还以为这是合理的期望,运营商==
,!=
,>
,<
,>=
和<=
会"只是工作"自动调用的CompareTo而是我必须全部重写他们,如果我想使用它们.
从语言设计的角度来看,有这样一个很好的理由吗?有什么情况下,你A>B
对行为不同真的有用Compare(A,B)>0
吗?
我需要一个如何使用IComparable
接口的基本示例,以便我可以按升序或降序排序,并按我正在排序的对象类型的不同字段排序.
icomparable ×10
c# ×8
.net ×6
icomparer ×2
iequatable ×2
interface ×2
equality ×1
generics ×1
immutability ×1
sealed ×1