首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C#记录类型与集合的深度解析:从默认行为到自定义比较

    决定将所有数据模型设为不可变后,在C#中使用记录类型(我全部使用密封记录)来实现这些模型几乎是理所当然的选择。只需用主构造函数相同的格式指定所需属性,编译器就会自动生成大量样板代码。...当属性类型的默认比较器符合需求时这很完美——但并非总是如此。在我们的选举数据模型中,大多数类型没问题,但ImmutableListT>不符合要求,而我们大量使用了它。...ImmutableListT>本身没有重写Equals和GetHashCode方法——因此具有引用相等语义。...我真正需要的是使用元素类型的相等比较器,判断两个不可变列表在元素数量相同且元素成对相等时视为相等。这很容易实现——连同合适的GetHashCode方法。...我愚蠢地忽略了IEqualityComparerT>的逆变特性:存在从IEqualityComparer到任何类类型X的IEqualityComparer的隐式引用转换。

    15310

    精:C# 泛型集合类List使用总结

    一旦定义,无法改变其元素总数 (2) 如果使用数组类型存储数据,一旦项目需求有变化,那必须修改原数组相关代码,得不偿失 (3) 如果数据总数非常大,那数组在定义时就要把长度(即元素总数)定义的非常大,造成了存储空间的巨大浪费...而List跟数组比较,他可以动态增减元素个数,无任何限制,直接秒杀数组 当然,实际项目开发中,对于一些固定的枚举值,类型集合等,或相关数据处理中,使用数组还是相当方便的,它并不是没用的,而是相比较List...List做数据处理时,完全可以采用强大的Linq,处理起来那是相当的方便\ 去重、交集、并集、差集操作 注:这里仅介绍当List中T为引用类型(对象)时,基本类型(值类型)就不说了,因为可以直接用!.....其值为一个引用地址,在栈内存中,地址是唯一的,但是也有可能两个地址指向同一个堆中的值呢.......因此要想比较,先把他的值点出来比较,可以只比较某一个值,也可以是全部 重写Equals() 和 GetHashCode() 为什么要重新呢,因为这些比较方法的内部就是调用者两个方法进行比较的,他们仅适用于值类型的比较

    96130

    c#使用Linq的Distinct()方法去重

    在C#中,数据去重是一个常见的需求,尤其是在处理大量数据时。...本文将详细介绍Distinct()方法的工作原理、使用场景以及相关的性能考量。LINQ Distinct()方法的工作原理Distinct()方法是LINQ中的一个扩展方法,它返回序列中不重复的元素。...该方法使用IEqualityComparerT>默认比较器来确定元素是否相等。对于值类型,这通常是基于值的比较;而对于引用类型,则是基于引用的比较。...对复杂对象去重当处理复杂对象时,Distinct()方法默认使用对象的Equals()和GetHashCode()方法来确定对象是否相等。如果需要根据对象的特定属性进行去重,可以自定义比较器。...例如,对于大型对象,可以根据对象的特定属性来实现IEqualityComparerT>接口。延迟执行:LINQ查询是延迟执行的,这意味着实际的去重操作会在遍历结果序列时才执行。

    5.1K00

    c#使用自定义的比较器和循环遍历去重

    在C#中,自定义比较器和循环遍历是处理集合数据时的两个重要概念。自定义比较器允许我们定义对象比较的逻辑,而循环遍历则是操作集合的基本方法。...自定义比较器的基本概念在C#中,自定义比较器通常通过实现IComparerT>或IEqualityComparerT>接口来实现。...IComparerT>接口IComparerT>接口用于定义对象的比较逻辑,它包含一个Compare方法,该方法返回一个整数,表示一个对象是否小于、等于或大于另一个对象。...IEqualityComparerT>接口IEqualityComparerT>接口用于定义对象的相等性比较逻辑,它包含两个方法:Equals和GetHashCode。...在Compare方法中,我们首先比较年龄,如果年龄相同,再比较姓名。然后,我们使用PersonComparer来对people列表进行排序。

    4.9K00

    dotnet C# 基础 为什么 GetHashCode 推荐只取只读属性或字段做哈希值

    此 GetHashCode 方法推荐是在重写 Equals 方法时也同时进行重写,要求两个对象在 Equals 返回相等时,两个对象的 GetHashCode 返回值也相等。...反过来则不然,允许有两个不相等的对象的 GetHashCode 是相等的 在重写 Equals 方法时,大部分时候都是自动生成的,如将类里面的所有字段或属性都进行一一比较。...这些哈希容器在设计上都期望类型遵守以下行为:当两个对象相等的时候,那么获取 GetHashCode 的值也一定相等 假定有类型的 GetHashCode 返回值是基于非只读的属性或字段,将会导致在将对象加入哈希容器的时候...在未来对此对象的非只读的属性或字段进行变更,也许就会影响到此对象再次获取 GetHashCode 的属性,从而让相同的一个对象,在哈希容器里面,因为 GetHashCode 返回值不同,而被认为是不同的对象...如上面代码,更改了 Foo2 的 GetHashCode 返回值,将会让字典找不到此 HashCode 对应的元素,从而让字典认为不存在此对象 大部分在设计类型的时候,都不会考虑到某个类型在未来或其他模块里面

    90420

    LINQ之方法语法

    Select()方法用于隐式迭代所有的数据,可以在迭代中对每个数据进行处理: var a = vs.Select(v => ++v);//将所有数据加一并返回 SelectMany()方法用于返回多行结果...var a = vs.Contains(2);//true 它还有一个重载方法 Contains(T t,IEqualityComparerT> e),第二个参数用于自定义比较的规则,因为有的时候系统的直接比较法不是我们想要的...OrderBy OrderBy()用于排序,根据lambda表达式的返回值进行升序排序,它有一个重载,用于自定义排序规则,用法跟Contains()类似。...T Max(),T Min() 返回最大最小值,可以自定义排序规则(凡是涉及到比较或排序的,都可以自定义规则) double Sum() 求和 T ElementAt(),T ElementAtOrDefault...() 获取指定位置上的元素,后者对于访问出错的情况下返回可以将设置的默认值返回 本节到此结束...

    1.5K20

    dotnet C# 实现 GetHashCode 的方法

    本文来聊聊在重写某个类的 GetHashCode 方法时,可以如何实现 GetHashCode 的返回值 按照 GetHashCode 方法的原则,要求两个对象如果 Equals 返回 true 那么一定要求...GetHashCode 也返回相同的值。...当然,反过来不成立,也就是两个对象返回的 GetHashCode 的值相同,对象可以是不相等的 实现 GetHashCode 方法的方式有很多,最简单的就是通过调用基类的 GetHashCode 方法,...类型的,也就是调用了 object 的 GetHashCode 方法,其实和调用 RuntimeHelpers 的 GetHashCode 方法是相同的,因为在 object 方法里面的 GetHashCode...只要两个相等的对象返回的 int 值是相同的就没锅 public readonly struct FooInfo { public string Name { get;

    99330
    领券