C#泛型用法实例分析

 更新时间:2015年06月28日 09:46:47   作者:pythoner  
这篇文章主要介绍了C#泛型用法,实例分析了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#程序设计有所帮助。

相关文章

  • Unity编辑器资源导入处理函数OnPostprocessTexture实例深入解析

    Unity编辑器资源导入处理函数OnPostprocessTexture实例深入解析

    这篇文章主要为大家介绍了Unity编辑器资源导入处理函数OnPostprocessTexture实例深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • C#使用GDI绘制直线的方法

    C#使用GDI绘制直线的方法

    这篇文章主要介绍了C#使用GDI绘制直线的方法,涉及C#中使用GDI绘图的相关技巧,需要的朋友可以参考下
    2015-04-04
  • C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制

    C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制

    这篇文章主要介绍了C#中GDI+绘制圆弧及圆角矩形等比缩放的绘制,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • winform实现创建最前端窗体的方法

    winform实现创建最前端窗体的方法

    这篇文章主要介绍了winform实现创建最前端窗体的方法,涉及C#窗体属性设置的相关技巧,非常具有实用价值,需要的朋友可以参考下
    2015-08-08
  • WinForm中BackgroundWorker控件用法简单实例

    WinForm中BackgroundWorker控件用法简单实例

    这篇文章主要介绍了WinForm中BackgroundWorker控件用法,以一个简单实例形式分析了BackgroundWorker控件的定义、设置及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#使用NPOI读取excel转为DataSet

    C#使用NPOI读取excel转为DataSet

    这篇文章主要为大家详细介绍了C#使用NPOI读取excel转为DataSet,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#将数字转换成字节数组的方法

    C#将数字转换成字节数组的方法

    这篇文章主要介绍了C#将数字转换成字节数组的方法,涉及C#字符串操作的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#实现操作PPT动画窗格并插入音频文件

    C#实现操作PPT动画窗格并插入音频文件

    这篇文章主要为大家详细介绍了如何利用C#实现操作PPT动画窗格并插入音频文件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • winfrom 打印表格 字符串的封装实现代码 附源码下载

    winfrom 打印表格 字符串的封装实现代码 附源码下载

    以前写打印都是根据打印机的型号,找开发类库。然后在此基础上开发。写的多了自然就想到了封装。这是还是想到了微软,微软封装了PrintDocument的打印类。但这只是在低层对串口的封装
    2013-02-02
  • C#中的尾递归与Continuation详解

    C#中的尾递归与Continuation详解

    这篇文章主要介绍了C#中的尾递归与Continuation详解,本文讲解了递归与尾递归、尾递归与Continuation、Continuation的改进等内容,需要的朋友可以参考下
    2015-06-06

最新评论