0

問題を解決する方法はいくつかありますが、ここで状況を把握しましたが、現在行っているように解決するのが最善の方法ではないと非常に感じています。最初に私の問題を説明してみましょう。データベースから NavReturnModelSP の IEnumerable を取得します。NavReturnModelSP は次のような単純なモデル クラスです。

public class NavReturnModelSP
{
    public string Scheme_Name { get; set; }
    public DateTime Date { get; set; }
    public double ReInvest_Nav { get; set; }
}

ここで、最初に Scheme_Name & Date でセットを並べ替える必要があります。次に、最初の日付からのスキーム間の適切な比較のために、各スキームと日付のペアの値を 100 の基数にリベースする必要があります。データベース出力を変更できません。以下は参照用の写真です。問題がよりよく説明されることを願っています。

問題

そして、ループするだけで解決しています....ここで、「データ」はNavReturnModelSPのIEnumerableです

var preModel = data.OrderBy(x => x.Scheme_Name).ThenBy(x => x.Date).ToList();
var preScheme = "";
var firstNav = 0d;
for (int i = 0; i < preModel.Count(); i++)
{
    if (preModel[i].Scheme_Name != preScheme)
    {
        firstNav = preModel[i].ReInvest_Nav;
        preModel[i].ReInvest_Nav = 100;
    }
    else
    {
         if (preModel[i - 1].ReInvest_Nav != 0) // Just a check, nothing special.
             preModel[i].ReInvest_Nav = 100 * preModel[i].ReInvest_Nav / firstNav;
    }
    preScheme = preModel[i].Scheme_Name;
}

これで、ReInvest_Nav 列にリベースされたデータを含む「preModel」ができました。しかし、私はCPUの適切なパワーを使用していないと感じています.100000行のループは非常に遅くなるため、並列プログラミング/ PLINQを使用して時間枠を最小限に抑えることができます. 誰かが私を案内してくれませんか。

おかげさまで、明けましておめでとうございます :) サンジェイ

4

1 に答える 1

2

これを試して:

var preModel = data.GroupBy(x => x.Scheme_Name)
                   .Select(x => new {
                                      Scheme_Name = x.Key, 
                                      Max = x.Max(m => m.ReInvest_Nav), 
                                      Data = x
                                    })
                   .SelectMany(x => x.Data.Select(y => new {
                                       y.Scheme_Name, 
                                       y.Date, 
                                       y.ReInvest_Nav, 
                                       Rebased = y.ReInvest_Nav / x.Max * 100
                                     }))
                   .OrderBy(x => x.Scheme_Name)
                   .ThenBy(x => x.Date)
                   .ToList();

これがこれ以上高速になるとは約束できませんが、明示的なループを回避できます。

于 2012-12-31T18:39:19.483 に答える