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;
}
}
最新文章
- Android—自定义标题栏的实现及遇见的问题解决
- Codeforces #380 div2 C(729C) Road to Cinema
- Sublime3安装过程及常用插件安装及常用快捷键
- 37-more 简明笔记
- Java中的可变参数以及foreach语句
- php对图片反色处理
- Windows下Cygwin中使用NCView
- echo向文件中写入
- 一个int 数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。
- 杭电1233还是畅通project
- 一个简单的Garbage Collector的实现
- Android:如何实现更换主题
- 系统装机硬盘格式 >;>; GPT或者UEFI
- Java向服务端转身 系统平台所对应的机器语言 虚拟CPU的机器语言字节码 bytecode
- MVC框架json数据展示程序(第一版)
- Guava之FluentIterable使用示例
- Filter接口编写过滤器
- MySQL---索引算法B+/B-树原理(一)
- Testlink 机器重启后Access denied for user &#39;admin &#39;@&#39;localhost&#39; (using password: YES)解决
- Win7下 OpenCV+Qt开发环境搭建
热门文章
- Apache和Tomcat 配置负载均衡(mod-proxy方式)-无session共享、无粘性session
- Spring Security 梳理 - DelegatingFilterProxy
- springmvc(三)
- idea 自动生成并跳转单元测试
- 【爬虫小程序:爬取斗鱼所有房间信息】Xpath
- 【ADO.NET-中级】百万级数据的批量插入的两种方法测试
- Eclipse的Debug各种视图介绍(二)
- Activity的四种加载模式详解:
- B-微积分-sign(符号)函数
- 我的Java秋招面经大合集