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#,泛型
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Spring如何在一个事务中开启另一个事务
2021-08-30 17:29:15
IDEA解决src和resource下创建多级目录的操作
2023-03-24 07:05:37
![](https://img.aspxhome.com/file/2023/0/63690_0s.jpg)
Android开发实现的计时器功能示例
2023-09-04 07:33:33
![](https://img.aspxhome.com/file/2023/0/98660_0s.gif)
Android中Snackbar的使用方法及小技巧
2023-10-30 03:13:31
![](https://img.aspxhome.com/file/2023/8/103888_0s.gif)
IDEA2022创建Maven Web项目教程(图文)
2022-09-25 02:30:44
![](https://img.aspxhome.com/file/2023/9/108179_0s.jpg)
JAVA像SQL一样对List对象集合进行排序
2023-11-01 12:36:24
![](https://img.aspxhome.com/file/2023/8/71258_0s.jpg)
java中Unsafe的使用讲解
2022-08-02 08:08:18
如何在Springboot实现拦截器功能
2023-01-10 01:11:38
![](https://img.aspxhome.com/file/2023/1/86831_0s.png)
Java协议字节操作工具类详情
2023-11-02 06:25:02
Java多线程Thread类的使用详解
2023-11-11 13:08:11
![](https://img.aspxhome.com/file/2023/3/59013_0s.png)
android实现扑克卡片翻转
2021-10-19 08:08:35
Activiti流程图查看实例
2022-09-10 17:51:44
Spring Boot集成MyBatis的方法
2021-11-03 23:11:05
![](https://img.aspxhome.com/file/2023/6/64486_0s.png)
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
![](https://img.aspxhome.com/file/2023/7/58077_0s.png)
springboot如何统一设置时区
2022-01-26 18:16:39
![](https://img.aspxhome.com/file/2023/9/63659_0s.png)
SpringCloud微服务架构升级汇总
2022-05-04 06:09:19
![](https://img.aspxhome.com/file/2023/6/88556_0s.png)
Java WebService 简单实例(附实例代码)
2023-01-25 07:52:18
![](https://img.aspxhome.com/file/2023/8/64528_0s.png)