【问题标题】:Iterating a List in an Object Initializer在对象初始化器中迭代列表
【发布时间】:2011-07-20 17:41:03
【问题描述】:

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

例如,我有一个 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 视图模型,然后在下一行填充剩余字段?

【问题讨论】:

  • 一个好的旧正确foreach 循环有什么问题?

标签: c#


【解决方案1】:

你需要一个简单的投影:

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

【讨论】:

  • 足够简单(我真的应该想到这一点......),谢谢!
【解决方案2】:

也许你不做ForEach,而是做一个Select

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2013-08-01
    • 2021-12-31
    • 1970-01-01
    • 2013-06-27
    • 2012-10-14
    相关资源
    最近更新 更多