2

次のように定義されたクラスがあります。

public class AlarmViolation
{
    public string ObjectId { get; set; }
    public int ChartType { get; set; }
    public string AlarmInternalId { get; set; }
    public short PositionInSequence { get; set; }
    public short SequenceCount { get; set; }
    public string TagValue { get; set; }
    public DateTime PurgeDate { get; set; }
}

次に、このクラスの List を次のように作成します。

List<AlarmViolation> alarmViolationList;

現在、次のようにLinqクエリを実行しています。

return alarmViolationList
  .Where(row => row.ObjectId == objectId)
  .Where(row => row.ChartType == this.ChartType)
  .Where(row => row.AlarmInternalId == this.InternalId)
  .Where(row => row.PositionInSequence == positionInSequence)
  .Where(row => row.SequenceCount == sequenceCount)
  .Any();

現在の実装では、パフォーマンスがかなり低下しています。通常、リストには 150K ~ 300K のエントリが含まれます。このクエリは、定期的なスケジュール (約 3 分ごと) で何百回も実行されます。

このリストにインデックスを付けることができた場合、またはこれがデータベース テーブルである場合は、ObjectId + ChartType にインデックスを作成します。

誰かがより効率的な実装を提案できますか。さらに情報が必要な場合は、喜んで提供します。

4

3 に答える 3

3

どういうわけかこのリストにインデックスを付けることができれば、またはこれがデータベーステーブルである場合は、ObjectId+ChartTypeにインデックスを作成します。

AlarmViolationKeyこれは、ObjectIdとChartTypeで構成されるキータイプ(?)を作成してから、を使用する必要があることを示していますDictionary<AlarmViolationKey, AlarmViolation>。これにより、検索時間が大幅に短縮されます。キーごとに複数の違反があり、変更されない方法でリストを事前に作成した場合は、代わりにリストを使用できますLookup

何をするにしても、基本的には、現在実行している線形スキャンは実行したくありません。ハッシュベースのルックアップが必要です。

(正確な状況によっては、リストが必要な場合もあれば、リストの代わりに辞書を完全に使用できる場合もあります。これ以上のコンテキストがないと言うのは難しいです。)

于 2012-08-18T19:43:46.997 に答える
1

平等を検索するだけなので、ハッシュテーブルを使用することをお勧めします。同等に検索するすべてのメンバー(この場合は、ObjectId、ChartType、AlarmInternalId、...)を保持するクラスを作成します。実装EqualsGetHashCodeます。

Enumerable.ToDictionary次に、またはを使用してすべてのオブジェクトをルックアップテーブルに配置しますEnumerable.ToLookup。新しく作成された「キー」クラスを使用して、アイテムを追加したり、アイテムを検索したりできます。

これにより、複数の結果があった場合でも、一定時間のルックアップが可能になります。

于 2012-08-18T19:44:33.767 に答える
0

これを書いてみませんか:

return alarmViolationList
      .Any(row => row.ChartType == this.ChartType &&              //int
                  row.PositionInSequence == positionInSequence && //short
                  row.SequenceCount == sequenceCount &&           //short
                  row.AlarmInternalId == this.InternalId &&       //string
                  row.ObjectId == objectId);                      //string

私の意見では、これによりパフォーマンスがある程度向上するはずです。短絡を利用して、比較とstring比較 行っていることに注意してください。intshort

于 2012-08-18T19:43:43.907 に答える