2017-12-19 7 views
-2

私はプログラムを書いて、うまくいきます。しかし、問題は、処理するのに時間がかかることです。 データテーブルに何百万ものデータがあります。プロセスが完了するまで待つことは本当にとても難しいです。私はLinQメソッドについて何か聞いています。しかし、私はそれに慣れていない。誰でも私のコードをスピードアップするのに役立つことができます。Cの中でネストされたforループをスピードアップします。

foreach (var ch in lsCh) 
{ 
    foreach (var dt in lsDt) 
    { 
     foreach (var cs in lsCs) 
     { 
      DataRow[] result = Dtsrc.Select("Channel = '" + ch.ToString() + "' AND Date = '" + dt.ToString() + "' AND CPSTime = '" + cs + "'"); 

      if (result.Length > 0) 
      { 
       //Some calculation 
      } 

      Dtsrc.AcceptChanges(); 
     } 
    } 
} 
+1

、 'lsCh'何ですか'lsDt'と' lsCs'ですか?何をしようとしていますか?あなたはいくつかのコードを投げて、言うことができません:改善する。 LINQもループを使用しますが、通常は読みやすさを向上させるのに役立ちます。 –

+0

あなたのお手伝いをするには、アルゴリズムと反復処理に関するデータに関する情報を提供する必要があります。 –

+0

これはリストです!私はデータテーブル@ TimSchmelter – Shanmugarajan

答えて

1

DataColumnsとリストの種類が明確でないため、適宜変更する必要があります。しかし、これはとにかくより効率的な方法を示しているかもしれません:

List<T>の代わりにHashSet<T>を使用します。あなたは一般的にタイプを変更することができない場合は、コンストラクタにリストを渡すことによってインスタンスを作成することができます。

var setCh = new HashSet<int>(lsCh); 
var setDt = new HashSet<DateTime>(lsDt); 
var setCs = new HashSet<DateTime>(lsCs); 

今、このクエリは、はるかに効率的でなければなりません:

var rowsToProcess = Dtsrc.AsEnumerable() 
    .Where(r => setCh.Contains(r.Field<int>("Channel")) && setDt.Contains(r.Field<DateTime>("Date")) && setCs.Contains(r.Field<DateTime>("CPSTime"))); 

foreach (DataRow row in rowsToProcess) 
{ 
    //Some calculation 
} 
+0

ありがとうございました。それはうまくいく。あなたを混乱させて申し訳ありません! – Shanmugarajan

関連する問題