C#泛型用法实例分析
作者:pythoner 发布时间:2021-10-16 14:01:49
标签: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#程序设计有所帮助。


猜你喜欢
- 气球状提示框的介绍和系统通知变化NotifyIcon控件表示系统右下角任务栏上的托盘图标,其ShowBalloonTip方法用于显示任务栏中
- 背景项目中要实现横向列表的无限循环滚动,自然而然想到了RecyclerView,但我们常用的RecyclerView是不支持无限循环滚动的,
- ELK环境安装ELK是指Elasticsearch、Kibana、Logstash这三种服务搭建的日志收集系统,具体搭建方式可以参考《Spr
- 一、实验目的1. 掌握各种高级UI控件的基本使用;2. 能够实现Tab切换效果。二、实验任务1. 根据原型图设计界面;2. 实现Tab切换;
- 本文实例讲述了Android简单创建一个Activity的方法。分享给大家供大家参考,具体如下:1) 创建一个android项目填写项目信息
- 本文实例为大家分享了C语言实现超市计价收款系统的具体代码,供大家参考,具体内容如下学习一个月的C语言,写了一个简易的超市计价收款系统源码如下
- 这篇文章主要介绍了RabbitMQ延迟队列及消息延迟推送实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 废话不多说,直接奉上代码:Frame.javapackage snake;import java.awt.Graphics;import j
- 前言平时我们都有用到LeakCanary来分析内存泄露的情况,这里可以来看看LeakCanary是如何实现的,它的内部又有哪些比较有意思的操
- 在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源。但是,GC有的时并不
- SharedPreferences是Android中存储简单数据的一个工具类。可以想象它是一个小小的Cookie,它通过用键值对的方式把简单
- 一、需求触发场景:项目中需要开发带有EditText的Dialog显示,要求在编辑完EditText时,点击Dilog的空白处隐藏软键盘。但
- 本文实例为大家分享了Android实现页面短信验证功能的具体代码,供大家参考,具体内容如下目标效果:上一篇博文介绍的是使用SDK中自带的验证
- 问题描述:String preStr = "a.b.c"; // 这里要把该字符串按小圆点进行分割,成"a&q
- 本文实例为大家分享了Java实现宠物商店管理的具体代码,供大家参考,具体内容如下第一种实现方式:抽象类和对象数组public abstrac
- 在Word文档中,超链接是指在特定文本或者图片中插入的能跳转到其他位置或网页的链接,它也是我们在编辑制作Word文档时广泛使用到的功能之一。
- 介绍在本文中,我们将了解如何将现有应用程序迁移到Spring 6以及如何充分利用此升级。本文中的提示基于我在Hypersistence Op
- 这是主要使用到的jar 文件是:spring mvc +apache common-fileuplad第一步:web.xml 文件。【重点是
- 最近客户更新系统发现,以前的项目在调用相机的时候,闪退掉了,很奇怪,后来查阅后发现,Android 6.0以后需要程序授权相机权限,默认会给
- 该说不唠,直接上代码。可直接复制使用package com.yuezhi.util;import java.math.BigDecimal;