众所周知,C#的列表List与List之间有两种赋值方法,一个是引用,即复制原List的地址;一个是复制值,即复制原List中的值。
///
方法1:引用
///
List<string> listA = {"a","b","c"};
List<string> listB = new();
listB = listA
//此时输出listB = a b c
listA.Add("d")
//此时输出listB = a b c d
listB.Add("e")
//此时输出listA = a b c d e
///
方法2:复制值
///
List<string> listA = {"a","b","c"};
List<string> listB = new();
foreach(string str in listA)
{
listB.Add(str)
}
//此时输出listB = a b c
listA.Add("d")
//此时输出listB = a b c
使用方法1会导致调用方法将List列表作为参数传入后,导致传入的List值发生改变,造成像我有一个朋友一样查半天代码才发现这个问题的窘境。
多层List嵌套的列表则需要从最小列表(数组进行取值复制)
private List<List<string[]>> copyList(List<List<string[]>> list) //List复制值方法而不是复制地址
{
List<List<string[]>> reslist = new();
foreach (List<string[]> strlist in list) //往下钻一层
{
List<string[]> lstr = new List<string[]>();
foreach (string[] strarr in strlist) //再往下钻一层
{
List<string> sar = new List<string>();
foreach (string tempstr in strarr) //钻到基本类型为止
{
string str = tempstr;
sar.Add(str); //往上复制
}
lstr.Add(sar.ToArray()); //再往上复制
}
reslist.Add(lstr); //复制到还原List结构为止
}
return reslist;
}
虽然说这个问题是有办法可以解决的,但在数据结构设计时还是应该避免使用这样的嵌套List,可以尝试使用类、结构、字典等多种形式来储存数据。