如何用LINQ展平含竖线分隔字符串的List<List<string>>
如何用LINQ展平包含多值分隔字符串的List<List>?
你猜的完全没错,SelectMany就是实现这个需求的核心工具!我们的思路是对每个原始子列表,把带|分隔的科目和分数拆分成对应的独立项,再和固定的姓名、年龄重新组合成新的子列表,最后用SelectMany把所有这些新子列表合并成一个大集合。
先看完整的实现代码:
// 原始输入列表 var matchedList = new List<List<string>> { new List<string> { "Rob", "23", "Math", "98" }, new List<string> { "Jim", "25", "Science|Math|LA", "92|99|89" } }; // 展平处理 var flattenedList = matchedList .SelectMany(item => { // 拆分科目和分数字符串为数组 var subjects = item[2].Split('|'); var scores = item[3].Split('|'); // 可选:添加校验,确保科目和分数数量对应,避免后续出错 if (subjects.Length != scores.Length) throw new InvalidOperationException("科目与分数的数量不匹配,请检查输入数据"); // 将科目和分数一一配对,再与姓名、年龄组合成新的子列表 return subjects.Zip(scores, (subject, score) => new List<string> { item[0], item[1], subject, score }); }) .ToList();
代码拆解:
SelectMany:它的作用是将每个输入的子元素(这里就是原始列表里的每个List<string>)转换成一个序列,然后把所有这些序列拼接成一个单一的序列——这正是我们需要的“展平”效果。Split('|'):把包含多个值的字符串拆分成独立的字符串数组,比如把"Science|Math|LA"拆成["Science", "Math", "LA"]。Zip:这个方法会把两个数组按索引位置一一配对,比如把subjects的第n项和scores的第n项组合在一起,完美对应每个科目和它的分数。- 组合新列表:每一对科目+分数,都会和当前条目的姓名(
item[0])、年龄(item[1])组合成一个新的List<string>,最终所有这些新列表被SelectMany合并成目标集合。
运行这段代码后,flattenedList就是你想要的包含4个元素的列表集合啦。
内容的提问来源于stack exchange,提问作者bring_it_on
相关产品推荐
相关产品推荐

