2012-12-13 80 views
-1

我有以下這個lop來匹配輸入數據和來自數據庫的數據。但是,特別是當我在輸入數據中有大約700萬條記錄時,它確實很慢。我如何改進代碼的性能?如何提高此代碼的性能?

的邏輯是

  • 檢查如果輸入數據(電話號碼)與特定前綴
  • 如果是這樣,與從DB中分離預付費數據或後付費

     str //ArrayList 
         arrypostcdma //string[] 
         val //string 
         ddt //DataRow 
         foreach (string ss in arrypostcdma) 
         { 
          if (val.StartsWith(ss)) 
          { 
           foreach (string st in str) 
           { 
    
            if (val == st) 
            { 
             ddt["Type"] = "CDMA"; 
             ddt["Remark"] = "prepaid"; 
    
            } 
            else 
            { 
             ddt["Type"] = "CDMA"; 
             ddt["Remark"] = "postpaid"; 
            } 
           } 
          } 
         } 
    
  • 匹配輸入數據
+0

3個未知變量,我們應該如何改進我們所不知道的? 'arrypostcdma'是一個有7M元素的數組? –

+0

@TimSchmelter對不起!現在將添加它們。 –

+0

它並不一定意味着代碼性能就是這樣,因爲這部分代碼?可以? – Sylca

回答

2
if (arrypostcdma.Any(x => val.StartsWith(x)) 
    { 
     foreach (string st in str) 
     { 
      ddt["Type"] = "CDMA"; 
      ddt["Remark"] = val == st ? "prepaid" : "postpaid"; 
     } 
    } 
+0

不確定爲什麼loop arrypostcdma,如果我們不在子代碼中使用ss。 –

+0

@rs,你說的對,我修好了 –

1

讓您感受性能的最佳方式是s僅查看arrypostcdma和str中的最後一個元素,因爲只有最後一個元素對ddt中的值有任何影響。這會給你和foreach循環一樣的結果。

str //ArrayList 
    arrypostcdma //string[] 
    val //string 
    ddt //DataRow 


     if (arrypostcdma.Any(x => val.StartsWith(x)) 
     { 
      string st = str.Last() 
       if (val == st) 
       { 
        ddt["Type"] = "CDMA"; 
        ddt["Remark"] = "prepaid"; 

       } 
       else 
       { 
        ddt["Type"] = "CDMA"; 
        ddt["Remark"] = "postpaid"; 
       } 

     }