4

ExpandoObjectsを次のようなグリッドに靴べらにするために、次の2つの試みが行われました。

これは機能しません:

var data = _d.Query<dynamic>(_script);         // returns IEnumerable<ExpandoObject>

IDictionary<string, object> c = (IDictionary<string, object>)data.FirstOrDefault();
DataTable dt = new DataTable();

dt.BeginLoadData();
dt.Columns.AddRange(c.Keys.Select(k => new DataColumn(k)).ToArray());
data.Select(r => dt.Rows.Add((r as IDictionary<string, object>).Values.ToArray()));
dt.EndLoadData();

しかし、これはします:

dt.Columns.AddRange(c.Keys.Select(k => new DataColumn(k)).ToArray());
foreach (IDictionary<string, object> r in data)
  dt.Rows.Add(r.Values.ToArray());

なんで?

4

3 に答える 3

1

方法を選択

このメソッドで表されるクエリは、GetEnumeratorメソッドを直接呼び出すか、Visual C#のforeachまたはVisualBasicのForEachを使用して、オブジェクトが列挙されるまで実行されません。

したがって、この選択は実行されません。

data.Select(r => dt.Rows.Add((r as IDictionary<string, object>).Values.ToArray()));

参照http://msdn.microsoft.com/ru-ru/library/bb548891.aspx

于 2011-11-16T20:12:08.537 に答える
0

私はこれをテストしていませんが、代わりに次のようなものを試してください:

data.Cast<Dictionary<string, object>>().ToList().ForEach(x => dt.Rows.Add(x.Values.ToArray()));
于 2011-11-16T16:49:14.713 に答える
0

セーラーがすでに指摘しているように、LINQは遅延評価されます。クエリの最後にを配置する.LastOrDefault()と実行が発生します(最後の要素を取得しようとすると実行されるためSelect()、コードの見栄えはさらに悪くなります。

定義上、LINQSelectは副作用のある動作には使用しないでください。質問では、オプション2がオプション1よりもはるかにきれいに見えることがわかるはずです。オプション2を読むと、の各要素をデータテーブルに追加していることが簡単にわかりますdata。オプション1を読むことで、変数に対して何かをしていると思いますがdata、それは間違っているでしょう。

結論として、オプション2を使用してください。パフォーマンスが同じである場合(これが当てはまる場合)、コードをできるだけ「読みやすい」ものにするようにしてください。ランダムな人は、すべてを読まなくても一般的なアイデアを得ることができるはずです。

于 2011-11-16T22:18:20.337 に答える