迭代对象初始化程序中的列表

时间:2011-07-20 17:41:03

标签: c#

使用对象初始化器语法构建对象时,有没有办法迭代其中一个赋值语句中的列表并将迭代的输出分配给该属性?

例如,我有一个Person模型,我将其转换为Person视图模型(主要是因为Person模型具有延迟加载的属性,并且具有高度且可能递归动态,但视图在Web上断开连接需要单个Person实例进行序列化。我也在使用nVentive Umbrella扩展,以便在枚举上使用.ForEach()等方便的东西。因此,要从我的Person模型输出Person视图模型列表,我将它们转换为:

people.ForEach(p =>
  returnPeople.Add(
    new Person{
      FirstName = p.FirstName,
      ID = p.ID,
      LastName = p.LastName,
      MiddleName = p.MiddleName,
      NamePrefix = p.NamePrefix,
      NameSuffix = p.NameSuffix,
      ParentsID = p.Parents == null ? 0 : p.Parents.ID,
      PartnershipIDs = new List<int>(),
      Sex = p.Sex.ToString()
    }
  )
);

我正在迭代Person模型的集合(people)并填充Person视图模型的集合(returnPeople)。一切正常,但我也希望在同一语句中填充PartnershipIDs属性。功能如:

//....
PartnershipIDs = p.Partnerships.ForEach(par => yield return par.ID)
//....

然而,这不起作用。编译器不喜欢语法。但有没有办法在此设置中实现该功能?或者我是否必须首先使用除一个字段之外的所有字段初始化Person视图模型,然后在下一行填充剩余字段?

2 个答案:

答案 0 :(得分:5)

您需要一个简单的投影:

PartnershipIDs = p.Partnerships.Select(par => par.ID).ToList()

答案 1 :(得分:1)

或许不是ForEach,而是Select

PartnershipIDs = p.Partnerships.Select(par => par.ID).ToList();