3

あなたが私を助けることができるかどうか見てみましょう。私はLINQがあまり得意ではないので、それが可能かどうかさえわかりません。実際、そうだと思いますが、最善の方法をまだ見つけることができませんでした。

List と DataTable を持つオブジェクトがあります。この DataTable には、リスト内のアイテムの数と同じ数の行があり、それらは相関しています (リストの最初のアイテムは最初の行に関連し、2 番目のアイテムは 2 番目の行に関連しています)。DataTable から日付範囲とそれに関連する行を選択できるようにしたいと考えています。私は現在それを行っていますが、いくつかのループと IndexOf があり、処理に時間がかかっています。どうすればより速くできるかについて何か提案はありますか?

これは基本的にオブジェクトの構造です (少し単純化しましたが、重要なのはここです):

public class CustomObject(){
    public List<DateTime> dates { get; set; }
    public DataTable table { get; set; }
}

そして、これが私がそれを選択する方法です:

private bool SelectRange(DateTime begin, DateTime end, CustomObject custom)
{
    var range = from date in custom.dates
                where date.CompareTo(begin) >= 0 &&
                      date.CompareTo(end) < 0
                select date;

    DataTable tmpTable = custom.table.Copy();  // I'm doing this just to copy the structure of the DataTable
    tmpTable.Clear();

    if (range.Count() > 0)
    {
        List<DataRow> rowList = new List<DataRow>();
        foreach (var date in range)
        {
            int dateIndex = custom.dates.IndexOf(date);
            rowList.Add(custom.table.Rows[dateIndex]);
        }

        foreach (DataRow row in rowList)
        {
            tmpTable.Rows.Add(row.ItemArray);
        }
        custom.table = tmpTable;
    }
    else
    {
        custom.table.Rows.Clear();
    }                    
}

これを最適化する方法についてのアイデアはありますか?

ご清聴ありがとうございました。どんなアイデアでも大歓迎です (私の母国語ではない英語の修正も大歓迎です)。

4

2 に答える 2

2

簡単にしたい場合は、 を使用.Zip()して、2 つの独立したリストを 1 つの関連リストに変換します。

var newList = custom.dates.Zip(custom.table.Rows, 
  (first, second) => new { Date = first, Row = second });

それができたら、各日付/行のペアで簡単な選択を行うことができます:

var reducedList = newList.Where(i => i.Date >= begin && i.Date <= end);

それができたら、その縮小されたリストをデータ テーブルに追加できます。

(私は上記をコンパイルまたはテストしていません)

于 2013-06-06T20:49:00.067 に答える