我有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);