C# 不改变原List值,List与List之间多层嵌套复制值

众所周知,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,可以尝试使用类、结构、字典等多种形式来储存数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值