-1

コレクションに対して重いフィルタリングを行っています(これは、「データライン」のエントリのカプセル化されたリストにすぎません)。これらの行を 3 つのフィールド (Date (文字列)、Route (文字列)、および ConsolidationCode (文字列)) で「統合」する必要があります。

3 つの個別リストの抽出は高速に機能します。トリプル foreach の方が心配です...通常の「完全な _DealerCaseSetComplete には 5000 のエントリが含まれています。日付は約 5、ルートは約 100、連結は 350 ~ 500 です。

以下の方法を書きました。それは私がやりたいことを正確に実行しますが、計算時間が非常に遅くなります。おそらく、皆さんは私をより高速なコード実行に導くことができます。

他のコードが必要な場合は (実際には非常に単純です)、お問い合わせください。

private void FillDataGridView()
    {
        //
        _LocalGridControl.Invoke(CreateDataGrid);

        //Filter by Date
        List<string> Dates = _DealerCaseSetComplete.Data.Select(rec => rec.DateAdded).Distinct().ToList();

        //Filter by Route
        List<string> Routes = _DealerCaseSetComplete.Data.Select(rec => rec.Route).Distinct().ToList();

        //Filter by Consolidation
        List<string> Consolidations = _DealerCaseSetComplete.Data.Select(rec => rec.DealerConsolidationCode).Distinct().ToList();

        foreach(string d in Dates)
        {
            foreach(string r in Routes)
            {
                foreach(string c in Consolidations)
                {
                    List<DealerCaseLine> Filter = _DealerCaseSetComplete.Data.Where(rec => rec.DateAdded == d &&
                                                                                    rec.Route == r &&
                                                                                    rec.DealerConsolidationCode == c).ToList();
                    if(Filter.Count > 0)
                        _LocalGridControl.Invoke(AddLineToDataGrid, Filter);
                }
            }
        }
        _LocalGridControl.Invoke(SortDataGrid);
    }
4

2 に答える 2

2

次の 3 つのフィールドでグループ化する必要があるようです。

var filters = from r in _DealerCaseSetComplete.Data
              group r by new { 
                   r.DateAdded, 
                   r.Route, 
                   r.DealerConsolidationCode 
              } into g              
              select g.ToList();

foreach(List<DealerCaseLine> filter in filters)
    _LocalGridControl.Invoke(AddLineToDataGrid, filter);

コードはすべてのデータを3 回繰り返して、個別のフィールドを取得します。次に、個別のフィールドのすべての組み合わせのすべてのデータを繰り返します (where 句でフィルタリングを行う場合)。この 3 つのフィールドでグループ化すると、データを 1だけ反復します。結果の各グループには少なくとも 1 つのアイテムが含まれるため、フィルターを呼び出す前に、グループ内にアイテムがあるかどうかを確認する必要はありません。

于 2013-04-02T07:02:28.390 に答える
0

日付、ルート、コンソリデーションのすべての異なる組み合わせを取得しようとしているようです。

あなたの現在のコードは、O(n^4) だと思うので遅いです。ネストされた 3 つのループがあり、その本体は線形検索です。

を受け取る Distinct のオーバーロードを使用すると、パフォーマンスが大幅に向上しますIEqualityComparer<T>

http://msdn.microsoft.com/en-us/library/bb338049.aspx

var Consolidated = 
  _DealerCaseSetComplete.Data.Select(rec => rec).
  Distinct(new DealerCaseComparer());

クラスDealerCaseComparerは、上記の MSDN リンクと同じように実装されます。

于 2013-04-02T07:02:17.200 に答える