非泛型版Queue和Stack類中存在Clone方法是因為只有它實現了Icolneable接口。但非泛型版Queue和Stack類實現的其他接口是一樣的。
一個彌補泛型版Queue和Stack類中不存在Clone方法的途徑是接收一個IEnumerable<T>類型。因為這是Queue和Stack類實現的接口之一,對於Queue對象來說,這非常容易實現,代碼如下:
public static void CloneQueue()
{
// 創建一個Queue對象.
Queue<int> numericQueue = new Queue<int>();
// 進隊
numericQueue.Enqueue(1);
numericQueue.Enqueue(2);
numericQueue.Enqueue(3);
// 創建一個克隆的numericQueue.
Queue<int> clonedNumericQueue = new Queue<int>(numericQueue);
// 這只是簡單地看一下裡面的值,並非出隊
foreach (int i in clonedNumericQueue)
{
Console.WriteLine("foreach: " + i.ToString());
}
// 出隊並顯示項目
Console.WriteLine(clonedNumericQueue.Dequeue().ToString());
Console.WriteLine(clonedNumericQueue.Dequeue().ToString());
Console.WriteLine(clonedNumericQueue.Dequeue().ToString());
}
方法的輸出結果如下:
foreach: 1
foreach: 2
foreach: 3
1
2
3
對於Stack對象,其代碼如下:
public static void CloneStack()
{
// 創建一個泛型Stack對象
Stack<int> numericStack = new Stack<int>();
// 進棧
numericStack.Push(1);
numericStack.Push(2);
numericStack.Push(3);
// 克隆numericStack 對象.
Stack<int> clonedNumericStack = new Stack<int>(numericStack);
// 這只是簡單地看一下裡面的值,並非出棧
foreach (int i in clonedNumericStack)
{
Console.WriteLine("foreach: " + i.ToString());
}
// 出棧並顯示項目
Console.WriteLine(clonedNumericStack.Pop().ToString());
Console.WriteLine(clonedNumericStack.Pop().ToString());
Console.WriteLine(clonedNumericStack.Pop().ToString());
}
方法的輸出結果如下:
foreach: 1
foreach: 2
foreach: 3
1
2
3
構造方法創建了一個新的Queue或Stack實例,並包含了IEnumerable<T>類型中所有元素的一份拷貝。