C#中基于两个List生成含指定间隔0的新List问题求助
问题描述
现有两个List:
- List1 = [1,2,3,4]
- List2 = [1,4,1,3]
需要生成新List3 = [1,0,2,0,0,0,0,3,0,4,0,0,0],规则是在List1的每个元素之后,插入对应List2中同索引元素数量的0。
现有代码如下:
List<int> idID = new List<int>(); idID.Add(1); idID.Add(2); idID.Add(3); idID.Add(4); List<int> Nevent = new List<int>(); Nevent.Add(1); Nevent.Add(4); Nevent.Add(1); Nevent.Add(3); int total = Nevent.Count; for (int j = 0; j < total; j++) { for (int i = 1; i <= Nevent[j]; i++) { idID.Insert(i, 0); //modify (____,0) of this line??? } } string IDS = String.Join(",", idID); Console.WriteLine(IDS);
提问者认为需要修改idID.Insert(i, 0)中的索引参数,换成动态计算的序列,但不知如何实现,询问修改方法或更优实现方式。
解决方案
一、修改现有代码的方法
核心是维护一个动态的插入位置变量,因为原List在插入元素后长度会变化,固定索引会导致插入位置错误。代码调整如下:
List<int> idID = new List<int> {1,2,3,4}; List<int> Nevent = new List<int> {1,4,1,3}; int currentPos = 1; // 初始指向第一个元素之后的位置 for (int j = 0; j < Nevent.Count; j++) { // 插入对应数量的0 for (int i = 0; i < Nevent[j]; i++) { idID.Insert(currentPos, 0); currentPos++; // 插入后下一个0的位置后移一位 } currentPos++; // 跳到下一个原元素的后方 } string IDS = String.Join(",", idID); Console.WriteLine(IDS); // 输出:1,0,2,0,0,0,0,3,0,4,0,0,0
逻辑说明
currentPos初始为1,对应List1第一个元素(1)之后的索引位置- 每插入一个0,
currentPos加1,适配List长度变化后的新位置 - 完成当前元素的0插入后,
currentPos再加1,定位到下一个原List元素的后方
二、更优实现方式(避免频繁Insert操作)
List的Insert操作是O(n)复杂度,数据量大时效率较低。可以预先计算最终List的总长度,直接批量填充元素,减少性能开销:
List<int> idID = new List<int> {1,2,3,4}; List<int> Nevent = new List<int> {1,4,1,3}; // 预计算总长度:原List长度 + 所有Nevent元素的和 int totalLength = idID.Count + Nevent.Sum(); List<int> result = new List<int>(totalLength); for (int j = 0; j < idID.Count; j++) { // 添加原List元素 result.Add(idID[j]); // 添加对应数量的0 result.AddRange(Enumerable.Repeat(0, Nevent[j])); } string IDS = String.Join(",", result); Console.WriteLine(IDS); // 输出:1,0,2,0,0,0,0,3,0,4,0,0,0
逻辑说明
- 初始化结果List时指定容量,避免动态扩容的额外开销
- 用
AddRange配合Enumerable.Repeat批量添加0,比循环Insert效率更高 - 遍历一次原List即可完成所有元素的填充,逻辑更简洁
内容的提问来源于stack exchange,提问作者JMLC
相关产品推荐
相关产品推荐

