C#使用struct类型作为泛型Dictionary<TKey,TValue>的键

我们经常用简单数据类型,比如int作为泛型Dictionary<TKey,TValue>的key,但有时候我们希望自定义数据类型作为Dictionary<TKey,TValue>的key,如何做到?

如果我们想自定义一个struct类型作为key,就必须针对该struct定义一个实现IEqualityComparer<T>接口的比较类,实现该接口的2个方法:Equals()方法和GetHashCode()方法,前者用来比较两个key是否相等,后者用来获取key的哈希值。

模拟这样一个场景:当我们去商场购物,经常需要把随身物品存放到某个储物柜,然后拿着该储物柜的钥匙。把钥匙抽象成key,不过,稍后会定义成一个struct类型的key,把随身物品抽象成值,那么所有的储物柜就是一个Dictionary<TKey,TValue>键值对集合。

定义一个struct类型的key,并且针对该struct定义一个比较类。

    public struct GoodsKey
    {
        private int _no;
        private int _size;

        public GoodsKey(int no, int size)
        {
            _no = no;
            _size = size;
        }

        public class EqualityComparer : IEqualityComparer<GoodsKey>
        {

            public bool Equals(GoodsKey x, GoodsKey y)
            {
                return x._no == y._no && x._size == y._size;
            }

            public int GetHashCode(GoodsKey obj)
            {
                return obj._no ^ obj._size;
            }
        }
    }

随身物品抽象成如下。

    public class Goods
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

客户端。

    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<GoodsKey, Goods> list = new Dictionary<GoodsKey, Goods>(new GoodsKey.EqualityComparer());
            GoodsKey key1 =new GoodsKey(1, 100);
            list.Add(key1,new Goods(){Id = 1, Name = "手表"});
            if (list.ContainsKey(key1))
            {
                Console.WriteLine("此柜已经本占用~~");
            }
            else
            {
                Console.WriteLine("此柜目前是空的~~");
            }
            Console.ReadKey();
        }
    }

运行,输出:此柜已经本占用~~

以上,在实例化Dictionary<GoodsKey, Goods>的时候,需要在其构造函数指明实现IEqualityComparer<GoodsKey>的比较类EqualityComparer实例。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 深入探讨C#中的结构struct

    一.结构和类的区别 1.结构的级别和类一致,写在命名空间下面,可以定义字段.属性.方法.构造方法也可以通过关键字new创建对象. 2.结构中的字段不能赋初始值. 3.无参数的构造函数无论如何C#编译器都会自动生成,所以不能为结构定义一个无参构造函数. 4.在构造函数中,必须给结构体的所有字段赋值. 5.在构造函数中,为属性赋值,不认为是对字段赋值,因为属性不一定是去操作字段. 6.结构是值类型,在传递结构变量的时候,会将结构对象里的每一个字段复制一份拷贝到新的结构变量的字段中. 7.不能定义自动

  • C# 泛型字典 Dictionary的使用详解

    本文主要介绍了C# 泛型字典 Dictionary的使用详解,分享给大家,具体如下: 泛型最常见的用途是泛型集合,命名空间System.Collections.Generic 中包含了一些基于泛型的集合类,使用泛型集合类可以提供更高的类型安全性,还有更高的性能,避免了非泛型集合的重复的装箱和拆箱. 很多非泛型集合类都有对应的泛型集合类,我觉得最好还是养成用泛型集合类的好习惯,他不但性能上好而且 功能上要比非泛型类更齐全.下面是常用的非泛型集合类以及对应的泛型集合类 非泛型集合类 泛型集合类 Ar

  • 深入解析C#编程中struct所定义的结构

    结构是使用 struct 关键字定义的,例如: public struct PostalAddress { // Fields, properties, methods and events go here... } 结构与类共享大多数相同的语法,但结构比类受到的限制更多: 在结构声明中,除非字段被声明为 const 或 static,否则无法初始化. 结构不能声明默认构造函数(没有参数的构造函数)或析构函数. 结构在赋值时进行复制.将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修

  • 分析C# Dictionary的实现原理

    一.理论知识 对于Dictionary的实现原理,其中有两个关键的算法,一个是Hash算法,一个是用于应对Hash碰撞冲突解决算法. 1.1.Hash算法 Hash算法是一种数字摘要算法,它能将不定长度的二进制数据集给映射到一个较短的二进制长度数据集,常见的MD5算法就是一种Hash算法,通过MD5算法可对任何数据生成数字摘要.而实现了Hash算法的函数我们叫她Hash函数.Hash函数有以下几点特征. 相同的数据进行Hash运算,得到的结果一定相同.HashFunc(key1) == Hash

  • C#实现Dictionary字典赋值的方法

    Dictionary<TKey,TValue> 类,表示键和值的集合. Dictionary<TKey,TValue> 泛型类提供一组键到一组值的映射. 每次对字典的添加都包含一个值和与其关联的键. 使用其键检索值的速度非常快. 之前使用Dictionary,也没遇到什么问题,感觉很方便,通过键值对的形式进行新建 – 存储 – 校验Key/Value是否存在 – 读取 – 修改/移除维护,一切正常. 近期取犯了一个不应该犯的错 – 赋值. class Program { stati

  • 详解C#对Dictionary内容的通用操作

    目录 一.实现效果 1.1实现的功能 1.2实现的功能效果图 二.实现核心 三.使用方法 3.1引用命名空间 3.2使用示例 一.实现效果 1.1实现的功能 ①添加信息到字典中: ②根据键获取值: ③根据值获取键: ④修改指定键的值: ⑤修改指定值为相同信息: ⑥根据键移除信息: ⑦根据值移除信息: 1.2实现的功能效果图 二.实现核心 /*** * Title:"容器" 项目 * 主题:Dictionary的帮助类 * Description: * 功能: * ①添加信息到字典中 *

  • c# Struct的一些问题分析

    目录 与类的区别: Struct的理论看过好一些,可是工作上基本没有应用过,Class倒处处都有.难道Struct就没有什么使用价值吗?搜了一下如何在类和结构中做出选择? ✔️ 如果类型的实例很小且通常寿命很短或通常嵌入其他对象中,请考虑定义结构而不是类. ❌ 避免定义结构,除非该类型具有以下所有特征: 它在逻辑上表示单个值,类似于原始类型(int,double等). 它的实例大小低于 16 字节. 它是不可变的. 它不必经常装箱. 在开发软件时,常常会有页面弹窗,而主页面经常需要传一些参数到窗

  • C#使用Dictionary<string, string>拆分字符串与记录log方法

    Dictionary<string, string>拆分字符串 private Dictionary<string, string> GenDictionary(byte[] inMsg) { Dictionary<string, string> dictionary = new Dictionary<string, string>(); string arg= Encoding.Default.GetString(inMsg); char[] trimCh

  • c# List和Dictionary常用的操作

    本文主要汇总了在开发过程中,使用List和Dictionary常用的方法,例如增.删.改.查.排序等等各种常用操作. 在平时的开发过程中,List和Dictionary是我们经常使用到的数据结构,而且由于本人记性又差有些方法长时间不用就都忘了,所以总结出此博客,用于记录和分享一下关于这两种数据结构的使用方法. 一.List 首先对于这些内容最权威和完整介绍的地方就是微软的官方文档,里面全面且详细的介绍了Lits的所有属性及方法,经常查看官方文档是一个非常好的习惯.本文将会总结出在日常开发过程中相

  • C#中结构(struct)的部分初始化和完全初始化实例分析

    本文实例分析了C#中结构(struct)的部分初始化和完全初始化,分享给大家供大家参考.具体分析如下: 假设有这样一个值类型struct,如下所示: public struct Size { public int Length; public int Width; public int Area() { return Length*Width; } } 一.客户端,给所有struct字段初始化后调用方法 class Program { static void Main(string[] args

  • C# Struct的内存布局问题解答

    问题:请说出以下struct的实例大小以及内存布局 复制代码 代码如下: struct Struct1{    public byte a;    public short b;    public string c;    public int d;} struct Struct2{    public byte a;    public long b;    public byte c;    public string d;} struct Struct3{    byte a;    b

  • C#入门之结构类型Struct

    概述: 结构类似于类,但结构为值类型,存储于栈中. 结构不能继承和被继承,但可实现接口. 结构成员访问级别有public,private(默认) ,internal. 1.简单结构 可以将无方法,属性等简单类,声明为结构,提高系统处理效率. 定义结构类型: struct Pair { public int x; public string y; } 调用: Pair p;//只有结构中只存在字段时,new才可以省略. Pair P1 = new Pair(); p.x = 10; p.y = "

  • 浅析C# 结构体struct

    结构体 有时候我们仅需要一个小的数据结构,类提供的功能多于我们需要的功能:考虑到性能原因,最好使用结构体. 结构体是值类型,存储在栈中或存储为内联(如果结构体是存储在堆中的另一个对象的一部分). 例如类class: public class Dimensions { public Dimensions(double length, double width) { Length = length; Width = width; } public double Length { get; set;

随机推荐