1

これは、私が尋ねて非常に良い答えを受け取った以前の質問に非常に関連しています-少し複雑になりまし た.DataTableオブジェクトから別の列を条件として個別の列の組み合わせを選択するにはどうすればよいですか?

C#2010を使用しています。

私が使用している DataTable オブジェクトには、次の構造があります (サンプル データで満たされています)。

"name"    "ID"    "hiredate"    "termdate"
Bobby     1        5/1/2011       7/1/2011
Peggy     2        5/1/2011
Lucy      4                       7/3/2012
Jenny     3        5/2/2011
Jenny     3        5/2/2013
Jenny     3        5/2/2011       6/1/2011
Peggy     2        5/1/2011
Lucy      4        6/1/2012

この DataTable をフィルター処理して、個別の ("ID"、"hiredate") 組み合わせのみを保持したいと考えています。この問題には 2 つの主な特徴があります: 1 - 重複した ("ID"、"hiredate") エントリがある場合、最も情報が多いエントリ (つまり、既存の "termdate") を保持する必要があります。2 - 一部のエントリには「採用日」がなく、「任期日」のみがあります。条件1を正確に処理する前に、適切な「採用日」と一致させる必要があります(少なくともそうすると思います)。

データ テーブルは、データベース クエリからではなく、csv と、場合によっては追加されたユーザー入力から作成されます。

したがって、これを実行した後の結果のテーブルは次のようになります。

"name"    "ID"    "hiredate"    "termdate"
Bobby     1        5/1/2011       7/1/2011
Peggy     2        5/1/2011
Jenny     3        5/2/2013
Jenny     3        5/2/2011       6/1/2011
Lucy      4        6/1/2012       7/3/2012

Jenny には 2 つの異なる "hiredate" 値が表示されたため、2 つのエントリがあり、そのうちの 1 つも重複していたため、"termdate" のないエントリが削除されました。Lucy の 2 つの行がマージされました。補完的な欠落している日付がありました。

C# でこれを行う方法について何か提案はありますか? 繰り返しますが、DataTable オブジェクトを使用しています。「name」フィールドと「termdate」フィールドはまだ保持する必要があります。保持していない場合は、個別の (「ID」、「雇用日」) リストを取得できましたが、実際には保持する必要があります。

私の最初の質問では、「termdate」はあるが「hiredate」がないエントリはありませんでした。これが受け入れられた解決策であり、私にとってはうまくいきました:

            DataView dv = new DataView(dt);
            dv.Sort = "ID ASC, HireDate DESC, TermDate DESC";

            string lastID = "0";
            List<DateTime> addedHireDatesForUser = new List<DateTime>();

            foreach (DataRowView drv in dv)
            {
                if (drv["ID"].ToString() != lastID)
                {
                    addedHireDatesForUser = new List<DateTime>();
                    addedHireDatesForUser.Add(DateTime.Parse(drv["HireDate"].ToString()));

                    // NEXT ID, ADD ROW TO NEW DATATABLE
                }
                else if (!addedHireDatesForUser.Contains(DateTime.Parse(drv["HireDate"].ToString())))
                {
                    addedHireDatesForUser.Add(DateTime.Parse(drv["HireDate"].ToString());

                    // NEXT DATE, ADD ROW TO NEW DATATABLE
                }

                lastID = drv["ID"].ToString();
            }

私が探しているのは、このプロセスの一部として "hiredate" が欠落しているエントリを処理する (少なくともある程度) エレガントな方法のヘルプです。それらすべてを一致させるために非常に非効率的なループを作成することもできますが、(実際には) このテーブルには何千ものエントリがあるため、より良い方法があるかどうか疑問に思う必要があります。

提案に感謝します!

4

1 に答える 1