自己写一个类模仿Dictionary实现
a、自定义字典类MyDic 复制代码 代码如下:
using System.Collections.Generic;
namespace _10_自己写Dictionary {
class KeyValuePair {
public KeyValuePair() {
}
public KeyValuePair(string key, string value) {
this.key = key;
this.value = value;
}
private string key;
public string Key {
get {
return key;
}
set {
key = value;
}
}
private string value;
public string Value {
get {
return this .value;
}
set {
this.value = value ;
}
}
}
class MyDic {
List<KeyValuePair > list = new List<KeyValuePair >();
public void Add(string key, string value) {
list.Add( new KeyValuePair (key, value));
}
public bool ContainsKey(string key) {
bool res = false ;
foreach(KeyValuePair item in list) {
if(item.Key == key) {
res = true;
break;
}
}
return res;
}
}
}
b、调用测试 复制代码 代码如下:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
namespace _10_自己写Dictionary {
class Program {
static void Main(string[] args) {
//Dictionary方法实现
Dictionary<string , string> dic = new Dictionary <string, string>();
string[] filecon = File .ReadAllLines("英汉词典TXT格式.txt", Encoding.Default);
for(int i = 0; i < filecon.Count(); i++) {
string[] arr = filecon[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if(!dic.ContainsKey(arr[0])) {
dic.Add(arr[0], arr[1]);
}
}
Stopwatch sw = new Stopwatch();
sw.Start();
dic.ContainsKey( "china");
sw.Stop();
Console.WriteLine(sw.Elapsed);//00:00:00:0000055;
//自己写的list实现
MyDic mydic = new MyDic();
string[] filecon2 = File .ReadAllLines("英汉词典TXT格式.txt", Encoding.Default);
for(int i = 0; i < filecon2.Count(); i++) {
string[] arr = filecon2[i].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if(!mydic.ContainsKey(arr[0])) {
mydic.Add(arr[0], arr[1]);
}
}
Stopwatch sw2 = new Stopwatch();
sw2.Start();
mydic.ContainsKey( "china");
sw2.Stop();
Console.WriteLine(sw2.Elapsed);//00:00:00:0001287;慢了多少倍!!! 因为dictionary比list多了字典目录
Console.Read();
}
}
}
b中测试结果显示自己模仿的没有.Net FrameWork提供的快 为什么呢?
答:Dictionary中有一个存储键值对的区域,这个区域的每个存储单元有地址编号,根据hashCode算法,计算key的值的键值对应该存储的地址,将键值对放入指定的地址即可。查找的时候首先计算key的地址,就可以找到数据了。根据key找房间号,而不是逐个房间找。(*)或者说:当把一个kvp,采用一个固定算法(散列算法)根据key来计算这个kvp存放的地址。取的时候也是根据要找的key可以快速算出kvp存放的地址。
面试题中经常会问Foreach实现了什么接口这个问题很好回答,那我们能不能自己模仿实现Foreach呢?
c、Foreach内部原理:IEnumerable接口 自己实现IEnumerable
复制代码 代码如下:
using System.Collections;//引入IEnumerable所在命名空间
namespace IEnumerater {
class MyList : IEnumerable {//实现接口IEnumerable 它就一个IEnumerator声明枚举器的方法
ArrayList ary = new ArrayList();
public void Add(string name) {
ary.Add(name);
}
//自己写索引器 形式类似属性 作用类似枚举 方便快捷的方式 访问集合中的元素
public string this[ int index] {//int类型
get {
return ary[index].ToString();
} //index>ary.Count时超出索引界限
//set { }
}
public int this[ string name] {//string类型 通过name查找索引 参数类型自己决定 返回类型自己决定
get {
for(int i = 0; i < ary.Count; i++) {
if(ary[i] == name) {
return i;
}
}
return -1;
}
}
public IEnumerator GetEnumerator() {//IEnumerator F12跳转定义这里可以发现foreach只允许读取数据,而不能修改数据
for(int i = 0; i < ary.Count; i++) {
yield return ary[i].ToString();// yield关键字 可以看到 实现IEnumerator(枚举器)接口中MoveNext(指向下一条)方法 和Current(获取当前元素 因为只有get 所以可以理解为什么foreach不能修改值的原因了) 以及Reset重置索引
}
}
}
}
d、调用自己的IEnumerable
复制代码 代码如下:
using System;
namespace IEnumerater {
class Program {
static void Main(string[] args) {
//自己写一个类 实现了IEnumerable接口的getEnumerator()方法 就可以实现foreach的操作
MyList mylist = new MyList();
mylist.Add( "wanghao");//调用自己的add(string)方法
mylist.Add( "nihao");
mylist.Add( "buhao");
Console.WriteLine(mylist[1]);//使用自己的索引
Console.WriteLine(mylist["nihao" ].ToString());
foreach(string item in mylist) {
Console.WriteLine(item);
//item = "hello"; 不能使用foreach改变值
}
Console.Read();
}
}
}
总结:
如果一个类进行foreach的话,该类必须实现IEnumerable,集合要支持foreach方式的遍历,必须实现IEnumerable接口(还要以某种方式返回实现了IEnumerator 的对象)
相关推荐:
ChatGPT怎么找梯子:突破网络限制,轻松访问AI助手的终极指南,鬼灭之刃人物AI还原
seo软件是什么职位,seo用的是什么软件 ,ai感知树
重生成AI:突破科技前沿,开启智能未来
优化页面-提升用户体验与搜索引擎排名的关键,绍兴视频营销推广
AI缩写文档:革新文档管理与自动化的未来,ai聊天中文
AI生成文章免费工具,让创作变得轻松又高效,ai安心健
为什么越来越多的人选择在知乎发布文章?这里面的机会你可能还没发现!,潍坊关键词排名提升
优化服务网-提升客户体验,打造全方位智慧服务平台,东莞网站建设员招聘信息
seo相当于什么职业,seo相当于什么职业类别 ,usatisfy ai
智能AI写作生成:如何借助人工智能提升创作效率与质量
ChatGPT无法加载?检查您的网络设置并尝试重启ChatGPT,解决您的使用困扰!,ai光晕制作
用AI生成文章,让创作更简单高效
ChatGPT点不了?背后的真相与解决方法,ai.520523
ChatGPTO1Pro模型:开启AI新纪元,免费应用带来无尽可能,苹果上的ai写作在哪里
chatai写作免费一键生成,轻松解决写作难题!,陈逗逗ai换脸在线看
SEO有话:如何用精准优化助力企业在线增长,食品微信营销推广
SEO观看:如何通过优化提升您的网站流量和品牌影响力,龙里网络营销推广
人工AI软件的未来:智能时代的创新驱动力
SEO学堂:开启数字营销新时代,全面提升网站排名与流量,文山ai营销推广方案
SEO优化要钱吗?揭秘SEO投资背后的价值与回报,ai领域
SEO新闻:2025年最新趋势与最佳实践,你不可错过的SEO战略,郑州网络营销推广的优势
SEO非常:如何利用SEO提升网站排名与流量,助力品牌快速成长,绥化短视频营销推广
seo要懂些什么软件,seo常用软件 ,ai写作网站网址大全
SEO收集:如何通过有效数据收集提升网站排名,鞍山商城网站建设报价
ChatGPT翻译打不开?解决方法!,ai爱股票
SEO总结:如何通过优化提升网站排名与流量,关键词排名消失
SEO提高:如何通过精准优化让网站流量翻倍,优化排名seo加盟费用
SEO场景下的数字营销:如何通过精准优化提升网站流量,陕西融发建设集团网站
seo算是什么营销方式,seo是网络营销吗 ,ai318
AI人工智能:改变未来的科技革命
AI免费生成文章的软件:轻松创作的秘密武器
SEO攻略:搜索引擎优化,快速提升网站排名,网站推广网站优化费用
SEO热词:提升网站排名的关键秘诀,一句话营销推广怎么写好
SEO优化顾问:让您的网站脱颖而出的秘密武器,ai ps 群
为什么“蜘蛛弛查询”能成为提升网站排名的秘密武器?,惠州网站推广v1戈seo24
智能AI写文章:高效创作新风尚
seo用什么论坛引流,seo引流方法 ,ai写作续写神器
乘风SEO:突破困境,领航网络营销新时代,武汉靠谱的关键词排名
ChatGPT:引领人工智能对话新时代的智能助手,Ai shiang
SEO部:开启数字化营销新纪元的幕后英雄,株洲营销推广是什么公司
ChatGPT故障:科技背后的秘密与应对策略,华为什么手机带ai功能
OpenPose大白话解释:让你轻松理解姿态识别的神奇技术,ai天天晴
SEO优化需要给网站做哪些优化工作?,ai捕捉火苗
ChatGPT为什么访问不了?全面解析及解决方案,ai首页设计
SEO出超:如何通过精准优化实现网站流量大爆发,营销推广方式联系f火15星
为什么做抖音seo,为什么做抖音推广 ,描边ai虚线
AI免费写文:创作新时代的高效助手
seo独立站是什么,独立站推广是什么 ,ai曲线笔刷扩展
seo种草什么意思,seo yoo na ,三维地震反演AI
SEO如何做?全方位解析提升网站排名的秘诀,AI翻译好处