十六、C# 常用集合类及构建自定义集合(使用迭代器)
public class BinaryTree<T> : IEnumerable<T>
{ public BinaryTree(T value)
{ }
public IEnumerator<T> GetEnumerator()
{ }
public T Value
{
get { return _value; }
set { _value = value; }
}
private T _value; }
public struct Pair<T>
{
private T _first;
private T _second;
public T First
{
get { return _first; }
set { _first = value; }
}
public T Second
{
get { return _second; }
set { _second = value; }
}
public Pair(T first,T second)
{
_first = first;
_second = second; }
}
class Program
{
static void Main(string[] args)
{
CSharpPrimitiveTypes primitives = new CSharpPrimitiveTypes();
foreach (string primitive in primitives)
{
Console.WriteLine(primitive);
} Console.ReadLine(); } } public class CSharpPrimitiveTypes : IEnumerable<string>
{
public IEnumerator<string> GetEnumerator()
{
yield return "object";
yield return "byte";
yield return "uint";
yield return "ulong";
yield return "float";
yield return "char";
yield return "bool";
yield return "string";
} //因为System.Collections.Generic.IEnumerable<T>继承
//System.Collections.IEnumerable这个接口,所以也需要实现
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{
Pair<string> fullname = new Pair<string>("xxm", "yyp");
foreach (string name in fullname)
{
Console.WriteLine(name);
} Console.ReadLine(); } } public struct Pair<T> : IEnumerable<T>
{
private T _first;
private T _second;
public T First
{
get { return _first; }
set { _first = value; }
}
public T Second
{
get { return _second; }
set { _second = value; }
}
public Pair(T first, T second)
{
_first = first;
_second = second;
}
#region IEnumerable<T>
public IEnumerator<T> GetEnumerator()
{
yield return First;
yield return Second;
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
class Program
{
static void Main(string[] args)
{
BinaryTree<string> jfkFamilyTree = new BinaryTree<string>("root");//根节点 jfkFamilyTree.Subitems = new Pair<BinaryTree<string>>(//左右树的根节点
new BinaryTree<string>("root-left"),
new BinaryTree<string>("root-right")
);
jfkFamilyTree.Subitems.First.Subitems = new Pair<BinaryTree<string>>(//左子树的左右子树的根节点
new BinaryTree<string>("root-left-left"),
new BinaryTree<string>("root-left-right")
);
jfkFamilyTree.Subitems.Second.Subitems = new Pair<BinaryTree<string>>(//右子树的左右子树的根节点
new BinaryTree<string>("root-righ-left"),
new BinaryTree<string>("root-righ-right")
); //遍历二叉树
foreach (string node in jfkFamilyTree)
{
Console.WriteLine(node);
} Console.ReadLine(); } } //二叉树(根节点,左右子树)
public class BinaryTree<T> : IEnumerable<T>
{ public BinaryTree(T value)
{
_value = value;
} private T _value;//根节点
public T Value
{
get { return _value; }
set { _value = value; }
}
private Pair<BinaryTree<T>> _subitems;//子树,总共两个,左子树和右子数
public Pair<BinaryTree<T>> Subitems//子树元素,每一项都是一个树
{
get { return _subitems; }
set
{
IComparable first;
first = (IComparable)value.First.Value;
if (first.CompareTo(value.Second.Value) < )
{
//first is less than second.
//在这可以做处理,比如交换,或者报错提示
//不过值类型赋值不会成功,需要使用其它方式,如换成类而不是struct
}
else
{
//first is not less than second.
}
_subitems = value;
}
}
public IEnumerator<T> GetEnumerator()
{
yield return Value;//返回根节点 foreach (BinaryTree<T> tree in Subitems)//遍历所有子树,从左向右遍历
{
if (tree != null)
{
foreach (T item in tree)//遍历子树当中的所有节点,会引起BinaryTree<T>中的GetEnumerator()递归调用
{
yield return item;
} }
} }
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion } //子树类(左右子树)
public struct Pair<T> : IEnumerable<T>
{
private T _first;//左子树
private T _second;//右子树
public T First
{
get { return _first; }
set { _first = value; }
}
public T Second
{
get { return _second; }
set { _second = value; }
} public Pair(T first, T second)
{
_first = first;
_second = second;
}
#region IEnumerable<T>
public IEnumerator<T> GetEnumerator()
{
yield return First;
yield return Second;
}
#endregion #region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
#endregion
}
Pair<string> game = new Pair<string>("first","second"); foreach (string name in game.GetReverseEnumerator())
{
Console.WriteLine(name);
} public struct Pair<T> : IEnumerable<T>
{
...
public IEnumerable<T> GetReverseEnumerator()
{
yield return Second;
yield return First;
}
}
十六、C# 常用集合类及构建自定义集合(使用迭代器)的更多相关文章
- (转)JAVA 十六个常用工具类
一. org.apache.commons.io.IOUtils closeQuietly 关闭一个IO流.socket.或者selector且不抛出异常.通常放在finally块 toString ...
- 《C#本质论》读书笔记(16)构建自定义集合
16.1 更多集合接口 集合类(这里指IEnumerable层次结构)实现的接口层次结构 16.1.1 IList<T>与IDictionary<TKey,TValue> 字典 ...
- Python学习(三十六)—— Cookie、Session和自定义分页
一.Django中操作Cookie 获取Cookie request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR ...
- 大数据笔记(十六)——Hive的客户端及自定义函数
一.Hive的Java客户端 JDBC工具类:JDBCUtils.java package demo.jdbc; import java.sql.DriverManager; import java. ...
- MFC编程入门之二十六(常用控件:滚动条控件ScrollBar)
回顾上一节,讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框和组合 ...
- VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)
回顾上一节,鸡啄米讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框 ...
- 测开之路三十六:常用的css选择器
在static下新建一个css,并写入内容 /*标签选择器,label标签的颜色为红色*/label {color: red;} /*.代表类选择器,绿色*/.test {color: green;} ...
- Gradle 1.12 翻译——第十六章. 使用文件
有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...
随机推荐
- wcf客户端捕获异常
直接使用Exception进行捕获,然后在监视器中查看具体是哪一个异常 System.Exception {System.ServiceModel.Security.MessageSecurityEx ...
- 【转】Android ProgressDialog的使用
原文网址:http://blog.csdn.net/sjf0115/article/details/7255280 版权声明:本文为博主原创文章,未经博主允许不得转载. <1>简介 Pro ...
- 低压差稳压器AMS1585
(1)高效线性稳压. (2)输出高达4.6A,最高输入电压15V,推荐最低压差1.5V(最低1.35V),最大压差12V. (3)两种封装:TO220(直插式),TO230(贴片). 典型电路如下图所 ...
- 浅谈qmake之pro、pri、prf、prl文件
浅谈qmake之pro.pri.prf.prl文件 转载自:http://blog.csdn.net/dbzhang800/article/details/6348432 尽管每次和cmake对比起来 ...
- c#基础语言编程-程序集和反射
程序集 什么是程序集? 1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合. 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位. 3.程序集是包含一个或者多个 ...
- [置顶] Array ArrayList LinkList的区别剖析
这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(41)-组织架构 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当 ...
- SQL server数据库中的DateTime类型出现的问题
我们知道这个SQL server数据库中的DateTime类型是数据库应用开发中经经常使用到的一种数据类型.而C#语言中也有DateTime类型,尽管二者都是用来描写叙述时间的,可是它们的默认值是不同 ...
- 谈一下怎样设计Oracle 分区表
在谈设计Oracle分区表之间先区分一下分区表和表空间的个概念: 表空间:表空间是一个或多个数据文件的集合,全部数据对象都存放在指定的表空间中,但主要存放表,故称表空间. 分区表:分区致力于解决支持极 ...
- Android Canvas drawText实现中文垂直居中
目标: 把中文字符绘制到目标矩形的居中位置. 问题: Android的Canvas绘图,drawText里的origin是以baseline为基准的,直接以目标矩形的bottom传进drawText, ...