有趣 - 你在这里问的内容有点令人困惑。
我想你是在问如何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()
or.ToList()
在结尾处Where
强制完成枚举。
更好的方法是在OfferList
类上有一个属性或方法,它可以按需返回一个新的可枚举:
public IEnumerable<Offer> UnsealedOffers {
get {
return Offers.Where(o => !o.IsSealed);
}
}
这样你就不会破坏主可枚举。
请注意,此代码容易为Offers
null (a NullReferenceException
) ,并且返回 null 可枚举(而不是返回空的枚举)并不是很好 - 所以如果有Offers
可能为 null - 那么要么阻止这种情况发生;或使用:
return (Offers ?? Enumerable.Empty<Offer>()).Where(o => !o.IsSealed);