//主函数//主函数里面调用的类都在后面有具体描述
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace GeneralType
{
class Program
{
static void Main(string[] args)
{
LinkedListNode<int> sub = new LinkedListNode<int>();
LinkedListNode<int> sub1 = new LinkedListNode<int>();
LinkedListNode<int> sub2 = new LinkedListNode<int>();
sub.next = sub1;
sub.prev = null;
sub1.prev = sub;
sub1.next = sub2;
sub2.prev = sub1;
sub2.next = null;
LinkedListNode<int> point;
point = sub2;
while(point!=null)
{
string text= point.Value.ToString();
Console.WriteLine(text);
point = point.prev;
}
Console.ReadLine();
//上面是创建节点类的实例,下面是创建了一个链表的实例
var link = new LinkList<int>();
link.Addlast();
link.Addlast();
link.Addlast();
link.Addlast();
foreach(int i in link)
{
Console.WriteLine(i);
}
Console.ReadLine();
return ;
} }
}
//以下是建立了两个类,分别在不同的文件中//LinkedListNode<T>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace GeneralType
{
public class LinkedListNode<T>
{
//创建节点类,对象可以使全部类型
//本类具有值Value 的属性
//值需要在初始化的时候加入,不能再类外部通过其他方式对
//本类一个对象的值赋值
//本类包含两个引用属性,一个是指向本节点在链表中前面的节点,一个是指向后面的节点
//可以在本类中使用
//Internal修饰符是指在本程序集内可以赋值
public LinkedListNode(T value)
{
this.Value=value;
}
public T Value
{
private set;
get;
}
public LinkedListNode<T> prev
{
get;
internal set;
}
public LinkedListNode<T> next
{
get;
internal set;
}
}
}
//LinkList<T>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections; namespace GeneralType
{
public class LinkList<T>:IEnumerable<T>
{
//首先先为本类创建两个属性,First and Last
public LinkedListNode<T> First { get; private set; }
public LinkedListNode<T> Last { get; private set; }
//下面的函数式在向建立的链表对象中添加数据
//同时返回这个数据所建立的新的节点对象
public LinkedListNode<T> Addlast(T one)
{
var newnode = new LinkedListNode<T>(one);
if(First==null)
{
First = newnode;
Last = newnode;
First.next = Last;
Last.prev = First;
}
else
{
Last.next = newnode;
newnode.prev = Last;
Last = newnode;
}
return newnode;
}
//通过实现GetEnumerable()方法可以使用foreach 遍历链表
//yield return和yield break 可以多次出现,但是不能用return语句
public IEnumerator<T> GetEnumerator()
{
LinkedListNode<T> current = this.First;
while(current!=null)
{
yield return current.Value;
//Console.WriteLine(current.ToString());
current = current.next;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}

C#学习之泛型的更多相关文章

  1. C#学习之泛型继承和静态成员

    想要理解这里有必要先将泛型类学习充分.这里讲解的是泛型类继承类的类型和静态成员. 在前面C#学习之泛型中,创建的LinkList<T>类实现了IEnumerable<T>接口. ...

  2. Java 理论和实践: 了解泛型 识别和避免学习使用泛型过程中的陷阱

    Brian Goetz (brian@quiotix.com), 首席顾问, Quiotix 简介: JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进.但是,对于初次使用泛 ...

  3. Java编程思想学习(十一) 泛型

    1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfac ...

  4. Java学习之——泛型

    1.概要 generics enable types (classes and interfaces) to be parameters when defining classes, interfac ...

  5. ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof

    一:如何去学习?都去学习什么? 1:学习优秀项目的设计思想,多问几个为什么,为什么要这么设计,这么设计的好处是什么,还能不能在优化 ,如何应用到自己的项目中 2:学习优秀项目的代码风格,代码的封装设计 ...

  6. luogg_java学习_09_泛型_集合

    这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 泛型 泛型介绍 1).类内部的属性的类型可以由外部决定: 2) ...

  7. [.NET自我学习]Delegate 泛型

    阅读导航 委托Delegate 泛型 1. 委托Delegate 继承自MulticastDelegate 声明委托定义签名: public delegate int DemoDelegate(int ...

  8. .net学习之泛型、程序集和反射

    一.泛型1.CLR编译时,编译器只为MyList<T>类型产生“泛型版”的IL代码——并不进行泛型的实例化,T在中间只充当占位符.例如:MyList 类型元数据中显示的<T> ...

  9. 【java基础学习】泛型

    泛型 1. 泛型类(声明的泛型类型静态方法不能使用) class Tools<T>{ private T t; public void set(T t){ this.t = t; } pu ...

  10. 学习Swift -- 泛型

    泛型 泛型代码可以让你写出根据自我需求定义.适用于任何类型的,灵活且可重用的函数和类型.它的可以让你避免重复的代码,用一种清晰和抽象的方式来表达代码的意图. 泛型所解决的问题 先来看一个交换两个int ...

随机推荐

  1. CSP201609-1:最大波动

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  2. CPU设计学习-流水线

    各种名词 标量流水线 超级流水线 超标量流水线与多发射技术 经典五级流水线 IF |Instruction Fetch,取指 ID |Instruction Decode,译码 EX |Execute ...

  3. 【机器学习】线性回归sklearn实现

    线性回归原理介绍 线性回归python实现 线性回归sklearn实现 这里使用sklearn框架实现线性回归.使用框架更方便,可以少写很多代码. 写了三个例子,分别是单变量的.双变量的和多变量的.单 ...

  4. codeforces 319B Psychos in a Line(模拟)

    There are n psychos standing in a line. Each psycho is assigned a unique integer from 1 to n. At eac ...

  5. Linux中常用的关机和重新启动命令

    hutdown.halt.reboot以及init,它们都可以达到关机和重新启动的目的,但是每个命令的内部工作过程是不同的,下面将逐一进行介绍. 一.shutdown shutdown命令用于安全关闭 ...

  6. Android开发 使用 adb logcat 显示 Android 日志

    作者 : 万境绝尘  转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入 ...

  7. 转Web开发的发展史---Web开发技术的演变

    转自:http://blog.csdn.net/zzzkk2009/article/details/9849431 在接下来的几个月时间里,我打算写一系列关于完整web开发的文章.这第一篇文章虽然有所 ...

  8. Thinkphp5使用validate实现验证功能

    作为前端er,对于验证这块有着切身的体会,虽然逐渐得心应手,但始终没有一个内置的功能拿来就能用.tp5恰好提供一个.本文简单介绍并实现以下.主要是实现一下. 验证的实现基于tp5内置的对象valida ...

  9. RT-thread内核之线程调度器

    一.前言 RT-Thread中提供的线程调度器是基于全抢占式优先级的调度,在系统中除了中断处理函数.调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自 ...

  10. HUAS 1480 虫洞(最短路)

    把每个点拆成两个点,分别表示黑洞和白洞,然后按题意模拟加边跑最短路即可. # include <cstdio> # include <cstring> # include &l ...