C#泛型用法实例分析

本文实例分析了C#泛型用法。分享给大家供大家参考。具体分析如下:

这里演示如何创建具有单个类型参数的自定义泛型列表类,以及如何实现 IEnumerable<T> 以便对列表的内容启用 foreach 迭代。此示例还演示客户端代码如何通过指定类型参数来创建该类的实例,以及该类型参数的约束如何实现对类型参数执行其他操作。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace Generics_CSharp
{
  // 尖括号中的类型参数 T。
  public class MyList<T> : IEnumerable<T>
  {
    protected Node head;
    protected Node current = null;
    // 嵌套类型也是 T 上的泛型
    protected class Node
    {
      public Node next;
      // T 作为私有成员数据类型。
      private T data;
      // 在非泛型构造函数中使用的 T。
      public Node(T t)
      {
        next = null;
        data = t;
      }
      public Node Next
      {
        get { return next; }
        set { next = value; }
      }
      // T 作为属性的返回类型。
      public T Data
      {
        get { return data; }
        set { data = value; }
      }
    }
    public MyList()
    {
      head = null;
    }
    // T 作为方法参数类型。
    public void AddHead(T t)
    {
      Node n = new Node(t);
      n.Next = head;
      head = n;
    }
    // 实现 GetEnumerator 以返回 IEnumerator<T>,从而启用列表的
    // foreach 迭代。请注意,在 C# 2.0 中,
    // 不需要实现 Current 和 MoveNext。
    // 编译器将创建实现 IEnumerator<T> 的类。
    public IEnumerator<T> GetEnumerator()
    {
      Node current = head;
      while (current != null)
      {
        yield return current.Data;
        current = current.Next;
      }
    }
    // 必须实现此方法,因为
    // IEnumerable<T> 继承 IEnumerable
    IEnumerator IEnumerable.GetEnumerator()
    {
      return GetEnumerator();
    }
  }
  public class SortedList<T> : MyList<T> where T : IComparable<T>
  {
    // 一个未优化的简单排序算法,
    // 该算法从低到高对列表元素排序:
    public void BubbleSort()
    {
      if (null == head || null == head.Next)
        return;
      bool swapped;
      do
      {
        Node previous = null;
        Node current = head;
        swapped = false;
        while (current.next != null)
        {
          // 由于需要调用此方法,因此,SortedList
          // 类在 IEnumerable<T> 上是受约束的
          if (current.Data.CompareTo(current.next.Data) > 0)
          {
            Node tmp = current.next;
            current.next = current.next.next;
            tmp.next = current;
            if (previous == null)
            {
              head = tmp;
            }
            else
            {
              previous.next = tmp;
            }
            previous = tmp;
            swapped = true;
          }
          else
          {
            previous = current;
            current = current.next;
          }
        }// end while
      } while (swapped);
    }
  }
  // 一个将自身作为类型参数来实现 IComparable<T> 的简单类,
  // 是对象中的
  // 常用设计模式,这些对象
  // 存储在泛型列表中。
  public class Person : IComparable<Person>
  {
    string name;
    int age;
    public Person(string s, int i)
    {
      name = s;
      age = i;
    }
    // 这会使列表元素
    // 按 age 值排序。
    public int CompareTo(Person p)
    {
      return age - p.age;
    }
    public override string ToString()
    {
      return name + ":" + age;
    }
    // 必须实现 Equals。
    public bool Equals(Person p)
    {
      return (this.age == p.age);
    }
  }
  class Generics
  {
    static void Main(string[] args)
    {
      // 声明并实例化一个新的范型 SortedList 类。
      // Person 是类型参数。
      SortedList<Person> list = new SortedList<Person>();
      // 创建 name 和 age 值以初始化 Person 对象。
      string[] names = new string[] { "Franscoise", "Bill", "Li", "Sandra", "Gunnar", "Alok", "Hiroyuki", "Maria", "Alessandro", "Raul" };
      int[] ages = new int[] { 45, 19, 28, 23, 18, 9, 108, 72, 30, 35 };
      // 填充列表。
      for (int x = 0; x < names.Length; x++)
      {
        list.AddHead(new Person(names[x], ages[x]));
      }
      Console.WriteLine("Unsorted List:");
      // 打印出未排序的列表。
      foreach (Person p in list)
      {
        Console.WriteLine(p.ToString());
      }
      // 对列表进行排序。
      list.BubbleSort();
      Console.WriteLine(String.Format("{0}Sorted List:", Environment.NewLine));
      // 打印出排序的列表。
      foreach (Person p in list)
      {
        Console.WriteLine(p.ToString());
      }
      Console.WriteLine("Done");
    }
  }
}

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • C#实现利用泛型将DataSet转为Model的方法

    本文实例讲述了C#实现利用泛型将DataSet转为Model的方法.分享给大家供大家参考.具体如下: 因为网站需要用C#开发,习惯了java的泛型,所以看了一下C#下,也可以这样做,随便写了一个. public static List<T> PutAllVal<T>(T entity, DataSet ds) where T : new() { List<T> lists = new List<T>(); if (ds.Tables[0].Rows.Coun

  • C#通过反射创建自定义泛型

    本文以实例形式讲述了C#通过反射创建自定义泛型的实现方法,分享给大家供大家参考.具体如下: 比如有这样一个泛型:Demo.GenericsSimple<T,TT> 我想要通过反射创建一个Demo.GenericsSimple<string,int>的实例可以通过下面的格式进行创建: System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("命名空间.User`形参数量N[[1形参类型全名,形参类型所

  • C#泛型委托的用法实例分析

    本文实例讲述了C#泛型委托的用法.分享给大家供大家参考.具体分析如下: 冒泡排序大家都知道,例如一个整形数组,可以用冒泡排序来使它按从小到大的顺序排序, 但它仅限于了按整形数组来排序,如何做到按任意类型进行排序呢,例如按一个类的某个属性进行排序? 举例说明:定义一组以类MEmployee为元素的数组,按MEmployee的Salary属性进行排序,类似的可以引伸为对其他类型的比较 元素类定义: public class MEmployee { public string Name { get;

  • C#基础之泛型委托实例教程

    本文实例讲述了C#中泛型委托的用法,并以示例形式较为详细的进行了用法分析.分享给大家供大家参考之用.具体如下: 首先,泛型委托是委托的一种特殊形式,虽然感觉看上去比较怪异,其实在使用的时候跟委托差不多,不过泛型委托更具有类型通用性. 就拿C#里最常见的委托EventHandler打比方.在.NET 2.0以前,也就是泛型出现以前,普通的事件处理函数都由EventHandler定义,如下: public delegate void EventHandler(object sender, Event

  • 编写高质量代码改善C#程序——使用泛型集合代替非泛型集合(建议20)

    软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类.不管是数组还是集合类,它们都有各自的优缺点.如何使用好集合是我们在开发过程中必须掌握的技巧.不要小看这些技巧,一旦在开发中使用了错误的集合或针对集合的方法,应用程序将会背离你的预想而运行. 建议20:使用泛型集合代替非泛型集合 在建议1中我们知道,如果要让代码高效运行,应该尽量避免装箱和拆箱,以及尽量减少转型.很遗憾,在微软提供给我们的第一代集合类型中没有做到这一点,下面我们看ArrayList这个类的使用情况: Array

  • c# in depth的泛型实现实例代码

    1.默认值表达式如果已经明确了要处理的类型,也就知道了它的"默认"值.不知道要引用的类型,就不能直接指定默认值.不能使用null,因为它可能不是一个引用类型,不能使用0,因为它可能不是数值类型.虽然很少需要用到默认值,但它偶尔还是有用的.Dictionary<TKey,TValue>就是一个好的例子,它有个TryValue方法,它的作用有点儿像对数值类型进行处理的TryParse方法:他用一个输出参数来接收你打算获取的值,用一个Boolean返回值显示它是否成功.这意味着方

  • 详解C#中的泛型以及编程中使用泛型的优点

    2.0 版 C# 语言和公共语言运行时 (CLR) 中增加了泛型.泛型将类型参数的概念引入 .NET Framework,类型参数使得设计如下类和方法成为可能:这些类和方法将一个或多个类型的指定推迟到客户端代码声明并实例化该类或方法的时候.例如,通过使用泛型类型参数 T,您可以编写其他客户端代码能够使用的单个类,而不致引入运行时强制转换或装箱操作的成本或风险,如下所示: // Declare the generic class. public class GenericList<T> { vo

  • C#泛型编程介绍

    例子代码: 复制代码 代码如下: class Program    {        static void Main(string[] args)        {            int obj = 2;            Test<int> test = new Test<int>(obj);            Console.WriteLine("int:" + test.obj);            string obj2 = &qu

  • c#泛型学习详解 创建线性链表

    术语表 generics:泛型type-safe:类型安全collection: 集合compiler:编译器run time:程序运行时object: 对象.NET library:.Net类库value type: 值类型box: 装箱unbox: 拆箱implicity: 隐式explicity: 显式linked list: 线性链表node: 结点indexer: 索引器 泛型是什么? 很多人觉得泛型很难理解.我相信这是因为他们通常在了解泛型是用来解决什么问题之前,就被灌输了大量的理论

  • C#泛型用法实例分析

    本文实例分析了C#泛型用法.分享给大家供大家参考.具体分析如下: 这里演示如何创建具有单个类型参数的自定义泛型列表类,以及如何实现 IEnumerable<T> 以便对列表的内容启用 foreach 迭代.此示例还演示客户端代码如何通过指定类型参数来创建该类的实例,以及该类型参数的约束如何实现对类型参数执行其他操作. using System; using System.Collections; using System.Collections.Generic; using System.Te

  • Python iter()函数用法实例分析

    本文实例讲述了Python iter()函数用法.分享给大家供大家参考,具体如下: python中的迭代器用起来非常灵巧,不仅可以迭代序列,也可以迭代表现出序列行为的对象,例如字典的键.一个文件的行,等等. 迭代器就是有一个next()方法的对象,而不是通过索引来计数.当使用一个循环机制需要下一个项时,调用迭代器的next()方法,迭代完后引发一个StopIteration异常. 但是迭代器只能向后移动.不能回到开始.再次迭代只能创建另一个新的迭代对象. 反序迭代工具:reversed()将返回

  • Python callable()函数用法实例分析

    本文实例讲述了Python callable()函数用法.分享给大家供大家参考,具体如下: python中的内建函数callable( ) ,可以检查一个对象是否是可调用的 . 对于函数, 方法, lambda 函数式, 类, 以及实现了 _ _call_ _ 方法的类实例, 它都返回 True. >>> help(callable) Help on built-in function callable in module __builtin__: callable(...) calla

  • Python lambda函数基本用法实例分析

    本文实例讲述了Python lambda函数基本用法.分享给大家供大家参考,具体如下: 这里我们简单学习一下python lambda函数. 首先,看一下python lambda函数的语法,如下: f=lambda [parameter1,parameter2,--]:expression lambda语句中,冒号前是参数,可以有0个或多个,用逗号隔开,冒号右边是返回值.lambda语句构建的其实是一个函数对象. 1>无参数 f=lambda :'python lambda!' >>&

  • Tensorflow tf.tile()的用法实例分析

    tf.tile()应用于需要张量扩展的场景,具体说来就是: 如果现有一个形状如[width, height]的张量,需要得到一个基于原张量的,形状如[batch_size,width,height]的张量,其中每一个batch的内容都和原张量一模一样.tf.tile使用方法如: tile( input, multiples, name=None ) import tensorflow as tf a = tf.constant([7,19]) a1 = tf.tile(a,multiples=[

  • java队列之queue用法实例分析

    Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.LinkedList实现了Deque接 口. Queue的实现 1.没有实现的阻塞接口的LinkedList: 实现了java.util.Queue接口和java.util.AbstractQueue接口 内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue PriorityQueue 和 Concurren

  • php redis的scan用法实例分析

    在删除缓存的时候,我们在一些场景下需要批量删除,但不确定具体的key值,可通过匹配的方式进行查询后删除. 但是使用keys会导致redis服务器宕机.慎用... 一般公司也会禁用keys等比较敏感的命令的. 所以工作中会使用scan命令来进行匹配查询 SCAN cursor [MATCH pattern] [COUNT count] 比如 # 从游标 0 开始扫描 匹配 test1:* 的键值,一次扫描1000条 scan 0 match test1:* count 1000 1) 表示下一次扫

  • Symfony2开发之控制器用法实例分析

    本文实例分析了Symfony2开发之控制器用法.分享给大家供大家参考,具体如下: 控制器是PHP函数,通过它,你可以根据HTTP请求创建任务信息,并且构建和返回HTTP响应.响应可以是HTML页面.XML文档.序列化的JSON数组.图片.重定向.404错误甚至是你可以想到的一切.控制器中包含了你应用程序需要创建响应的抽象逻辑. 接收请求,返回响应的基本生命周期 1.每个请求都被单个前端控制器(如app.php或index.php)文件处理,前端控制器负责引导框架: 2.路由查看并匹配请求信息,并

  • Jackson的用法实例分析

    通俗的来说,Jackson是一个 Java 用来处理 JSON 格式数据的类库,其性能非常好.本文就来针对Jackson的用法做一个较为详细的实例分析.具体如下: 一.简介 Jackson具有比较高的序列化和反序列化效率,据测试,无论是哪种形式的转换,Jackson > Gson > Json-lib,而且Jackson的处理能力甚至高出Json-lib近10倍左右,且正确性也十分高.相比之下,Json-lib似乎已经停止更新,最新的版本也是基于JDK15,而Jackson的社区则较为活跃.

  • javascript中sort()的用法实例分析

    本文实例分析了javascript中sort()的用法.分享给大家供大家参考.具体分析如下: 函数的语法: arrayObject.sort(sortby) you think this is not the right way but you love it 这里还用到了split函数,目的是去到一个字符串的数组,比较常用.然后通过数组的排序函数sort()对数组内的值进行排序,得到新的数组,然后通过循环输出数组的内容就得到了排序后的字符串. 在例子中,默认情况下,它会按照ascii码来进行排

随机推荐