十六、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 ...
随机推荐
- .net framework client profile
.NET Framework Client Profile The .NET Client Profile is a subset of the .NET Framework, which was p ...
- squid透明代理+iptables防火墙,多网卡详细配置
squid透明代理+iptables防火墙详细配置 看到很多人都在不停地问iptables+squid做透明代理的问题,鄙人不才,斗胆在此做统一解答.如有任何纰漏还望各位批评指教. ========= ...
- 大脑提取每一个体素26领域的matlab代码
%-------------- outer loop for x= 1:40 for y =1:48 for z =1:34 %----------inter loop x=20; y=30; z=1 ...
- “ORA-12545: 因目标主机或对象不存在,连接失败”怎么办?
大概知道是因为主机名或者IP地址的原因引起的,但是不知道究竟,就去百度上查了查,然后就根据几种答案做出了以下就该: 1.E:\oracle\product\10.2.0\db_1\NETWORK\AD ...
- 制作手机浏览器显示格式的HTML页面
最近要推出手机支持访问的HTML页面效果,而这在制作手机页面的过程中状况连连. 主要一下就我制作的工程中所遇的问题说明一下: 1. 改掉HTML页面声明:(以往大部分页面都是HTML4.0的声明) 还 ...
- std::min 与std::max 的 Compiler Error C2780
代码 #include<iostream>#include <algorithm> // std::min#undef minint main(){ float a =15.0 ...
- Android项目开发全程(二)--Afinal用法简单介绍
本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...
- [转]让程序在崩溃时体面的退出之SEH
原文地址:http://blog.csdn.net/starlee/article/details/6636723 SEH的全称是Structured Exception Handling,是Wind ...
- ACM_2057
/* 2013暑期多校联合训练 - 80 +高校,300 +队伍,10000元奖金,敬请期待? A + B再次 时间限制:1000/1000 MS(JAVA /其他)内存限制:32768分之32768 ...
- [Java] JavaMail 发送带图片的 html 格式的邮件
JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...