如何避免循环内数据丢失:C#区间拆分后结果数组全为空列表问题
问题根本原因
List<T>是引用类型,你在代码里全程只初始化了一个temporaryList对象,执行finalArray[i] = temporaryList;时,只是把这个对象的内存地址赋值给了数组的对应位置,并没有复制列表里的内容。后续执行temporaryList.Clear()的时候,清空的就是这个所有数组元素共同指向的列表对象,自然之前存入的内容就全部消失了。
修复方案
你可以选择任意一种修改方式:
方案1:每次循环新建独立的临时列表
把临时列表的初始化放到for循环内部,每次循环都生成新的List对象,避免共用同一个对象:
List<double>[] DivideInterval(List<double> myList, int numberOfBlocks, int[] switchingPoint) { List<double>[] finalArray = new List<double>[numberOfBlocks]; int j = 0; for (int i = 0; i < switchingPoint.Length; i++) { // 每次循环新建临时列表 var temporaryList = new List<double>(); for (int k = j; k <= switchingPoint[i]; k++) temporaryList.Add(myList[k]); finalArray[i] = temporaryList; Console.WriteLine("---"); foreach (var item in finalArray[i]) Console.WriteLine(item); Console.WriteLine("---"); j = switchingPoint[i] + 1; } // 后续打印、返回逻辑保持不变即可 return finalArray; }
方案2:赋值时复制列表内容
如果要保留临时列表在循环外初始化的写法,赋值的时候可以复制一份新的列表再存入数组:
// 把原来的 finalArray[i] = temporaryList; 替换为下面的代码 finalArray[i] = new List<double>(temporaryList);
这种写法会基于当前临时列表的内容生成一个全新的List对象,后续清空原临时列表不会影响已经存入数组的内容。
内容的提问来源于stack exchange,提问作者Josh.h
相关产品推荐
相关产品推荐

