C#泛型用法實例剖析。本站提示廣大學習愛好者:(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#法式設計有所贊助。