興味深い-ここであなたが求めていることは少し混乱しています。
インプレースでフィルタリングする方法を質問されていると思います。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
null(a NullReferenceException
)の影響を受けやすく、 nullの列挙可能なものを返すのは良くないことに注意してください(代わりに空の列挙可能なものを返します)-したがって、Offers
nullになる可能性がある場合は、それが起こらないようにします。または使用:
return (Offers ?? Enumerable.Empty<Offer>()).Where(o => !o.IsSealed);