是否有LINQ方法可按数量将2个LineItem条目扩展为N个?
解决方案
你要的简洁LINQ写法可以用SelectMany搭配Enumerable.Repeat实现,一行代码就能完成原来的循环逻辑:
var bag = list.SelectMany(item => Enumerable.Repeat(item, item.Quantity)).ToList();
逻辑说明
Enumerable.Repeat(item, item.Quantity)会针对每个条目生成一个包含Quantity个相同条目对象的序列SelectMany会把所有条目生成的序列摊平,合并成一个单一的LineItem集合- 不需要单独判断
Quantity == 1的情况,Repeat次数为1时会天然只返回一个元素,完全兼容原有逻辑
完整测试代码示例
var list = new List<LineItem>{ new LineItem { Info = "two of these", Quantity = 2 }, new LineItem { Info = "one of these", Quantity = 1 } }; // 原始打印 foreach( var entry in list) Console.WriteLine(entry); Console.WriteLine("now I want three lines printed as for the shopping bag"); // LINQ实现展开 var bag = list.SelectMany(item => Enumerable.Repeat(item, item.Quantity)).ToList(); // 打印展开后的结果 foreach( var entry in bag) Console.WriteLine(entry);
运行后输出和你原有代码完全一致。
注意:如果后续需要修改展开后的单个条目属性,避免所有重复条目一起变动,需要在生成序列时新建
LineItem对象,写法调整如下:var bag = list.SelectMany(item => Enumerable.Range(1, item.Quantity) .Select(_ => new LineItem { Info = item.Info, Quantity = item.Quantity })) .ToList();
内容的提问来源于stack exchange,提问作者kenny
相关产品推荐
相关产品推荐

