【问题标题】:Filter IEnumerable筛选 IEnumerable
【发布时间】:2012-11-21 22:40:46
【问题描述】:

我有 3 个具有以下属性的类:

OfferList 类:

Guid Id
IEnumerable<Offer> Offers

优惠等级:

Guid Id
Product Product
bool IsSealed

产品类别:

Guid Id

一个 OfferList 包含多个 Offer,一个 Offer 有确切的 1 个产品。

如何过滤 OfferList 以仅包含未密封的 Offer?

OfferList offerList = this.GetOfferList(id).Offers.Where(o => !o.IsSealed));

这将返回一个 Offer 类型的 IEnumerable,而不是过滤 OfferList。

【问题讨论】:

    标签: c# filtering


    【解决方案1】:

    有趣 - 你在这里问什么有点令人困惑。

    认为你问的是如何就地过滤Offers。如果是这样:

    IEnumerable&lt;T&gt; 是不可变的(您必须转换为具体的List&lt;T&gt; 或类似的变量才能获得可变性),而OffersIEnumerable&lt;T&gt; - 所以你不能指望Offers.Where(o =&gt; !o.IsSealed)); 改变 Offers 属性 - 它返回一个可在您枚举时过滤源的枚举。

    你会这样做

    var offerList = this.GetOfferList(id)
    offerList.Offers = offerList.Offers.Where(o => !o.IsSealed));
    

    但是,请注意,这隐藏了 Offers 的原始引用,用于与 OfferList 实例共享的任何其他代码。在您开始枚举之前,它实际上也不会进行任何过滤。但这通常更可取。如果您希望它在那里完成,然后 - 在 Where 的末尾使用 .ToArray().ToList() 以强制完成枚举。

    更好的方法是在 OfferList 类上设置一个属性或方法,它可以按需返回一个新的可枚举:

    public IEnumerable<Offer> UnsealedOffers {
      get {
        return Offers.Where(o => !o.IsSealed);
      }
    }
    

    这样你就不会破坏主枚举。

    请注意,此代码易受 Offers 为 null 的影响(NullReferenceException并且返回 null 可枚举(而不是返回空枚举)并不是很好 - 所以如果有机会Offers 可以为空 - 然后要么阻止这种情况发生;或使用:

    return (Offers ?? Enumerable.Empty<Offer>()).Where(o => !o.IsSealed);
    

    【讨论】:

    • 第二种方法以非常出色的方式解决了我的问题。谢谢! :)
    【解决方案2】:

    如果您的意思是要更新原始的 OfferList 实例,您可以将过滤后的序列分配给它的 Offers 字段:

    OfferList offerList = this.GetOfferList(id);
    offerList.Offers = offerList.Offers.Where(o => !o.IsSealed);
    

    【讨论】:

      【解决方案3】:

      您需要一份新的未密封报价清单吗?

      List<Offer> offers = this.GetOfferList(id).Offers
                               .Where(o => !o.IsSealed)
                               .ToList();
      

      【讨论】:

        【解决方案4】:

        您需要设置OfferList 类的Offers。您不能直接转换为 OfferList,因为它不是 List 或未实现 IEnumerable

        OfferList list = new OfferList() { Offers = this.GetOfferList(id).Offers.Where(o =&gt; !o.IsSealed)) };

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-21
          • 1970-01-01
          • 2020-07-22
          • 1970-01-01
          • 2016-07-18
          • 1970-01-01
          相关资源
          最近更新 更多