7

次のプロパティを持つ 3 つのクラスがあります。

オファーリスト クラス:

Guid Id
IEnumerable<Offer> Offers

提供クラス:

Guid Id
Product Product
bool IsSealed

製品クラス:

Guid Id

OfferList には複数のオファーが含まれており、オファーには正確に 1 つの製品があります。

シールされていないオファーのみが含まれるように、OfferList をフィルター処理するにはどうすればよいですか?

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

これは、OfferList をフィルタリングする代わりに、Offer 型の IEnumerable を返します。

4

4 に答える 4

15

興味深い-ここであなたが求めていることは少し混乱しています。

インプレースでフィルタリングする方法を質問されていると思います。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);
  }
}

そうすれば、列挙可能なマスターを破壊することはありません。

このコードはOffersnull(a NullReferenceException影響を受けやすく、 nullの列挙可能なものを返すのは良くないことに注意してください(代わりに空の列挙可能なものを返します)-したがって、Offersnullになる可能性がある場合は、それが起こらないようにします。または使用:

return (Offers ?? Enumerable.Empty<Offer>()).Where(o => !o.IsSealed);
于 2012-12-04T10:25:27.583 に答える
1

封印されていないオファーの新しいリストが必要ですか?

List<Offer> offers = this.GetOfferList(id).Offers
                         .Where(o => !o.IsSealed)
                         .ToList();
于 2012-12-04T10:28:32.970 に答える
1

元のインスタンスを更新する場合は、フィルター処理されたシーケンスをそのフィールドOfferListに割り当てることができます。Offers

OfferList offerList = this.GetOfferList(id);
offerList.Offers = offerList.Offers.Where(o => !o.IsSealed);
于 2012-12-04T10:23:18.987 に答える
0

クラスの を設定する必要がOffersありますOfferList。ではないか実装していOfferListないため、 に直接キャストすることはできません。ListIEnumerable

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

于 2012-12-04T10:22:37.690 に答える