如何在C#中将多个列表的对应元素合并为单个对象?
解决方案:按索引对齐合并多列表
你原来用嵌套foreach的问题在于,它会生成三个列表的笛卡尔积(也就是所有元素的可能组合),比如[1,A,!]、[1,A,?]、[1,A,-]、[1,B,!]……这显然不是你要的按位置配对的结果。
正确的思路是:先找到三个列表中最长的那个的长度,然后按索引从0开始循环,每个位置上分别从三个列表中取对应索引的元素,没有元素的位置用NULL填充,最后把每个位置的三个元素组成一行存入结果集合。
C# 代码示例
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // 定义你的三个列表 var listA = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var listB = new List<string> { "A", "B", "C", "D" }; var listC = new List<string> { "!", "?", "-" }; // 找到最长列表的长度 int maxLength = new[] { listA.Count, listB.Count, listC.Count }.Max(); // 存储最终结果的集合(这里用List<List<object>>,也可以根据需求换成List<string>) var result = new List<List<object>>(); for (int i = 0; i < maxLength; i++) { // 从每个列表取对应索引的元素,没有则用"NULL"填充 var itemA = i < listA.Count ? (object)listA[i] : "NULL"; var itemB = i < listB.Count ? listB[i] : "NULL"; var itemC = i < listC.Count ? listC[i] : "NULL"; // 组成一行 var line = new List<object> { itemA, itemB, itemC }; result.Add(line); // 输出验证(可选) Console.WriteLine($"line = [{string.Join(",", line)}]"); } // 现在result里就存着所有合并后的行啦 } }
代码说明
- 确定最大长度:用
Max()方法获取三个列表长度的最大值,确保循环能覆盖所有列表的元素。 - 按索引取值:循环每个索引
i,判断i是否小于当前列表的长度,是的话取对应元素,否则用"NULL"填充。 - 存储结果:把每个索引对应的三个元素组成一个列表,加入到结果集合中,这样你就得到了一个包含所有合并行的单个对象。
如果需要直接生成字符串形式的行(比如"[1,A,!]"),可以把line换成字符串拼接:
string lineString = $"[{itemA},{itemB},{itemC}]"; resultStrings.Add(lineString); // 这里resultStrings是List<string>类型
内容的提问来源于stack exchange,提问作者Hakunama Tatarov
相关产品推荐
相关产品推荐

