激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - ASP.NET教程 - 自寫一個模仿Dictionary與Foreach的實現及心得總結

自寫一個模仿Dictionary與Foreach的實現及心得總結

2019-10-26 12:30asp.net技術網 ASP.NET教程

利用閑暇時間自己寫一個類模仿Dictionary實現,如果一個類進行foreach的話,該類必須實現IEnumerable,集合要支持foreach方式的遍歷,必須實現IEnumerable接口,感興趣的你可不要錯過了哈

自己寫一個類模仿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 的對象)

延伸 · 閱讀

精彩推薦
632
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产午夜免费不卡精品理论片 | 免费看成人av | 中文字幕线观看 | 大胆在线日本aⅴ免费视频 永久免费毛片 | 黄色a级片视频 | 精品久久中文网址 | 欧美一级淫片免费视频黄 | 国产一区二区在线观看视频 | 一区二区久久电影 | 法国性xxx精品hd专区 | 男女羞羞视频在线免费观看 | 欧美一级高清免费 | 91视频成人入口 | 狼网 | 天天躁狠狠躁夜躁2020挡不住 | 九九热视频这里只有精品 | 精品无码久久久久久国产 | 色就色 综合偷拍区91网 | 成人黄色短视频在线观看 | 羞羞的小视频 | 色婷婷久久久久久 | 日本在线免费观看视频 | 毛片视频播放 | 亚洲欧美天堂 | 日本道中文字幕 | 激情网站免费观看 | 欧美大电影免费观看 | 午夜亚洲影院 | 久久不射电影网 | 日本教室三级在线看 | 深夜激情视频 | 九色新网址 | 欧美成人理论片乱 | 久久精品片 | 7777欧美 | av在线免费播放 | 一区二区国产在线 | 久久久经典视频 | 亚洲精品wwww| 久草在线观看福利 | 视频在线亚洲 |