2012-12-31 19 views
0

雖然我有幾種方法可以解決問題,但我非常感覺它不是解決問題的最佳方法因爲我現在正在做。讓我先試着解釋我的問題。從數據庫我得到NavReturnModelSP的IEnumerable其中NavReturnModelSP就像以更好更快的方式將IEnumerable的十進制字段重新映射到其他兩個字段

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

現在我需要一階通過採用scheme_name &日期設定一個簡單的模型類&則需要在每個方案&日期對的值變基到的基100,以便在第一次約會之間進行適當的比較。 我無法更改數據庫輸出。下面是你的照片,希望它能更好地解釋你的問題。

The problem

而我只是通過.... 循環現在解決它在那裏「數據」是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; 
} 

現在我有「preModel」與基期數據在ReInvest_Nav列中。但我覺得我沒有使用CPU的適當電源我可以使用Parallal編程/ PLINQ來最小化時間幀,因爲100000行循環將非常慢。有人可以請指導我。

感謝&新年快樂:) 桑傑

+0

我不明白這一點。從數據庫中拉出100000行數據非常慢,優化使用數據的代碼會使整個操作速度提高0.1%。總是首先介紹。 –

+0

@HansPassant我明白,但問題是返回這種類型的數據的SP是一些其他供應商,我不能修改:(和100000是最大它可能會從2000年到該限制 – user1841842

+0

這完全不是當然這個dbase很慢,關鍵是你在浪費時間改進代碼而不能看清它們之間的差異,你沒有**測量過**,你現有的代碼是瓶頸問題 –

回答

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(); 

我不能保證,這將是任何更快,但它避免了顯式循環。

+0

這是一個大的LINQ: )現在通過它會更新你。與此同時,我正在想像一樣。計劃和日期組合行不相互依賴,因此,針對計劃和日期組合的每組行都可以以並行方式處理... – user1841842

+0

@ user1841842 - 肯定可行。您只需要執行'GroupBy',然後爲每個密鑰創建一個新線程。 – Bobson

+0

你可以給一個提示代碼嗎?我需要在計劃和日期之後使用AsParallel()嗎? – user1841842

相關問題