由於List之間的相等的話,等於是把List的地址給賦值過去了,賦值后的List變化,會改變原有的List,並沒有起到備份原始數據的作用,對於沒有嵌套的List,可以采用遍歷重新賦值的方法去賦值(傳遞的是值類型,並非引用類型),若List內的數據是一個類的話,賦值的時候需要重新實例化才行。但如果是嵌套的List列表,遍歷這種方法就麻煩了很多。
因此,常見的對List進行復制克隆的方法,有以下三種:
方法一:
1
2
|
List<string> t = new List<string>(); //original
List<string> t2 = new List<string>(t.ToArray()); // copy of t
|
方法二(個人推薦):
1
2
3
4
5
6
|
It is a one liner using LINQ.
List<string> list1 = new List<string>();
List<string> list2 = new List<string>();
// This will copy all the items from list 1 to list 2
list1.ForEach(i => list2.Add(i));
|
方法三:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
using System;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
namespace Delegates
{
class X
{
public int Id { get; set; }
public string Name { get; set; }
}
class Y
{
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<X> x = new List<X>();
for (int i = 0; i < 100; i++)
x.Add(new X { Id = i, Name = string.Format("x_{0}", i.ToString()) });
// copy x to y
List<Y> y = new List<Y>(x.ConvertAll<Y>(e => { return new Y { Id = e.Id, Name = e.Name }; }));
Debug.Assert(x.Count == y.Count);
}
}
}
|
可以通過在VS2013的即時窗口中,輸入&+變量名稱來查看變量的地址,通過查看兩個變量的地址是否一致來驗證方法的正確性。