- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题与 Entity Framework 和内存排序有关。
阅读本文
https://learn.microsoft.com/en-us/dotnet/api/system.icomparable.compareto?view=netframework-4.7.2
如果类不是同一类型(或者,看例子,比较类不是可比较类的实例),我应该抛出异常。
我正在使用 GetType().IsInstanceOfType(obj))
来确定我是否应该按照 API 规范的要求抛出 InvalidArgumentException
。
我有两个类(class)
public class MyClass : IComparable
{
// ...
}
public class MyClassProxy : MyClass
{
// This class rappresent an EF proxy
// ...
}
应用 API 规范,MyClass.CompareTo(MyClassProxy)
应该可以正常工作,而 MyClassProxy.CompareTo(MyClass)
应该不起作用。
问题是,在这种情况下,我应该完全尊重 API 定义,还是应该部分释放关于类型的 API 约束,并且如果该类是可比较类的代理则不抛出异常?
如果我释放约束,检查类型兼容性的正确方法是什么?
最佳答案
如果MyClass
,我想知道你是否会有同样的问题会实现IComparable<MyClass>
相反或(或可能以及)IComparable
让我们用一个不太抽象的例子来做同样的问题。
假设我们有一个类 Animal
.每个动物都有一个 NumberOfLegs
.我们想按这条腿的数量对动物进行排序,所以我们实现了 IComparable<Animal>
.
假设我们还有一个类 Human,派生自 Animal
(尽管有些人会质疑)。每个Human
有一个 Name
,我们想订购 Humans
按名称,所以我们实现 IComparable<Human>
同样我们有一个Spider
,当然是八足Animal
:
class Animal : IComparable<Animal> {...}
class Spider : Animal, IComparable<Spider> {...}
class Human : Animal, IComparable<Human> {...}
下面的问题很容易回答:x 和 y 的值是多少?
Animal spider = new Spider();
Animal bill = new Human("William Shakespeare");
int x = spider.CompareTo(bill); // +1 A spider has more legs than bill
int y = bill.CompareTo(spider); // -1: bill has less legs than Spider
让我们再做一次:z 的值是多少?
Spider spider = new Spider();
Human bill = new Human("William Shakespeare");
int z = bill.CompareTo(spider); // ???
您希望这意味着什么?类 Human
不执行 IComparable<Spider>
,并不是所有的蜘蛛都有名字。所以我们所能做的就是通过腿数进行比较,这正是会发生的情况。
如果你真的想要在比较人类和蜘蛛时进行特殊处理(例如在 fearfactor 上),你应该让人类实现 IComparable<Spider>
(反之亦然)。
现在您已经确切地知道在实现 IComparable<Human>
时您会做什么, IComparable<Animal>
等。如果您还实现 IComparable
,我想您会知道该怎么做。
最后一点:只实现IComparable<...>
对于一个类,如果您的比较方法是该类对象的典型方法。也就是说,如果每个人都会说您的方法是对此类对象进行排序的自然方式。
这不是按腿数排序动物的自然方式。因此,读者不会凭直觉知道以下内容会做什么:
IEnumerable<Animal> myAnimals = ...
var result = myAnimals.OrderBy(animal => animal);
动物不应该像这样实现 IComparable。我们应该创建一个特殊的 Comparer 类来实现 IComparer<Animal>
关于腿数:
class AnimalLegCountCompare: IComparer<Animal> {...}
以下内容不会让读者感到困惑:
ICompared<Animal> legCountComparer = new AnimalLegCountComparer();
var result = myAnimals
.OrderBy(animal=>animal, legCountComparer);
关于c# - IComparable.CompareTo 正确实现考虑继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52146747/
我如何实现 IComparer int CompareTo(object obj) 有一个额外的参数,比如 int CompareTo(object obj, Dictionary preferenc
我在正确使用 IComparable<> 时遇到了一些麻烦界面。我还创建了一个实现 IComparer<> 的类.我几乎从一本书中复制了确切的编码示例,但对其进行了重新设计以适应我的情况,但它似乎无法
我是否应该同时实现 IComparable和通用 IComparable ?如果我只实现其中之一,是否有任何限制? 最佳答案 是的,您应该同时实现两者。 如果你实现其中一个,任何依赖于另一个的代码都会
这个问题在这里已经有了答案: When to use IComparable Vs. IComparer (8 个答案) 关闭 4 年前。 IComparable 和IComparer 接口(int
我正在尝试实现此链接的相同示例,但更注重受抚养 child 的数量。 http://www.codeproject.com/Articles/42839/Sorting-Lists-using-ICo
在大多数地方,我读到从 IComparable 继承是个好主意。和 IComparable在你的类中提供与非通用集合的兼容性。我的问题是为什么IComparable不继承自 IComparable那么
我正在使用 WPF 博士的 ObservableSortedDictionary。 构造函数如下所示: public ObservableSortedDictionary(IComparer comp
我知道 IComparable 之间有很大的区别和 IComparable一般情况下,请参阅 this , 但在这种搜索方法中,它不会有任何区别,还是会这样? public static int Se
我是 C# 的新手(6 个月的工作经验),但它看起来与 Java 非常相似,所以我感觉很自在。 但是,今天我尝试实现 IComparer 接口(interface)并想知道为什么它会给我一个错误: p
我有 Employee 类,我需要实现 IComparable 并使用 CompareTo 方法按姓名对员工进行排序。据我所知,我必须返回 1、-1 和 0,但我该如何使用这些字符串? 这是我的。 c
是否可以使用 iComparer 使用对象中的两个值对列表进行排序? 我有一个基于 value1 排序的自定义比较器类。但是对 value1 和 value2 进行排序的最佳方法是什么? 按 valu
我为装箱的 RegistryItem 对象定义了以下 IComparer: public class BoxedRegistryItemComparer : IComparer { publi
我正在尝试在相似值列表中获取唯一值,仅通过管道分隔字符串中的一个元素来区分...我不断得到至少一个对象必须实现 Icomparable。我不明白为什么我总是得到这个。我能够按该值进行分组...为什么我
假设我们有这 3 个类: Class BaseClass : System.IComparable { [int] $Value BaseClass([int] $v) {
所以我在这个错误上画了一个空白。无法比较数组中的两个元素。Array.Sort(患者);是产生错误的地方。我确实有一个 IComparable 接口(interface)和一个包含以下代码的类文件:T
我刚开始尝试使用 IEnumerable 接口(interface)。我总是只编写自定义哈希排序而不是尝试使用 native 语法,因为我对实现有些困惑。我正在尝试确定是否可以使用 BinarySea
我有一个 MyClass 类,我想像这样把它作为字典的键: Dictionary dict = new Dictionary(); 我想确保 MyClass 是唯一键,唯一性是通过查看 MyClass
在下面的代码中,我以 .NET 2.0 Framework 为目标。 我可以将 Programmer(派生)对象传递给需要 Person(基类)的 Compare 方法 但由于程序员是一个人(简单的
我正在尝试使用 IComparer 对对象数组进行排序。 我编写了代码,但它仅适用于特定对象。例如: 这门课 public class Cars { public string Name {
如何实现需要参数的 IComparer(可能不相关,但我在 Linq 查询中使用它)? 我想它应该这样称呼: ListOfObjectsToSort.orderBy(x => x, myCustomC
我是一名优秀的程序员,十分优秀!