自写一个模仿Dictionary与Foreach的实现及心得总结
原文:
在世界的某个角落,隐藏着一个被大自然宠爱的地方——翡翠谷。这里的一切都如诗如画,让人流连忘返。清晨的阳光透过薄雾,洒在翡翠谷的每一寸土地上,每一片绿叶上。那些翠绿的山峦、清澈的溪流和五彩斑斓的野花都在晨曦中苏醒,展现出它们最美丽的一面。
这里的空气仿佛都充满了生命力,每一口呼吸都让人感觉身心得到了净化。沿着蜿蜒的小径漫步,四周是郁郁葱葱的树林,耳边是鸟儿的歌唱,鼻间充斥着野花的芬芳和湿土的清新。偶尔,一阵微风吹过,树叶轻轻摇曳,发出沙沙的响声,宛如大自然的和谐乐章。
翡翠谷的夜晚更是别有一番风味。星空如洗,银河清晰可见。月光洒在湖面上,波光粼粼,如同铺满了银粉的镜子。偶尔传来几声夜鸟的鸣叫,更增添了几分神秘感。在这里,人们可以暂时忘却尘世的烦恼,沉浸在大自然的怀抱中,感受心灵的宁静与和谐。
在世界的某个秘境,有一个被大自然深情眷顾的翡翠谷,这里的美景如诗如画,让人陶醉其中。清晨的第一缕阳光透过轻纱般的薄雾,温柔地抚摸着翡翠谷的每一寸土地和每一片绿叶。翠绿的山峦、清澈的溪流和绚丽的野花都在晨曦的温柔唤醒下,展现出它们最为迷人的一面。
这里的空气仿佛蕴含着生命的精髓,每一口呼吸都让人感觉心灵得到了洗礼。沿着那条蜿蜒曲折的小径漫步,四周是生机勃勃的树林,耳边传来的是鸟儿的欢快歌声,鼻间充斥着野花的馥郁香气和湿土的清新气息。微风吹过,树叶轻轻摇曳,发出沙沙的响声,宛如大自然奏响的交响乐。
夜晚的翡翠谷更是别有一番韵味。星空璀璨如洗,银河清晰可见。月光如流水般洒在湖面上,波光粼粼,仿佛铺满了银粉的宝镜。夜鸟的鸣叫为这宁静的夜晚增添了几分神秘色彩。在这里,人们可以暂时忘却尘世的喧嚣与纷扰,沉浸在大自然的怀抱中,享受心灵的平静与和谐。翡翠谷,是一个让人心灵得到净化、感受大自然魅力的世外桃源。a、自定义字典类MyDic的挑战与魅力
你是否厌倦了仅仅使用内置的Dictionary类,想要挑战自己,尝试一些新的东西?那么,让我们来自定义一个类,模仿Dictionary的实现,名为MyDic。这不仅是一个编程技能的展示,更是对数据结构理解的一次。
在MyDic类中,我们定义了一个基于List的KeyValuePair集合。每一个KeyValuePair都承载了一个键和对应的值。当我们在MyDic中添加一个元素时,我们简单地将一个新的KeyValuePair添加到我们的列表中。当我们检查是否包含某个键时,我们通过遍历列表来寻找它。
这个类对于想要在编程旅程中进一步了解数据结构的人来说是一个很好的实践项目。通过实现自己的数据结构,你可以更深入地理解如何有效地存储和检索数据。这也有助于你理解接口(如IEnumerable)的重要性以及它们如何使代码更具可重用性和灵活性。
b、挑战与性能测试
让我们进行一项有趣的测试。假设我们有一个英汉词典的文本文件,我们要将这个文件的内容加载到我们的MyDic类中,并与内置的Dictionary类进行比较。我们来看看两者在处理包含某个键的请求时的性能差异。
我们使用内置的Dictionary类加载词典,并使用Stopwatch来测量包含某个键的时间。然后,我们使用MyDic类重复这个过程。结果令人惊讶吗?虽然MyDic类的实现相对简单和直观,但在性能测试中,我们发现它相对于内置的Dictionary类存在明显的性能差距。
这是因为MyDic在检查键的存在时需要遍历整个列表,这是一个O(n)的操作,而Dictionary使用了一种高效的哈希表结构,使得查找操作的复杂度降低到O(1)。这个测试突显了选择正确的数据结构对于性能的重要性。虽然MyDic是一个有趣的学习项目,但在实际的性能要求较高的应用中,我们仍然会选择内置的Dictionary类或其他更高效的数据结构。
Dictionary的高效之处与自定义IEnumerable的奇妙之旅
在编程的世界里,我们常常遇到关于数据结构和算法的挑战。当我们对比自己模仿实现的Dictionary与.NET Framework提供的版本时,可能会发现性能上的差异。为什么.NET Framework提供的Dictionary比我们自己实现的版本更快呢?这背后的秘密在于其内部的高效机制。
Dictionary中有一个存储键值对的区域,这个区域采用了一种特殊的存储方式。每个存储单元都有独特的地址编号,这些地址是通过一个高效的哈希算法计算得出的。当我们想要存储一个键值对时,只需要根据key计算其哈希值,然后将键值对存储到相应的地址即可。查找时也是如此,只需根据key计算地址,就能迅速找到数据。这就像是根据钥匙(key)快速找到房间号,而不是逐个房间去查找。
那么,我们能否自己实现一个类似Foreach的遍历机制呢?答案是肯定的。在C中,Foreach功能背后依赖的是IEnumerable接口。要实现自己的遍历机制,我们首先需要创建一个类,实现IEnumerable接口。这个接口要求我们提供一个GetEnumerator方法,该方法用于获取一个IEnumerator对象,这个对象可以遍历集合中的每一个元素。
下面是一个简单的示例代码,展示如何自己实现一个实现了IEnumerable接口的类:
```csharp
using System.Collections; //引入IEnumerable所在命名空间
namespace IEnumerater
{
public class MyList : IEnumerable //实现接口IEnumerable
{
private ArrayList ary = new ArrayList(); //内部使用ArrayList来存储数据
public void Add(string name) //提供一个Add方法用于添加元素
{
ary.Add(name);
}
//自定义索引器,类似于属性,可以方便地访问集合中的元素
public string this[int index]
{
get { return ary[index].ToString(); }
}
public int this[string name]
{
get
{
for (int i = 0; i < ary.Count; i++)
{
if (ary[i].Equals(name))
{
return i;
}
}
return -1; //未找到返回-1
}
}
public IEnumerator GetEnumerator() //实现IEnumerable接口的GetEnumerator方法
{
for (int i = 0; i < ary.Count; i++)
{
yield return ary[i].ToString(); //使用yield关键字实现IEnumerator接口的MoveNext和Current方法的功能
}
}
}
}
```
要使用自己实现的IEnumerable类进行遍历,只需创建一个对象实例,然后使用foreach语句即可。例如:
```csharp
MyList mylist = new MyList(); //创建自己的IEnumerable对象实例
mylist.Add("wanghao"); //调用Add方法添加元素
foreach (string item in mylist) //使用foreach遍历对象中的元素并打印出来
{
网络安全培训
- 自写一个模仿Dictionary与Foreach的实现及心得总结
- 通过图带你深入了解vue的响应式原理
- JavaScript编程的单例设计模讲解
- Angular HMR(热模块替换)功能实现方法
- 微信小程序 textarea 组件详解及简单实例
- 详解vantUI框架在vue项目中的应用踩坑
- 在 asp.net core 的中间件中返回具体的页面的实现方
- vue中锚点的三种方法
- .NET Core中创建和使用NuGet包的示例代码
- js时间查询插件使用详解
- ajax结合豆瓣搜索结果进行分页完整代码
- Vue实现自定义下拉菜单功能
- PHP实现页面静态化的超简单方法
- javascript中的作用域和闭包详解
- JS键盘版计算器的制作方法
- Angular.js中$resource高大上的数据交互详解