分享好友 编程语言首页 频道列表

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

C#教程  2023-02-09 09:580

本文小编为大家详细介绍“C#怎么使用struct类型作为泛型Dictionary<TKey,TValue>的键”,内容详细,步骤清晰,细节处理妥当,希望这篇“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实例。

读到这里,这篇“C#怎么使用struct类型作为泛型Dictionary<TKey,TValue>的键”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注***行业资讯频道。

查看更多关于【C#教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
[Go语言]从Docker源码学习Go——指针和Structs
这两天在看reflect这个包在Docker中的使用时,遇到了各种问题,最后虽然知道怎么用了。但是对于这块的原理还不是太懂,于是把"THE WAY TO GO"中关键的几章看了下。继续坚持往下写,争取能说明白。源码还是先看Docker中源码, docker/api/client/cli.gotype Doc

0评论2023-02-09627

Go 结构体标签(Struct Tag)
原文链接:http://www.01happy.com/golang-struct-tag-desc-and-get/在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。形如:1 type User struct {2 UserId int`json:"user_id" bson:"user_id"`3 UserName st

0评论2023-02-09826

一.go语言 struct json相互转换
1.Go语言自带JSON转换库  encoding/json2.把对象转换为json的方法为 json.Marshal(),其函数原型为:func Marshal(v interface{}) ([]byte, error) { e := newEncodeState() err := e.marshal(v, encOpts{escapeHTML: true}) if err != nil {return nil, err

0评论2023-02-09483

你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象。二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它没有传统的类,也没有继承,取而代之的是结构和组合的方式,

0评论2023-02-09518

详解如何在Go语言中循环数据结构 go循环引用
目录如何在Go中循环字符串如何在Go中循环map结构如何在Go中循环Struct数组是存储类似类型数据的强大数据结构。您可以通过索引识别和访问其中的元素。在Golang中,您可以通过在0初始化变量i并增加变量直到它达到数组的长度,使用for循环循环数组。它们的语法如

0评论2023-02-09965

' (小程序)">sdk uncaught third Error Cannot assign to read only property 'construct
sdk uncaught third ErrorCannot assign to read only property 'constructor' of object '#V' 在app.json添加新的page时,出现该错误 修改添加新的page的json文件{"usingComponents": {}}修改后{}就好了,原因??不知道

0评论2023-02-09680

2.7 Rust Structs
A struct, or structure, is a custom data type that lets you name and package together multiple related values that make up a meaningful group.Defining and Instantiating Structs相比元组,struct中的属性是无序的To define a struct, we enter the

0评论2023-02-09499

文盘Rust -- struct 中的生命周期
最近在用rust 写一个redis的数据校验工具。redis-rs中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程。在开发中,不免要定义struct 中的某些元素为 trait object,从而带来一些rust语言中的生命周期问题。本文不具体讨论 redis的数据校验

0评论2023-02-09993

解析rust中的struct 基于rust
目录定义struct实例化struct取得struct里面的某个值struct作为函数的放回值字段初始化简写struct更新语法tuple structUnit-Like Struct(没有任何字段)struct数据的所有权什么事structstruct的方法定义方法​​​​​​​​​​​​​​方法调用的运算符关联

0评论2023-02-09453

解析Rust struct 中的生命周期
最近在用rust 写一个redis的数据校验工具。redis-rs中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程。在开发中,不免要定义struct 中的某些元素为 trait object,从而带来一些rust语言中的生命周期问题。本文不具体讨论 redis的数据校验

0评论2023-02-09658

MATLAB cell & struct
CELL cell的每个单元都可以存储任何数据,比如传递函数等。当然,存储矩阵更是没有问题的了。但是用cell数据类型之前,要先初始化。a=cell(n,m)那么就把a初始化为一个n行m列的空cell类型数据。 如何赋值呢?a{1,1}=rand(5)那么a的1行1列的单元中存储的就是一

0评论2023-02-08921

TypeScript - 构造函数 constructor
class Dog {// 需要先定义,才能在constructor中this指向name: string;age: number;// 构造函数,会在对象创建时调用// new Dog() 的时候,就会调用constructorconstructor(name:string, age:number) {/** * 在实例方法中,this就表示当前的实例 * 在构造函数

0评论2023-02-08503

Swift 浅谈Struct与Class
讨论Struct与Class之前,我们先来看一个概念:Value Type(值类型),Reference Type(引用类型):1. 值类型的变量直接包含他们的数据,对于值类型都有他们自己的数据副本,因此对一个变量操作不可能影响另一个变量;2. 引用类型的变量存储对他们的数据引用

0评论2023-02-08532

nodejs-express 报错View is not a constructor
可能是express版本问题view修改为views – app.set(‘views’,__dirname + ‘/views’);

0评论2023-02-08472

C++ Struct中遇到了Union啊,怎么转C#
RT。Union什么意思来着?貌似很繁琐。---------------------------------------------------------------2011年8月22日 15:06:40:什么是联合?联合(Union)是一种特殊的类,一个联合中的数据成员在内存中的存储是互相重叠的。每个数据成员都在相同的内存地

0评论2023-02-08744

C# 8.0 中的 Disposable ref structs(可处置的 ref 结构)
由于官方文档没有示例用法,开始一直看着摸不着头脑,因此在网上找了个实例,以供参考,希望有助于你我的理解。官方文档中的解释:  用 ref 修饰符声明的 struct 可能无法实现任何接口,因此无法实现 IDisposable。 因此,要能够处理 ref struct,它必

0评论2023-02-08995

更多推荐