ICollection IEnumerable/IEnumerator IDictionaryEnumerator yield
Enumerable和IEnumerator接口是.NET中非常重要的接口,二者区别:
1. IEnumerable是个声明式的接口,声明实现该接口的类就是“可迭代的enumerable”,但并没用说明如何实现迭代器(iterator).其代码实现为:
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
2. IEnumerator是个实现式接口,它声明实现该接口的类就可以作为一个迭代器iterator.其代码实现为:
public interface IEnumerator
{
object Current { get; }
bool MoveNext();
void Reset();
}
3.一个collections要支持Foreach进行遍历,就必须实现IEnumerable,并一某种方式返回迭代器对象:IEnumerator.
static void Main(string[] args)
{
#region ICollection(CopyTo方法) IEnumerator(支持所有一般非泛型集合) IDictionaryEnuerator(HashTable/SortList支持一般非泛型键值对集合)
//集群枚举器:可以概念上认为复制了原始集群中的内容
Console.WriteLine("------------ 1 ArrayList-----------------");
#region ArrayList:IEnumerator
ArrayList al = new ArrayList() { 1, 2, 3, 4 };
IEnumerator iEnum = al.GetEnumerator();
IEnumerable alIEnumerable = (IEnumerable)al.GetEnumerator();
foreach (var item in alIEnumerable)
{
Console.WriteLine(string.Format("IEnumerable{0} = {1}",item.ToString(),item.ToString()));
}
while (iEnum.MoveNext())
{
Console.WriteLine(string.Format("IEnumerator{0} = {1}",iEnum.Current,iEnum.Current));
}
#endregion
Console.WriteLine();
Console.WriteLine("------------ 2 SortedList-----------------");
#region SortedList:IEnumerator/IDictionaryEnumerator
SortedList sl = new SortedList();
sl.Add(1, 1);
sl.Add(2, 2);
sl.Add(3, 3);
IEnumerator slIEnum = sl.GetEnumerator();
while (slIEnum.MoveNext())
{
DictionaryEntry slDE = (DictionaryEntry)slIEnum.Current;
Console.WriteLine(string.Format("slIEnum{0} = {1}", slDE.Key, slDE.Value));
}
Console.WriteLine("-------------------------------------");
IDictionaryEnumerator slIDicEnum = sl.GetEnumerator();
while (slIDicEnum.MoveNext())
{
Console.WriteLine(string.Format("slIDicEnum{0} = {1}", slIDicEnum.Key, slIDicEnum.Value));
}
#endregion
Console.WriteLine();
Console.WriteLine("------------ 3 Hashtable-----------------");
#region Hashtable:IEnumerator/IDictionaryEnumerator
Hashtable ht = new Hashtable();
ht.Add(1,1);
ht.Add(2,2);
ht.Add(3, 3);
IEnumerator htIEnum = ht.GetEnumerator();
while (htIEnum.MoveNext())
{
DictionaryEntry de = (DictionaryEntry)htIEnum.Current;
Console.WriteLine(string.Format("htKeyIEnum{0} = {1},htValueIEnum{2} = {3}", de.Key, de.Key, de.Value, de.Value));
}
Console.WriteLine("-------------------------------------");
IDictionaryEnumerator htIDicEnum = ht.GetEnumerator();
while (htIDicEnum.MoveNext())
{
Console.WriteLine(string.Format("htIDicEnumKey{0} = {1},htIDicEnumValue{2} = {3}", htIDicEnum.Key, htIDicEnum.Key, htIDicEnum.Value, htIDicEnum.Value));
}
#endregion
Console.WriteLine();
Console.WriteLine("------------ 4 ICollection---------------");
#region ICollection:从指定的System.Array索引处,将System.Collections.ICollection的元素复制到System.Array中
ICollection icKey = ht.Keys;
ICollection icValue = ht.Values;
int[] intKey = new int[icKey.Count];
int[] intValue = new int[icValue.Count];
//从指定的System.Array索引处,将System.Collections.ICollection的元素复制到System.Array中
icKey.CopyTo(intKey, 0);
icValue.CopyTo(intValue, 0);
foreach (int i in intKey)
{
Console.WriteLine(string.Format("intKey[{0}]= {1}", i, i));
}
Console.WriteLine("-------------------------------------");
foreach (int i in icValue)
{
Console.WriteLine(string.Format("intValue[{0}]= {1}", i, i));
}
#endregion
#region IEnumerable
foreach (int i in ShowIEnumerable(2, 8))
{
Console.WriteLine(i);
}
#endregion
#endregion
Console.ReadKey();
}
/// <summary>
/// yield:在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。
/// 它的形式为下列之一:
/// 1)yield return <expression>;
/// 2)yield break;
/// 计算表达式并以枚举数对象值的形式返回;expression 必须可以隐式转换为迭代器的 yield 类型。
/// yield 语句只能出现在 iterator 块中,该块可用作方法、运算符或访问器的体。这类方法、运算符或访问器的体受以下约束的控制:
/// 1)不允许不安全块。
/// 2)方法、运算符或访问器的参数不能是 ref 或 out。
/// 此外:
/// 1)yield 语句不能出现在匿名方法中
/// 2)当和 expression 一起使用时,yield return 语句不能出现在 catch 块中或含有一个或多个 catch 子句的 try 块中
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
public static IEnumerable ShowIEnumerable(int num1, int num2)
{
int num3 = 0;
int result = 1;
while (num3++ < num2)
{
result = result * num1;
yield return result;
}
}
ICollection IEnumerable/IEnumerator IDictionaryEnumerator yield的更多相关文章
- C#中的 IList, ICollection ,IEnumerable 和 IEnumerator
IList, ICollection ,IEnumerable 很显然,这些都是集合接口的定义,先看看定义: // 摘要: // 表示可按照索引单独访问的对象的非泛型集合. [ComVisible(t ...
- IList, ICollection ,IEnumerable AND IEnumerator in C#
IList, ICollection ,IEnumerable 很显然,这些都是集合接口的定义,先看看定义: // 摘要: // 表示可按照索引单独访问的对象的非泛型集合. [ComVisible(t ...
- C# ~ 从 IEnumerable / IEnumerator 到 IEnumerable<T> / IEnumerator<T> 到 yield
IEnumerable / IEnumerator 首先,IEnumerable / IEnumerator 接口定义如下: public interface IEnumerable /// 可枚举接 ...
- IEnumerable、IEnumerator与yield的学习
我们知道数组对象可以使用foreach迭代进行遍历,同时我们发现类ArrayList和List也可以使用foreach进行迭代.如果我们自己编写的类也需要使用foreach进行迭代时该怎么办呢? IE ...
- IEnumerable, IEnumerator接口
IEnumerable接口 // Exposes the enumerator, which supports a simple iteration over a non-generic collec ...
- [原译]实现IEnumerable接口&理解yield关键字
原文:[原译]实现IEnumerable接口&理解yield关键字 著作权声明:本文由http://leaver.me 翻译,欢迎转载分享.请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢 ...
- c#yield,IEnumerable,IEnumerator
foreach 在编译成IL后,实际代码如下: 即:foreach实际上是先调用可枚举对象的GetEnumerator方法,得到一个Enumerator对象,然后对Enumerator进行while循 ...
- 【Unity|C#】基础篇(20)——枚举器与迭代器(IEnumerable/IEnumerator)
[学习资料] <C#图解教程>(第18章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- IEnumerable & IEnumerator
IEnumerable 只有一个方法:IEnumerator GetEnumerator(). INumerable 是集合应该实现的一个接口,这样,就能用 foreach 来遍历这个集合. IEnu ...
随机推荐
- more,less,head,tail
当用cat,tac命令查看文件时,文件的所有内容都会被刷出来,因为缓存有限,被刷过去的内容可能就留不住了.用cat查看个小文件还可以,查看大文件时就用到下面的命令. more (选项)(参数) ...
- Yii2.0怎么设置时区?
在config文件夹下,main.php 中, return [ 'charset' => 'utf-8', 'language' => 'zh-CN', 'timeZone' => ...
- $(document).height 与$(window).height的区别
$(document).scrollTop() 获取垂直滚动的距离 (即当前滚动的地方的窗口顶端到整个页面顶端的距离)$(document).scrollLeft() 这是获取水平滚动条的距离 要获取 ...
- Linux下的软件管理
一.软件包管理简介 1源码包(脚本安装) ①.特点: a.开源 ,可以修改 b.自由选择所需功能 ...
- Mysql数据类型TINYINT(1)与BOOLEAN踩坑记
熟悉Mysql的同学应该都知道,Mysql查询的boolean结果将输出为0或者1. 比如: ; 其输出结果为1. 查阅mysql官方文档仅找到如下描述: 11.10 Using Data Types ...
- [Windows内核分析]KPCR结构体介绍 (CPU控制区 Processor Control Region)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 逆向分析操作系统内核代码至少需要具备两项技能: 段页汇编代码非常懂 ...
- java之ThreadLocal详解
一.ThreadLocal简介 ThreadLocal是线程的局部变量,是每一个线程所单独持有的,其他线程不能对其进行访问,通常是类中的private static字段. 我们知道有时候一个对象的变量 ...
- 机器学习中梯度下降法原理及用其解决线性回归问题的C语言实现
本文讲梯度下降(Gradient Descent)前先看看利用梯度下降法进行监督学习(例如分类.回归等)的一般步骤: 1, 定义损失函数(Loss Function) 2, 信息流forward pr ...
- 关于Python读写Excel
关于Excel的读写本人最近看到一篇不错的文章话不多少直接连接https://blog.csdn.net/qq_41185868/article/details/80469355
- python 安装pyqt
---恢复内容开始--- 一.安装 1.官网:www.riverbankcomputing.com 2.使用命令安装,可以自动去官网查找与Python版本号相同的程序进行下载,比较方便,如果不是这样也 ...