我有一个定义如下的类:

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<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上创建索引。

有人可以建议更有效的实现。如果您需要更多信息,我们将很乐意提供。

最佳答案

如果我可以以某种方式索引此列表,或者如果这是数据库表,则可以在ObjectId + ChartType上创建索引。


这建议您创建一个由ObjectId和ChartType组成的键类型(AlarmViolationKey?),然后使用Dictionary<AlarmViolationKey, AlarmViolation>。这将从根本上增加搜索时间。如果每个键有多个违规,并且已经以不会更改的方式预先创建了列表,则可以改用Lookup

无论您做什么,基本上都不想执行当前正在执行的线性扫描-您需要基于哈希的查找。

(根据您的实际情况,您可能仍需要一个列表,或者您可以完全使用字典来代替列表。在没有更多上下文的情况下很难说。)

09-30 21:52