C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 155 を表示中)
■90315 / )  Re[12]: C# LINQ IEnumerableからDataTable
□投稿者/ 魔界の仮面弁士 (2078回)-(2019/02/25(Mon) 19:35:10)
2019/02/25(Mon) 19:49:13 編集(投稿者)

No90313 (魔界の仮面弁士) に追記
> public class StringItems
> {

上記クラスに
 public override string ToString() { return "{" + string.Join(", ", Items.Select(s => "\"" + s + "\"")) + "}"; }
を付与しておくと、デバッグ時に視認しやすいかと思います。
(あるいは、DebuggerDisplay 属性)



No90314 (Kawauso さん) に返信
> var conditions = dtCondition.AsEnumerable().Select(r => r.Field<string>("Condition")).ToArray();

今回の場合、上記は
 // string[] conditions = { targetCol01, targetCol02, targetCol03 };
 string[] conditions = { "KAWAUSO_COL01", "KAWAUSO_COL02", "KAWAUSO_COL03"};
と同じ結果が得られますね。



> targets2で取得した結果値をWhere句に放り込み、重複レコードを特定することで、
> 要件を実現できそうです。

重複レコードの取得が目的だったのであれば、こういう書き方ができます。


// 重複しているレコードの主キー(SEQ)を列挙する場合
IEnumerable<int> conflictSEQ = dtMain.AsEnumerable()
 .Select(row => new { row, key = new StringItems(conditions.Select(colName => row.Field<string>(colName)).ToArray()) })
 .GroupBy(x => x.key, x => x.row).Where(x => x.Skip(1).Any())
 .SelectMany(x => x.Select(r => r.Field<int>("SEQ")));


// 重複しているキーごとの DataRow を列挙する例
Dictionary<StringItems, DataRow[]> conflict = dtMain.AsEnumerable()
  .Select(row => new { row, key = new StringItems(conditions.Select(colName => row.Field<string>(colName)).ToArray()) })
  .GroupBy(x => x.key, x => x.row).Where(x => x.Skip(1).Any())
  .ToDictionary(x => x.Key.Items, x => x.ToArray());
返信 編集キー/


管理者用

- Child Tree -