5

これが何よりも「できるかやってみよう」です。

複数の列を持つ DataTable があるとします。linq を使用して、匿名型の各プロパティが DataTable の列名に従って命名され、各プロパティの型が設定される匿名型のシーケンスになるように、テーブルの行を選択することは可能ですか?適切に。

したがって、私の DataTable に次のような 3 つの列がある場合:

Name = "Column1",  DataType = string
Name = "Column2",  DataType = integer
Name = "Column3",  DataType = bool

次に、匿名型に 3 つのプロパティがあるように、DataTable のすべての行を選択します。

DataSet ds = functionThatGetsADataSet();
var seq = ds.Tables[0].AsEnumerable().Select( r => **** MAGIC HERE ****)

foreach (var s in seq)
{
    Console.WriteLine(s.Column1);
    Console.WriteLine(s.Column2);
    Console.WriteLine(s.Column3);
}

私はこれを行うことができることを知っています:

DataSet ds = functionThatGetsADataSet();
var seq = ds.Tables[0].AsEnumerable().Select( r => 
   new 
   {
       Column1 = r.Field<string>("Column1"),
       Column2 = r.Field<int>("Column2"),
       Column3 = r.Field<bool>("Column3"),
   }
)

foreach (var s in seq)
{
    Console.WriteLine(s.Column1);
    Console.WriteLine(s.Column2);
    Console.WriteLine(s.Column3);
}

ただし、これには new 句でプロパティ名をハードコーディングする必要がありますが、プロパティ名は DataTable の Columns コレクションから取得したいと考えています。

これを十分に明確に説明したことを願っています。これを少しいじった後、読みやすさと保守性に関する限り、私が思いついたものはすべて大きな混乱になると思い始めていますが、質問してみようと思いました。

4

2 に答える 2

4

残念ながら、そのような魔法はありません (少なくとも匿名型にはありません)。匿名型は、2番目の例(コンパイル時)のように、明示的な割り当て操作によって名前が付けられ、型指定されたプロパティを持つ不変クラスとしてコンパイラによって生成される暗黙的な型です。

あなたがしたいことは、実行時に構築された動的な型を必要とします。

于 2011-06-15T20:32:20.650 に答える