私は生成しなければならないレポートのいくつかに見られる定期的なパターンを持っています。これらのレポートは、日付範囲に基づくレポートであり、異なるレベルで集計する必要があります。階層データ - 複合パターンC#
このレポートでは、リーフノードレベル(最下位レベル)にタイトルとクォータが生成されたとします。広告申込情報レベル(さまざまなリーフノードのコレクション)で、私はクォータを集約し、別のタイトルを提供したいと思います。これらの広告申込情報は、さらにクォータを集計して固有のタイトルを持つ別のレベルにロールアップされます。
だから、報告書は、このようなものになるだろう:
ROOT LEVEL | Title = "Main Report" | Quota = 100
Month Level | Title = "Jan" | Quota = 100
Week Level | Title = "Week 1" | Quota = 25
Week Level | Title = "Week 2" | Quota = 75
は私が合成パターンを使用して、これを構築するための方法はありますか?私は数多くのアプローチを試みました。クォータを効果的に集計して上位レベルに集計することができないため、ほとんどが不足しています。その後、私はそうのようなライン・アイテムを構築することができ
public interface IInventoryReportItem
{
string Title { get; set; }
int Quota { get; set; }
}
::私はそうのようなインターフェースを構築することができます
public class LineItem : IInventoryReportItem
私もそうのようなコレクションを構築することができます
public class LineItems : IList<IInventoryReportItem>, IInventoryReportItem
{
private readonly List<IInventoryReportItem> _subLineItems;
public LineItems()
{
_subLineItems = new List<IInventoryReportItem>();
}
を
私の報告書は次のようになります:
public class InventoryReport
{
public DateRange DateRange { get; set; }
public LineItems LineItems { get; set; }
}
私は今、階層的に簡単にレポートを作成することができますが、私はまだそれとは対照的に、自動計算する私のためにこれを外部から集約関数を呼び出す必要があります。
var report = new InventoryReport();
var week1Days = new LineItems
{
new LineItem {Quota = 20, Title = "Day 1"},
new LineItem {Quota = 10, Title = "Day 2"}
};
var week2Days = new LineItems
{
new LineItem {Quota = 10, Title = "Day 1"},
new LineItem {Quota = 10, Title = "Day 2"}
};
var week1 = new LineItems {week1Days};
week1.Quota = week1.Sum(x => x.Quota);
week1.Title = "Week1";
var week2 = new LineItems {week2Days};
week2.Quota = week2.Sum(x => x.Quota);
week2.Title = "Week2";
var month1 = new LineItems(new List<IInventoryReportItem> {week1, week2});
month1.Title = "January";
month1.Quota = month1.Sum(x => x.Quota);
report.LineItems = new LineItems(new List<IInventoryReportItem> {month1});
あります私はまだ、単一のラインアイテムまたはアイテムの範囲のいずれかを追加する柔軟性を持つことができますし、また、複合材料を使って私のためにデータを自動計算/集計しますか?
助けがあれば助かります。
は、あなたがRX(リアクティブエクステンション)を探しているようですので、あなたが各レベルで毎回手動を合計する必要はありませんが、私にとっては、 Anup
独自の長さをチェックする 'LineItems' 'Quota'プロパティのゲッターを実装し、0より大きい場合は子の' Quota'を合計します。私はそれが "複合パターン"に適合しているかどうかはわかりませんが、動作するコードのパターンにパターンが入り込まないようにしています。 –