-1

過去 1 日間、7 日間、30 日間、または 360 日間のトランザクションの記録をまとめてカテゴリ別に保存しようとしています。私はいくつかのことを試みましたが、それらは残酷に失敗しました。360 の値を持つキューを 1 日 1 つ使用するというアイデアがありましたが、それがどのように機能するかを理解するには、キューについて十分に知りません。

入力はこのクラスのインスタンスになります:

class Transaction
{
    public string TotalEarned { get; set; }
    public string TotalHST { get; set; }
    public string TotalCost { get; set; }
    public string Category { get; set; }
}

新しいトランザクションは 1 日のいつでも発生する可能性があり、1 日に最大 15 回のトランザクションが発生する可能性があります。私のプログラムはプレーン テキスト ファイルを外部ストレージとして使用していますが、それを読み込む方法は、このデータをどのように保存するかによって異なります。

これを行う最良の方法は何ですか?

4

5 に答える 5

2

キューがまさにあなたがここで探しているものかどうかはわかりません。キューは一時的なデータ構造のようなものです: しばらくの間保持することを意図したものではありません。

あなたのユースケースはデータベースを求めているようです。構造化されたデータを長期間保存し、さまざまな基準で並べ替えまたはクエリを実行することは、まさにデータベースが発明された目的です。

于 2013-10-23T20:37:43.533 に答える
0

データ ストアを決定する前に、データに対して実行する操作を検討する必要があります。私には、あなたがしたいように聞こえます

  • 日付および期間によるクエリ
  • コレクションに含まれるデータの経過時間に基づいてコレクション自体をパージする

必要な (そしてそれ以上の) 操作を実行し、適切なタイプのバッキング ストアを使用するカスタム クラスを記述します。

このようなもの:

class MyTransactions
{
  private DateTime? OldestDate   { get ; set ; }
  private Dictionary<DateTime,List<Transaction>> BackingStore { get ; set ; }
  private int RetentionPeriodInDays
  {
    get
    {
      DateTime now     = DateTime.Now.Date ;
      TimeSpan oneYear = now - now.AddYears(-1) ;
      int      days    = (int) oneYear.TotalDays ;
      return days ;
    }
  }

  public MyTransactions()
  {
    OldestDate = null ;
    BackingStore = new Dictionary<DateTime,List<Transaction>>();
  }

  public void Add( Transaction t )
  {
    if ( t == null ) throw new ArgumentNullException("t");

    if ( this.BackingStore.Count > RetentionPeriodInDays )
    {
      this.BackingStore.Remove(this.OldestDate.Value ) ;
      this.OldestDate = this.BackingStore.Keys.Min() ;
    }

    DateTime today = DateTime.Now.Date ;
    List<Transaction> transactions ;
    bool exists = this.BackingStore.TryGetValue(today,out transactions) ;
    if ( !exists )
    {
      transactions = new List<Transaction>();
      this.BackingStore.Add(today,transactions) ;
    }
    transactions.Add(t) ;

    if ( today < this.OldestDate )
    {
      this.OldestDate = today ;
    }

    return ;
  }

  public List<Transaction> TodaysData
  {
    get
    {
      DateTime today = DateTime.Now.Date ;
      List<Transaction> value = new List<Transaction>( this.BackingStore[today] ) ;
      return value ;
    }
  }

  public List<Transaction> CurrentWeekData
  {
    get
    {
      DateTime today = DateTime.Now.Date ;
      List<Transaction> value = this.BackingStore
                                    .Where( x => x.Key > today.AddDays(-7) )
                                    .SelectMany( x => x.Value )
                                    .ToList()
                                    ;
      return value ;
    }
  }

}
于 2013-10-23T21:54:23.343 に答える
0

あなたは明らかにスピードよりも利便性を求めています。予想される一般的な使用量では、合計で約 5400 のトランザクションが保存されます。それは本当に小さいです、そして、シングルArrayListは問題ないはずです。そこからデータをクエリしたい場合は、関連するアイテムを別のアイテムに追加してそれを繰り返し、それArrayListを返します。

データをソートされた順序に保つだけです。つまり、すべての新しいトランザクションはリストの後ろにプッシュされます。カテゴリごとに引き出したい場合は、日ごとに引き出すのと同じくらい簡単です。

単一の構造を保持し、そこからクエリをコピーすると、特にクラスが複数のスレッドで使用され、ロックが必要な場合に、作業が楽になります。

私には、検索を高速化するためにインデックスを維持したり、データベースを使用したりするのはやり過ぎのように思えます。シンプルなソリューションで十分に機能する場合は、それを使用してください。保守が容易になり、エラーが発生しにくくなります。

于 2013-10-23T20:44:56.077 に答える