如何在C#中从列表的列表中同时迭代获取元素
遍历拆分后的列表列表以获取所有元素的解决方案
场景说明
你已经将包含5000个文件路径的List<string>拆分为5个子列表,现在需要高效遍历这些子列表的元素进行后续处理,避免多层嵌套foreach的冗余写法。
方案1:扁平化所有元素(不区分子列表)
如果不需要区分元素来自哪个子列表,只想一次性遍历所有文件路径,直接用SelectMany将嵌套列表扁平化为单个序列:
// 将所有子列表的元素合并为一个 IEnumerable<string> var allFilePaths = list.SelectMany(subList => subList); // 遍历所有元素 foreach (string filePath in allFilePaths) { // 这里写你的处理逻辑 Console.WriteLine(filePath); }
方案2:按索引同步遍历各子列表元素
如果需要同时获取每个子列表对应位置的元素(比如取第1个子列表的第i个、第2个子列表的第i个……),由于你的拆分逻辑保证了所有子列表长度一致,可以通过索引循环实现:
// 假设所有子列表长度相同(你的Split方法已保证) int elementCount = list[0].Count; for (int i = 0; i < elementCount; i++) { string fileFromList1 = list[0][i]; string fileFromList2 = list[1][i]; string fileFromList3 = list[2][i]; string fileFromList4 = list[3][i]; string fileFromList5 = list[4][i]; // 处理这一组对应位置的元素 Console.WriteLine($"First name is: {fileFromList1}"); Console.WriteLine($"Second name is: {fileFromList2}"); Console.WriteLine($"Third name is: {fileFromList3}"); Console.WriteLine($"Fourth name is: {fileFromList4}"); Console.WriteLine($"Fifth name is: {fileFromList5}"); }
方案3:获取所有元素的笛卡尔积(慎用)
如果需要生成所有子列表元素的组合(比如每个子列表取一个元素的所有可能搭配),可以用LINQ实现笛卡尔积,但注意5个各含1000元素的子列表会生成10^15种组合,仅在小规模场景下使用:
var cartesianProduct = from f1 in list[0] from f2 in list[1] from f3 in list[2] from f4 in list[3] from f5 in list[4] select new { f1, f2, f3, f4, f5 }; foreach (var combo in cartesianProduct) { Console.WriteLine($"组合:{combo.f1}, {combo.f2}, {combo.f3}, {combo.f4}, {combo.f5}"); }
关于你原有代码的说明
你提供的嵌套foreach加break的写法,实际上只获取了每个子列表的第一个元素就终止了循环,并没有遍历所有元素,上述方案可以根据你的实际需求选择使用。
内容的提问来源于stack exchange,提问作者linasster
相关产品推荐
相关产品推荐

