首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C# 中的IComparable和IComparer

他要求实现类型定义的一个方法,CompareTo(T)该方法指示当前实现在排序顺序中的位置是在同一个类型和第二个对象之前、之后还是与其相同。通常,不会直接从开发人员代码中调用方法。...相反他由ListT>.Sort()和Add等方法自动调用。 通常,提供IcomparableT>实现的类型还IEquatableT>实现接口。...IEquatableT>接口Equals定义方法,该方法确定实现类型的实例的相等性。 CompareTo(T)方法的实现必须Int32返回具有以下三个值之一的,如下表所示。...IComparableT>和IComparerT> 上述示例中我们将对象进行了多次的装箱和拆箱,那么此时我们可以将方法改为泛型的,泛型的出现也让我们避免了装箱和拆箱的资源浪费....最终我们实现的代码片段如下: IComparableT> class Student : IComparable { public string Name

76020

C# 中的IComparable和IComparer

IComparable接口 该接口由其值可以排序或排序的类型实现,并提供强类型的比较方法以对泛型集合对象的成员进行排序,例如数字可以大于第二个数字,一个字符串可以在另一个字符串之前以字母顺序出现。...他要求实现类型定义的一个方法,CompareTo(T)该方法指示当前实现在排序顺序中的位置是在同一个类型和第二个对象之前、之后还是与其相同。通常,不会直接从开发人员代码中调用方法。...相反他由ListT>.Sort()和Add等方法自动调用。 通常,提供IcomparableT>实现的类型还IEquatableT>实现接口。...IEquatableT>接口Equals定义方法,该方法确定实现类型的实例的相等性。 CompareTo(T)方法的实现必须Int32返回具有以下三个值之一的,如下表所示。...最终我们实现的代码片段如下: IComparableT> class Student : IComparable { public string Name

58300
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C# SortedList类概念和示例

    大家好,又见面了,我是全栈君 SortedList 类 [C#]   命名空间: System.Collections   表示键/值对的集合,这些键和值按键排序并可按照键和索引访问。   ...SortedList 的元素将按照特定的 IComparer 实现(在创建 SortedList 时指定)或按照键本身提供的 IComparable 实现并依据键来进行排序。...默认比较器 ComparerT>.Default 检查键类型 TKey 是否实现 System.IComparableT> 以及是否使用该实现(如果可用)。...否则,ComparerT>.Default 将检查键类型 TKey 是否实现 System.IComparable。...如果键类型 TKey 未实现任一接口,则您可以在构造函数重载中指定一个接受 comparer 参数的 System.Collections.Generic.IComparerT> 实现。

    1.7K20

    自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

    ,还是int,貌似我的Point就比int少了接口实现,问题应该就出在这里,而且最后一个泛型接口IEquatable特别显眼,看下定义: public interface IEquatable...补上 IEquatable 接口 有了这个思路,我也跟FCL学,让Point实现 IEquatableT>接口,然后在TProxyT>代理类中约束下必须实现IEquatableT>,修改代码如下:...,虽然是成功了,但有一个地方让我不是很舒服,就是上面的第二行代码,在 TProxyT> 处约束了T,因为我翻看List的实现也没做这样的泛型约束呀,可能有点强迫症吧,贴一下代码给大家看看。...因为这里的runtimeType实现了IEquatableT>接口,所以代码返回了一个泛型比较器:GenericEqualityComparerT>,然后我们继续查看这个泛型比较器是咋样的。 ?...从图中可以看到最终还是对T进行了IEquatableT>约束,不过这里给提取出来了,还是挺厉害的,然后我也学的模仿一下: ? 可以看到也走了我的自定义实现,两种方式大家都可以用哈。

    33820

    C# - 实现类型的比较

    IComparableT> .NET 里,IComparableT>是用来作比较的最常用接口。...如果某个类型的实例需要与该类型的其它实例进行比较或者排序的话,那么该类型就可以通过实现IComparableT>接口来达到此目的。 IComparableT>只提供了一个方法: ?...针对相等性而言,IEquatableT>仅仅就是对object里的那些Equals方法的补充。而针对比较性而言,IComparableT>是主打的方式。 其它的方式都有对应。...在自定义类型上实现比较 其实我通常不在我的类型上去实现IComparableT>,包括引用类型和原始类型。...=都实现了,那么其它的相等性判断方法也应该一同实现: object.Equals() object.GetHashCode() IEquatableT> 看起来挺麻烦,但这只是一个struct,还是相对简单的

    1K20

    C# dotnet 一个还看的过去的 B 树实现

    我尝试找到一个 B 树的实现,尽管这个东西十分简单,但是依然网上有很多不同的版本。...我在 justcoding121 的版本上魔改了一下,就是本文可以用来给大家的版本 基本上很难有啥需求需要用到 B 树,在 dotnet 里面提供了默认的 SortedList 可以解决快速搜寻的问题...,在 SortedList 的实现原理是一个搜寻二叉树。...当然本文不是来吹 SortedList 的实现了,继续回到 B 树的实现 因为这个 B 树也许只有在教科书上面才有用,因此比较难会用到真实的需求上,因此大部分对他的实现也仅仅是能实现出来。...WaleawhalharWogerjedearwhel.CompareTo(other.WaleawhalharWogerjedearwhel); } } } 下面是 B 树的实现

    22210

    规范约束条件

    要解决这些问题,我们就必须把确实需要的约束写出来,这句话说起来简单,其实做起来不太容易。下面我就来讲解一下如何正确的编写一个规范的约束。 零、简述 何为约束?...is IComparableT>) { IComparableT> val1 = t1 as IComparableT>; if(t2 as IComparable...throw new ArgumentException($"{nameof(t2)} 没有实现 IComparableT>"); } } else {...throw new ArgumentException($"{nameof(t1)} 没有实现 IComparableT>") } } 这段代码中执行了大量的强类型转换,在转换之前还判断时传入的参数是否实现了...但是对于把性能看的特别重的开发人员来说,前者是最优的方案。 Tip:如果有较好的方法,我还是建议大家使用较好的方法,比如前面我们所说的 IComparable.Equals 。

    94010

    C#内建接口:IEquatable泛型

    像之前我们讲过的IComparable,IEnumerable接口,它们属于是1.0时期的内建接口,那时C#还没有泛型的概念,而2.0以后的版本,才有泛型的概念。...之所以出现泛型接口,是因为通过泛型可以减少值类型的装箱,以及实现类型安全。 IEquatable中有什么?...IEquatable接口得Equals方法(我个人觉得,为了与继承于Object的Equals方法做区分,您应该显示实现接口,避免在调用时出现歧义)。...但是这个方法接受一个Object类型的参数,存在装箱和类型安全这样的问题,因此我们也有可能需要一个性能高一些的,并且类型安全的比较方法,为了规范代码,微软推出了IEquatable泛型接口。...我们可以认为Object的Equals是IEquatable的非泛型版本方法,但是在实际应用过程中,我还是推荐大家显式实现IEquatable,有一个良好的代码规范,会让人舒心,关于显示实现接口相关介绍请查看

    58121

    C#有什么惊艳到你的地方?

    1、C#良好兼容了值类型/引用类型,在发展中逐步解决了其他高级语言没解决好的问题 纵观主流语言,C语言在语法上是以值类型为基础,借助指针实现引用类型;而Python/Lua等语言,是以引用类型为基础...transform.position += move; } 这段代码没有在堆上分配空间,你所看到的操作全都是在栈上进行的,GC压力为0。我认为这是C#最令人惊艳的一点。..., IComparable, IComparable, IEquatable { // .... } 熟悉C++的人,经过思考,可以很好的理解...IComparable、IEquatable以及它们的泛型形式。...C#的良好设计让它在游戏开发领域走出了一条光明大道,在其它领域也有着越来越广泛的应用。C#出现较晚,算是当今所有语言的集大成者。现在它的发展主要受市场环境制约。

    15640

    C# - 为值类型重定义相等性

    实现步骤 重写object.Equals()方法 实现IEquatableT>.Equals()接口方法 重写 == 和 !...实现IEquatableT>接口 首先来实现IEquatableT>接口。...这里面我对三个属性进行了比较,使用了==操作符。其中==对于string来说就是比较值,而enum其实就是int,DateTime也是值类型,并且已经实现了相等性判断的功能。...最后调用的这个Equals()方法,是我们上面写的那个强类型的方法,因为other变量的类型是Person。 但是这个方法仍然涉及到装箱操作,所以还是IEquatableT>的实现方法更快一些。...看一下resharper自动实现的代码: ? 这里使用了unchecked,防止抛出溢出异常。 Name是引用类型,可能为null,所以判断一下。

    1.2K20

    30分钟泛型教程

    一、泛型入门: 我们先来看一个最为常见的泛型类型ListT>的定义 (真正的定义比这个要复杂的多,我这里删掉了很多东西) [Serializable] public class ListT> : IList...同时,也不是强类型的,不能在编译期确定参数的类型 有了IComparableT>就解决掉这个问题了 int CompareTo(T other); 七、泛型委托 委托描述方法, 泛型委托的由来和泛型接口类似...} } 上面的代码要求T类型必须实现了IComparableT>接口 如你所见:泛型的约束通过关键字where来实现。...MyActionT,out TResult>(T obj); 那么,就可以让如下代码通过编译(不用强制转换) var a = new MyActionArgumentException...>(o => new ArgumentException(o.ToString())); MyAction b = a; 这就是逆变和协变的威力。

    73060

    C Sharp(十二)

    where T3: IComparable { //... } 约束类型和次序 共有 5 种类型的约束: 类名: 某种类或类的子类才能做 type argument class: 任何引用类型才能做...type argument struct: 任何值类型才能做 type argument 接口名: 只有这个接口或实现这个接口的类型才能做 type argument new(): 任何带有无参构造的类型才能做...type argument 顺序: 主约束必须放在第一位且只有一个: 主约束只能是类名、class 或者 struct 接口名约束可以有任意多个 如果存在构造约束,必须放在最后 class SortedList...where M: IComparable where N: ICloneable { ... } class MyDictionary(T t); C# 中有两个常用的预定义的泛型委托: Func 和 Action: Action 是无返回值的泛型委托,有 16 个重载(即最多 16 个参数) Func 是有返回值的泛型委托,

    84720

    .NET面试题系列 - 泛型

    通过限制类型的数量,可以对这些类型执行更多的操作。例如下面的方法,T被约束为必须是实现了IComparable接口的类型。...此时,传入的T除了拥有object类型的方法之外,还额外多了一个CompareTo方法。由于保证了传入的T必须是实现了IComparable接口的类型,就可以肯定T类型一定含有CompareTo方法。...static int CompareT>(T o1, T o2) where T : IComparableT> { return o1.CompareTo(o2); } 此时如果将object...因为object没有实现IComparableT>接口。 泛型约束分为如下几类: 接口约束:泛型实参必须实现某个接口。接口约束可以有多个。 基类型约束:泛型实参必须是某个基类的派生类。...下面的代码能够通过编译,但是在运行时会抛出 ArgumentException 异常: Func stringFunc = () => ""; Func objectFunc

    72730
    领券