1

私は実行に非常に長い時間がかかる次の方法を持っており、それをより速く実行したり、より効率的にしたりするための助けが欲しいです。

このメソッドの主な役割は、CSVファイルから作成されたデータポイントのリストを取得し、ファイルデータポイントのNameプロパティをプロパティHistorianTagnameごとのタグ名のリスト内のプロパティにDataLoggerTagnameマップし、マッピングから結果のリストを作成することです。マッピングが存在しない場合、ファイルデータポイントは無視されます。

長い間、それが長かったことは知っていますが、それが理にかなっていることを願っています。メソッドを見るだけの方が簡単かもしれません。

    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;
            }
        }
    }

注:私はマッピングのクラスとメソッドを完全に制御しているので、根本的に間違ったことをしている場合。知りたい!

ありがとう!

4

4 に答える 4

4

私は修正することから始めます:

var historianTagname = historianTagnames.FirstOrDefault(x => x.DataLoggerTagname.Equals(fileDatapoint.Name, StringComparison.OrdinalIgnoreCase))

これは、このループをすべての反復で実行するにはかなりコストのかかる操作です。

于 2012-05-04T16:11:53.750 に答える
2

@Sheldon Warkentinが言ったようFirstOrDefaultに、おそらく関数のボトルネックでありDictionary、名前がキーであるhistorianTagnamesを作成することをお勧めします。その後、関数でキーごとに値を取得できます。

以下のようなもの:

// this is passed to method
IDictionary<string, Tagname> historianTagnames;
// .. method body
var historianTagname = historianTagnames[fileDatapoint.Name];

もちろん、適切なifを追加する必要があります。

于 2012-05-04T16:15:51.943 に答える
2

以下は私の提案です。

private IEnumerable<DataPoint> GetHistorianDatapoints(IEnumerable<DataPoint> fileDatapoints, IEnumerable<Tagname> historianTagnames)
{
    var tagNameDictionary = historianTagnames.ToDictionary(t => t.DataLoggerTagname, StringComparer.OrdinalIgnoreCase);

    foreach (var fileDatapoint in fileDatapoints)
    {                
        if (tagNameDictionary.ContainsKey(fileDatapoint.Name))
        {
            var historianTagname = tagNameDictionary[fileDatapoint.Name];
            var historianDatapoint = new DataPoint();

            historianDatapoint.Name = historianTagname.HistorianTagname;
            historianDatapoint.Date = fileDatapoint.Date;
            historianDatapoint.Value = fileDatapoint.Value;

            yield return historianDatapoint;
        }
    }
}
于 2012-05-04T16:19:41.480 に答える
0

他の人が言ったように、Dictionary<string, Tagname>パフォーマンスが向上する可能性があります。

var historianDict = new Dictionary<string, Tagname>();
foreach (var tagName in historianTagnames) {
    historianDict[tagName.DataLoggerTagname.ToLowerInvariant()] = tagName;
}

foreach (var fileDatapoint in fileDatapoints) {
    if (historianDict.ContainsKey(fileDatapoint.Name.ToLowerInvariant()) {
        // ...
    }
}
于 2012-05-04T16:22:17.900 に答える