文章目录

  • 自定义集合
    • 什么是迭代器
    • 迭代器 Enumerator
    • 集合 IEumerable
    • yield return和yield break
  • 常用集合
    • 字典Dictionary
    • 栈Stack、队列Queue在数据结构和算法中常用
    • 双向列表LinkedList、IComparable、IList、[]索引运算符

自定义集合

什么是迭代器

  • 首先通过场景实现。
class MyList{private int[] Nums { get; set; }public MyList(int n){Nums = new int[n];var r = new Random();foreach(var i in Nums){Num[i] = r.Next(1,10);// 上句会报错,因为foreach是只读,无法赋值。}// 因此不用foreach(),用for如下for(int i=0; i<n; i++){Num[i] = r.Next(1,10);}}private int Index = -1;public bool MoveNext(){Index++;return Index < Nums.Length;}public int Current {get {return Nums[Index];}}
}class Program{...Main(..){var list = new MyList(5);while(list.MoveNext()){Console.WriteLine(list.Current);}// 这里改为迭代器更为方便}
}
  • 上述程序中,如果想重新打印两次list,则需要在Main()中嵌套两层while(){}。
  • 但是两个while共用一个list,list中的Index只用于维护一层循环。因此引入迭代器。

迭代器 Enumerator

  • 把上例中list中用于迭代的部分拉出来单独做一个迭代器,再增加一个方法调用迭代器。
class Enumerator{private int[] Nums = null; public Enumerator(int[] nums){Nums = nums;}private int Index = -1;public bool MoveNext(){Index++;return Index < Nums.Length;}public int Current {get {return Nums[Index];}}
}
  • 在MyList中增加方法调用迭代器。
  • 有了迭代器,在Main()中使用如下。
class MyList{private int[] Nums { get; set; }public MyList(int n){Nums = new int[n];var r = new Random();for(int i=0; i<n; i++){Num[i] = r.Next(1,10);}}public Enumerator GetEnumerator(){return new Enumerator(Nums);}
}class Program{...Main(..){var list = new MyList(5);var e1 = list.GetEumerator();while(e1.MoveNext()){Console.WriteLine(e1.Current);var e2 = list.GetEumerator();while(e1.MoveNext()){Console.WriteLine("\t" + e2.Current);}}}
}
  • 其实上述也是设计模式中的迭代器模式。

集合 IEumerable

  • 类实现迭代器功能,C#中可称为集合。
  • 所以集合是实现了IEnumerable接口的类。
class MyList : IEnumerable<int>{// 接口自带方法,是因为以前没有泛型而留下的问题System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){throw new NotImplementedException();}
}

yield return和yield break

  • yield按照我的理解是输出迭代器中第几个值,以及用break停止。
class MyList : IEnumerable<int>{private int[] Nums { get; set; }public MyList(int n){Nums = new int[n];var r = new Random();for(int i=0; i<n; i++){Num[i] = r.Next(1,10);}}public IEnumerable<int> GetEnumerator(){yield return 1;yield return 2;yield return 3;// 调用该方法后根据循环依此输出1,2,3。// yield break 一般和if(){}联用。// 比较常用的是循环与yield return联用。foreach(var i in Nums){yield return i;}}
}class Program{...Main(..){var list = new MyList(5);var e1 = list.GetEumerator();foreach(var i in list){Console.WriteLine(e1.Current);foreach(var i2 in list){Console.WriteLine("\t" + e2.Current);}}}
}
  • 迭代器在我看来就是不一口气输出,二是可以与Main()中循环一步步慢慢来。
  • 迭代器和foreach关系:能用foreach()一定有迭代器。
  • foreach不可以修改,只读。

常用集合

  1. List
  2. Dictionary<TKey, TValue>
    字典的遍历,其中涉及到哈希表存储数据,查找速度很快。
  3. SortedList、SortDic…
  4. Stack<T>
  5. Queue<T>
  6. LinkedList<T>

字典Dictionary

class Program{...Main(..){var dic = new Dictionary<int, string>();dic.Add(1, "a");dic.Add(2, "b");dic[1] = "aa";var dic1 = new Dictionary<int, Dictionary<int, string>>();}}}
}

键值数据库也用到了Key-Value思想。

栈Stack、队列Queue在数据结构和算法中常用

  • 比较经典的如字符串表达式求值等。
  • “(1+2)*3”,用两个栈,一个栈存操作符,一个栈存数字。

双向列表LinkedList、IComparable、IList、[]索引运算符

  • IComparable中有CompareTo()方法。

C#笔记12 自定义集合和常用集合相关推荐

  1. Kotlin 学习笔记(二)—— 数据类、密闭类、循环写法以及常用集合操作符

    在上篇笔记中,我们对 Kotlin 的基本类型.关键字.类与对象,以及与 Java 之间互调的内容有了一些认识,这篇笔记来看看 Kotlin 中几种特殊的类,以及集合相关的常用操作. 1. Kotli ...

  2. Java常用集合笔记

    最近事情比较少,闲暇之余温习巩固一下Java的一些基础知识,并做一些笔记, Java常用集合, 主要参考的这篇文章:Java常用集合 ArrayList/Vertor 1. ArrayList 的主要 ...

  3. java常用集合详解

    文章目录 一.常用集合大纲 1.常用集合框架及介绍 2.集合和数组的区别 二.Collection 集合(接口) 三.List集合(接口) 1.存储遍历方式 2.ArrayList(实现类) 3.Li ...

  4. MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)

    1. Set  - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: {([Product].[Category].[Accessories]),([Product].[Ca ...

  5. 数据结构与常用集合总结

    数据结构与常用集合总结 数据结构(英语:data structure)是计算机中存储.组织数据的方式. 数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合. ...

  6. opsforlist 存在贼覆盖_RedisTemplate常用集合使用说明-opsForList(三)

    基础配置介绍已经在前面的<RedisTemplate常用集合使用说明(一)>中已经介绍了,现在我们直接介绍opsForList()方法的使用: 1.leftPush(K key, V va ...

  7. 数据结构源码笔记(C语言):集合的位向量表示

    /*BitSet.c*/ /*集合的位向量表示:函数实现*/#include <stdio.h> #include <stdlib.h> #define superNum 20 ...

  8. RedisTemplate常用集合使用说明-opsForZSet(六)

    基础配置介绍已经在前面的<RedisTemplate常用集合使用说明(一)]>中已经介绍了,现在我们直接介绍opsForZSet()方法的使用: 1.add(K key, V value, ...

  9. RedisTemplate常用集合使用说明-opsForSet(五)

    基础配置介绍已经在前面的<RedisTemplate常用集合使用说明(一)>中已经介绍了,现在我们直接介绍opsForSet()方法的使用: 1.add(K key, V- values) ...

最新文章

  1. php代码 2012057
  2. php数组,常量,遍历等
  3. mongodb教程二
  4. Word中更新交叉引用
  5. Gitee 使用问题记录
  6. OpenSSL库概述
  7. Delphi7中默认没有安装的官方控件
  8. Compile syslog-win32
  9. Java项目开发规范参考
  10. FPGA——HLS编程入门
  11. java山地车 故障,山地车故障的修理方法
  12. fixed定位失效问题如何解决
  13. 阿里云安全组 设置数据库仅自己电脑IP可登陆
  14. Python_阿基米德浮力问题
  15. 【C】阶乘后面0的数量
  16. UE4 创建自定义动画节点
  17. 如何让word中代码更优雅美观【图解】【可微调】
  18. 不懂优雅停机,搞挂了线上服务该咋办?
  19. 安装java1.6_JAVA1.6怎么安装
  20. 计算机毕业设计之java+javaweb的仓储系统出入库模块设计系统

热门文章

  1. 【Hive】解析字符串(类似array嵌套map结构)
  2. BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
  3. python异常处理与导入模块与导入包
  4. 如何解决 kubernetes 重启后,启来不来的问题
  5. dbeaver驱动问题解决方案
  6. win11中gpedit.msc找不到文件怎么办 windows11gepdit.msc找不到文件的解决方法
  7. 如何在Win11上本地显示CPU、GPU和RAM使用情况?
  8. 尝试自动重定向的次数太多_阿里Arthas 3.1.0版本:在线教程、内存编译器和强大的自动补全...
  9. 洛谷——P1296 奶牛的耳语
  10. 像excel一样规律填充(三)