C#泛型用法实例分析

作者:pythoner 时间:2021-10-16 14:01:49 

本文实例分析了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#程序设计有所帮助。

标签:C#,泛型
0
投稿

猜你喜欢

  • Spring如何在一个事务中开启另一个事务

    2021-08-30 17:29:15
  • IDEA解决src和resource下创建多级目录的操作

    2023-03-24 07:05:37
  • Android开发实现的计时器功能示例

    2023-09-04 07:33:33
  • Android中Snackbar的使用方法及小技巧

    2023-10-30 03:13:31
  • IDEA2022创建Maven Web项目教程(图文)

    2022-09-25 02:30:44
  • JAVA像SQL一样对List对象集合进行排序

    2023-11-01 12:36:24
  • java中Unsafe的使用讲解

    2022-08-02 08:08:18
  • 如何在Springboot实现拦截器功能

    2023-01-10 01:11:38
  • Java协议字节操作工具类详情

    2023-11-02 06:25:02
  • Java多线程Thread类的使用详解

    2023-11-11 13:08:11
  • android实现扑克卡片翻转

    2021-10-19 08:08:35
  • Activiti流程图查看实例

    2022-09-10 17:51:44
  • Spring Boot集成MyBatis的方法

    2021-11-03 23:11:05
  • hashCode方法的使用讲解

    2022-11-12 15:29:37
  • SpringBoot整合ShardingSphere的示例代码

    2022-08-17 22:52:28
  • Spring启动时实现初始化有哪些方式?

    2023-09-20 18:25:57
  • java字符串抉择

    2023-08-08 14:20:05
  • springboot如何统一设置时区

    2022-01-26 18:16:39
  • SpringCloud微服务架构升级汇总

    2022-05-04 06:09:19
  • Java WebService 简单实例(附实例代码)

    2023-01-25 07:52:18
  • asp之家 软件编程 m.aspxhome.com