【问题标题】:How to LINQ.FOREACH to access parent如何通过 LINQ.FOREACH 访问父级
【发布时间】:2011-01-14 19:27:51
【问题描述】:

包裹是一个列表

每个 Parcel 都有 Owners 属性,其中包含 List

parcels.Where(p => !p.Owners.IsNullOrEmpty()).SelectMany(p => p.Owners)
                    .OrderByDescending(x => x.RecordingDate ?? x.SaleDate ?? x.DateEntered)
                    .ForEach(owner =>
                    { 
                    /* HERE I need to access to p which was a parent of this Owner */
                    }

不知道如何重写...

【问题讨论】:

  • ...我假设 Owner 碰巧没有 Parent 属性?
  • 等等,你的意思是你需要访问这个所有者的 child 的 p 吗?您已经在查询的第一部分访问了父母,那么如果在层次结构中还有更多父母,为什么会有不同呢?
  • Owner 没有 Parent 属性...我确实可以灵活地添加它,所以我可能会这样做。 (p 不是所有者的孩子,p 是原始父母...)
  • 如果集合parcels.Owners 中类型的对象有父对象,但没有对它们的引用,则无法完成。你需要一个参考。 [至少它不能以任何有用的方式完成 - 你可以遍历 owner.parents 的整个集合,并将其子项与你从查询中得到的内容进行比较]
  • 我开始做类似... .SelectMany(p => p.Owners.Select( c => new { Owner = p.Owners, p.PropertyICareAbout }));看起来非常复杂,可能效率极低。我应该澄清一下,我现在只需要父母的一个财产......

标签: c# linq foreach


【解决方案1】:

创建一个匿名对进行迭代。

 foreach(var pair in parcels
    .Where(p => p.Owners != null)
    .SelectMany(p => new { o = p.Owners, p })
    .OrderByDescending(x => x.o.RecordingDate ?? x.o.SaleDate ?? x.o.DateEntered)) {

    var owner = pair.o;
    var parcel = pair.p;

    // do stuff
 }
 // alternate syntax
 foreach(var pair in from p in parcels
                     where p.Owners != null
                     from o in p.Owners
                     orderby o.RecordingDate ?? o.SaleDate ?? o.DateEntered descending
                     select new { o, p }) {
     var owner  = pair.o;
     var parcel = pair.p;
     // do stuff
 }

【讨论】:

    【解决方案2】:

    您需要将包裹添加到SelectMany返回的项目中:

    parcels
            .Where(p => !p.Owners.IsNullOrEmpty())
            .SelectMany(p => p.Owners.Select(o => new { Parcel = p, Owner = o }))
            .OrderByDescending(x => x.Owner.RecordingDate ?? x.Owner.SaleDate ?? x.Owner.DateEntered)
            .ForEach(item =>
            {
                Parcel p = item.Parcel;
                Owner o = item.Owner;
                ...
            }
    

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2021-08-29
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多