C#中嵌套foreach循环取值实现遇到问题求助
问题分析与解决方案
你的问题核心在于C#的对象初始化器内部不能直接嵌入foreach循环——这种语法只允许直接给属性赋值,没法在里面写循环这类执行语句。另外原代码还漏掉了返回结果列表的语句,这也会导致编译错误。
修正后的基础版代码
先单独处理委托人生成对应的集合,再把集合赋值给Opportunity的DelegateList属性:
private List<Opportunity> CreateOpportunities(Basket basket) { var opps = new List<Opportunity>(); foreach (var orderLine in basket.OrderLines) { // 先遍历orderLine里的委托信息,转换成目标实体类列表 var delegateItems = new List<Delegate>(); // 这里假设Delegate是你的实体类 foreach (var delegateInfo in orderLine.DelegatesList) { delegateItems.Add(new Delegate { FirstName = delegateInfo.FirstName, LastName = delegateInfo.LastName, Email = delegateInfo.Email // 补充其他需要映射的属性 }); } // 初始化Opportunity并添加到结果列表 opps.Add(new Opportunity { DelegateList = delegateItems // 补充Opportunity的其他必填属性 }); } // 不要忘记返回构建好的列表! return opps; }
简化版(用LINQ)
如果你的项目允许使用LINQ,可以把代码简化得更简洁:
private List<Opportunity> CreateOpportunities(Basket basket) { return basket.OrderLines.Select(orderLine => new Opportunity { DelegateList = orderLine.DelegatesList.Select(delegateInfo => new Delegate { FirstName = delegateInfo.FirstName, LastName = delegateInfo.LastName, Email = delegateInfo.Email }).ToList() // 补充Opportunity的其他属性 }).ToList(); }
特殊情况:如果DelegateList是自定义容器类
如果DelegateList的类型不是List<Delegate>,而是一个自定义的容器类(比如内部包含集合属性),比如你的Delegates类定义是这样的:
public class Delegates { public List<Delegate> Items { get; set; } }
那对应的代码要调整为:
private List<Opportunity> CreateOpportunities(Basket basket) { var opps = new List<Opportunity>(); foreach (var orderLine in basket.OrderLines) { var delegateItems = orderLine.DelegatesList.Select(d => new Delegate { FirstName = d.FirstName, LastName = d.LastName, Email = d.Email }).ToList(); opps.Add(new Opportunity { DelegateList = new Delegates { Items = delegateItems } }); } return opps; }
关键注意点
- 对象初始化器(
new X { ... })仅用于属性赋值,不能包含循环、条件判断这类执行逻辑; - 务必确保返回最终构建好的
opps列表,原代码缺少return语句; - 要保证
DelegateList的类型和你赋值的集合类型匹配,避免类型转换错误。
内容的提问来源于stack exchange,提问作者Paul Almond
相关产品推荐
相关产品推荐

