我有一个定义如下的类:
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
。
无论您做什么,基本上都不想执行当前正在执行的线性扫描-您需要基于哈希的查找。
(根据您的实际情况,您可能仍需要一个列表,或者您可以完全使用字典来代替列表。在没有更多上下文的情况下很难说。)