由于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的即时窗口中,输入&+变量名称来查看变量的地址,通过查看两个变量的地址是否一致来验证方法的正确性。