C#运行时按相同值拆分未知内容单列表为多列表的实现方法
C#动态拆分列表的实现方案
核心思路:不要预先声明list1、list2这类固定名称的变量,用外层集合动态容纳所有生成的子列表,完全不需要提前知道原列表的元素数量、不同值的种类数。
场景1:所有相同值的元素归为同一组(不管出现位置)
如果你的需求是把原列表里所有数值相同的元素都分到同一个子列表(哪怕它们在原列表里是分散出现的),直接用LINQ的GroupBy即可实现,代码非常简洁:
// 假设原列表是 double 类型,也可以换成其他值类型/引用类型 List<double> original = new List<double> { /* 你的运行时动态生成的原列表 */ }; // 动态生成分组后的子列表集合,类型为 List<List<double>> var groupedSubLists = original .GroupBy(item => item) // 按元素的值分组 .Select(g => g.ToList()) // 每个分组转成独立的子列表 .ToList();
之后可以直接遍历外层集合拿到所有子列表:
// 遍历所有子列表做处理 foreach (var subList in groupedSubLists) { // 比如打印当前子列表内容 Console.WriteLine("--- 子列表开始 ---"); subList.ForEach(Console.WriteLine); Console.WriteLine("--- 子列表结束 ---"); }
也可以通过索引访问指定子列表:groupedSubLists[0]就是第一个分组的子列表,不需要提前知道总共有多少个分组。
场景2:仅连续出现的相同值归为同一组
如果你的需求和举例完全一致:只有连续出现的相同值才归为一组,分散出现的相同值要分到不同的子列表(比如原列表里前两个连续的1199.17是一个子列表,后面单独出现的那个1199.17是另一个独立子列表),需要用连续遍历的逻辑实现:
List<double> groupedSubLists = new List<List<double>>(); if (original.Count == 0) return groupedSubLists; // 兼容空原列表的情况 // 初始化第一个子列表 double currentGroupValue = original[0]; List<double> currentSubList = new List<double> { currentGroupValue }; for (int i = 1; i < original.Count; i++) { // 浮点数建议用差值容忍度比较,避免精度误差,可按需调整阈值 if (Math.Abs(original[i] - currentGroupValue) < 0.0001) { currentSubList.Add(original[i]); } else { // 值发生变化,保存当前子列表,开启新的子列表 groupedSubLists.Add(currentSubList); currentGroupValue = original[i]; currentSubList = new List<double> { currentGroupValue }; } } // 循环结束后不要漏掉最后一个子列表 groupedSubLists.Add(currentSubList);
这个逻辑生成的子列表完全符合你举例的拆分规则,同样不需要提前知道分组数量。
内容的提问来源于stack exchange,提问作者Breakwin
相关产品推荐
相关产品推荐

