我有3个类具有以下属性:
最高级:

Guid Id
IEnumerable<Offer> Offers

报价等级:
Guid Id
Product Product
bool IsSealed

产品类别:
Guid Id

报价单包含多个报价,一个报价有一个确切的产品。
如何过滤报价单,使其仅包含未密封的报价?
OfferList offerList = this.GetOfferList(id).Offers.Where(o => !o.IsSealed));

这将返回类型为offer的IEnumerable,而不是筛选offerList。

最佳答案

有意思-你在这里问的有点混乱。
我想你是在问如何将Offers过滤到位。如果是:
IEnumerable<T>是不可变的(您必须转换为具体的List<T>或类似的形式才能获得可变的属性),并且Offers是一个IEnumerable<T>-因此您不能期望Offers.Where(o => !o.IsSealed));更改Offers属性-它返回一个可枚举的值,在枚举源时对其进行筛选。
相反你会

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

但是,请注意,这会隐藏对Offers实例的任何其他代码共享的原始OfferList引用。它实际上也不会做任何过滤,直到你开始枚举。但这通常是更可取的。如果您希望在那里完成,然后在.ToArray()末尾使用.ToList()Where来强制完成枚举。
更好的方法是在OfferList类上有一个属性或方法,该属性或方法按需返回一个新的可枚举:
public IEnumerable<Offer> UnsealedOffers {
  get {
    return Offers.Where(o => !o.IsSealed);
  }
}

这样就不会破坏主枚举。
请注意,此代码易受Offers为空(aNullReferenceException)的影响,并且返回空的可枚举数(而是返回空的可枚举数)并不好,因此如果Offers有可能为空,请停止该操作;或者使用:
return (Offers ?? Enumerable.Empty<Offer>()).Where(o => !o.IsSealed);

09-12 16:46