C#使用struct类型作为泛型Dictionary<TKey,TValue>的键
作者:Darren 发布时间:2023-10-09 01:53:35
标签: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实例。
来源:https://www.cnblogs.com/darrenji/p/3860307.html
0
投稿
猜你喜欢
- 本文实例为大家分享了Android绘制仪表盘指针刻度的具体代码,供大家参考,具体内容如下不废话,先看效果图:表盘的绘制重点有两点:1.表盘刻
- 前言Kafka是现在非常热门的分布式消息队列,常用于微服务间异步通信,业务解耦等场景。kafka的性能非常强大,但是单个微服务吞吐性能是有上
- AnDroidDraw 是一个与 DroidDraw 集成的 Android 应用程序,它允许你从 DroidDraw 应用 程序下载你的
- 堆排序基本介绍1、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),
- 本节只是介绍实战部分,具体的理论参数,请自行百度。所需工具:linux服务器 Jmeter测试工具 xshell &
- 本篇超级详细案例截图教学 IDEA如何运行SpringBoot项目,图片点击可放大仔细看Java编译工具以及环境准备:IDEA JDK1.8
- 很多公司由于历史原因,都会有自研的RPC框架。尤其是在2015-2017期间,Spring Cloud刚刚面世,Dubbo停止维护多年,很多
- 最近在做项目的时候有用到对两个集合中的元素进行对比求其交集的情况,因为涉及到的数据量比较大,所以在进行求两个集合中元素交集的时候,就应该考虑
- 目录前言一 安全性问题1.1 调用接口的先决条件-token1.2 使用POST作为接口请求方式1.3 客户端IP白名单1.4 单个接口针对
- 一、文件对话框C#中共有三种文件对话框,分别用于不同的功能:(1)用于打开文件的对话框OpenFileDialog。(2)用于保存文件的对话
- Android语音合成与语音识别,供大家参考,具体内容如下这里调用科大讯飞语音的API,语音云开放平台介绍调用科大讯飞语音的API,需要加添
- 本文实例通过Java的Zip输入输出流实现压缩和解压文件,前一部分代码实现获取文件路径,压缩文件名的更改等,具体如下:package com
- 前言开发中常用到主从数据库来提高系统的性能。怎么样才能方便的实现主从读写分离呢?近日工作任务较轻,有空学习学习技术,遂来研究如果实现读写分离
- 1.常见字符串编码常见的字符串编码有:LATIN1 只能保存ASCII字符,又称ISO-8859-1。UTF-8 变长字节编码,一个字符需要
- 我们经常看到使用了ViewPager的App,在每页上面都会有一个滑块来标志当前处于哪一页。在PagerView包里有android.sup
- 和线程停止相关的三个方法/*中断线程。如果线程被wait(),join(),sleep()等方法阻塞,调用interrupt()会清除线程中
- 一. 概述: Spinner是我们所熟悉的下拉框列表。与ListView类似,我们必须
- 简单回顾一下CAS算法CAS算法 即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多
- 本文实例讲述了C#实现客户端弹出消息框封装类。分享给大家供大家参考。具体如下:asp.net在服务器端运行,是不能在服务器端弹出对话框的,但
- eclipse的代码提交到git,下载后用新的ide工具IJ 进行开发一、导入项目eclipse里有workSpace 但是在IDEA中没有