标签: icomparable

何时使用IComparable <T> Vs. 的IComparer <T>

我想弄清楚我需要实现哪些接口.它们基本上都做同样的事情.我何时会使用一个而不是另一个?

.net icomparable icomparer

99
推荐指数
5
解决办法
3万
查看次数

IComparable和IEquatable接口有什么区别?

这两个接口似乎都在比较对象是否相等,那么它们之间的主要区别是什么?

c# interface icomparable iequatable

90
推荐指数
5
解决办法
2万
查看次数

如何实现IComparable接口?

我正在使用类的实例填充数组:

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)

但我不确定这是否是正确的解决方案.有什么建议?

c# interface icomparable

70
推荐指数
5
解决办法
8万
查看次数

如何比较泛型类型的值?

如何比较泛型类型的值?

我把它减少到最小的样本:

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()的存在==!=,但它并不能帮助对于关系运算符).

那么,有两个问题:

  1. 为什么我们观察到这种奇怪的行为?是什么让我们从比较这是泛型类型的值称为IComparable?它不是以某种方式打败了通用约束的整个目的吗?
  2. 我该如何解决这个问题,或至少解决这个问题?

(我意识到已经有一些问题与这个看似简单的问题有关 - 但没有一个线程能给出详尽或可行的答案,所以在这里.)

.net c# generics icomparable

70
推荐指数
4
解决办法
6万
查看次数

IStructuralEquatable和IStructuralComparable解决了什么问题?

我注意到这两个接口,以及几个相关的类,已经在.NET 4中添加了.它们对我来说似乎有点多余; 我已经阅读了几个关于它们的博客,但我仍然无法弄清楚它们在.NET 4之前解决了哪些棘手问题.

什么是使用IStructuralEquatableIStructuralComparable

.net equality icomparable iequalitycomparer

55
推荐指数
4
解决办法
7842
查看次数

IComparable和IComparer之间的区别

IComparableIComparerInterfaces有什么区别?是否有必要始终使用此Array.Sort()方法

.net c# icomparable icomparer

52
推荐指数
4
解决办法
5万
查看次数

IEquatable <T>,IComparable <T>应该在非密封类上实现吗?

任何人对是否有任何意见IEquatable<T>IComparable<T>一般应要求Tsealed(如果是class)?

这个问题发生在我身上,因为我正在编写一组旨在帮助实现不可变类的基类.基类要提供的部分功能是自动实现相等比较(使用类的字段以及可应用于字段来控制相等比较的属性).当我完成时它应该是相当不错的 - 我正在使用表达式树为每个动态创建一个编译的比较函数T,因此比较函数应该非常接近正则相等比较函数的性能.(我使用键入的不可变字典System.Type和双重检查锁定以合理的方式存储生成的比较函数)

尽管如此,有一件事是用来检查成员字段相等性的函数.我的初衷是检查每个成员字段的类型(我将调用X)是否实现IEquatable<X>.但是,经过一番思考后,除非X是这样,否则我认为这是不安全的sealed.原因在于,如果X不是sealed,我无法确定是否X正确地将等式检查委托给虚拟方法X,从而允许子类型覆盖相等比较.

这就提出了一个更普遍的问题 - 如果一个类型没有被密封,它是否应该真正实现这些接口?我想不会,因为我认为接口契约是比较两种X类型,而不是两种类型,可能是也可能不是X(虽然它们当然必须是X或者是子类型).

你们有什么感想?应该IEquatable<T>IComparable<T>避免对开封类?(也让我想知道是否有一个fxcop规则)

我现在的想法是让我产生比较功能只能用IEquatable<T>在成员字段,其Tsealed,而是用虚拟的Object.Equals(Object obj),如果T是密封的,即使T工具IEquatable<T>,因为该领域可能的潜在店亚型T和我怀疑的大多数实现IEquatable<T>适当设计的传承.

c# icomparable immutability sealed iequatable

36
推荐指数
2
解决办法
4313
查看次数

IComparable和IComparable <T>

我应该实现两者IComparable和通用IComparable<T>吗?如果我只执行其中一个,是否有任何限制?

.net c# icomparable

34
推荐指数
2
解决办法
5563
查看次数

为什么在实现CompareTo时我必须重载运算符?

假设我有一个实现IComparable的类型.

我还以为这是合理的期望,运营商==,!=,>,<,>=<=会"只是工作"自动调用的CompareTo而是我必须全部重写他们,如果我想使用它们.

从语言设计的角度来看,有这样一个很好的理由吗?有什么情况下,你A>B对行为不同真的有用Compare(A,B)>0吗?

c# icomparable

32
推荐指数
2
解决办法
2587
查看次数

我如何使用IComparable接口?

我需要一个如何使用IComparable接口的基本示例,以便我可以按升序或降序排序,并按我正在排序的对象类型的不同字段排序.

.net c# icomparable

17
推荐指数
2
解决办法
3万
查看次数