我有以下方法,需要很長時間才能運行,並且會喜歡一些幫助,以使其運行得更快或更高效。基於現有列表和查找列表創建列表是否更有效?
該方法的主要責任是採取從CSV文件創建的數據點的列表,由DataLoggerTagname
屬性的文件數據點的到到HistorianTagname
屬性Name
屬性映射在標記名的列表,並創建一個結果列表來自映射。如果映射不存在,則文件數據點將被忽略。
我知道這是囉嗦,但我希望它是有道理的。這可能是更容易只是看方法:
private IEnumerable<DataPoint> GetHistorianDatapoints(IEnumerable<DataPoint> fileDatapoints, IEnumerable<Tagname> historianTagnames)
{
/**
** REFACTOR THIS
**/
foreach (var fileDatapoint in fileDatapoints)
{
var historianTagname = historianTagnames.FirstOrDefault(x => x.DataLoggerTagname.Equals(fileDatapoint.Name, StringComparison.OrdinalIgnoreCase));
if (historianTagname != null)
{
var historianDatapoint = new DataPoint();
historianDatapoint.Name = historianTagname.HistorianTagname;
historianDatapoint.Date = fileDatapoint.Date;
historianDatapoint.Value = fileDatapoint.Value;
yield return historianDatapoint;
}
}
}
注: 我的類和映射的方法完全控制,所以,如果我做的東西基本上是錯誤的。我會很高興知道!
謝謝!
如果存在大量標記名,則使用歷史標記名的冠詞。你基本上會一遍又一遍地查看它們,並且dictrionary會節省一些計算量 –
你有沒有考慮將你的historianTagNames存儲到一個'Dictionary dic = new Dictionary (StringComparer.OrdinalIgnoreCase);'Then只需用'dic ['yourkey']訪問historianTagName''這應該會給你更好的表現,我相信? –
@AdolfoPerez:將StringComparer作爲EqualityComparer傳遞給字典的+1好主意 – empi