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

わんくま同盟

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

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


(過去ログ 155 を表示中)
■90316 / )  Re[13]: C# LINQ IEnumerableからDataTable
□投稿者/ Kawauso (9回)-(2019/02/25(Mon) 21:07:26)
2019/02/25(Mon) 21:09:40 編集(投稿者)
No90315 (魔界の仮面弁士 さん) に返信
魔界の仮面弁士 さん

ありがとうございます!まだ睨めっこしてます…

一発で重複チェックできるんですね…。
メソッドチェーンのチェーンのチェーンでなんだか頭がこんがらがってきました。。。(汗)

ええと、GroupByする可変のカラムは、自作でこさえた、StringItemsメソッドに渡して生成するところまではわかりました。
例えば、このGroupBy句に転送する,可変のカラムが以下の3種だったとして、
{ "KAWAUSO_COL01", "KAWAUSO_COL02", "KAWAUSO_COL03"};
この列の値 != "" の条件をWhere句で加えたい場合は、やっぱり厄介になりますかね。。

イメージ的には、以下のような感じを想定しているのですが、、、

// 重複しているレコードの主キー(SEQ)を列挙する場合
IEnumerable<int> conflictSEQ = dtMain.AsEnumerable()
// .Where(row => row.Field<string>("KAWAUSO_COL01") != "" &
//           row.Field<string>("KAWAUSO_COL02") != "" &
//           row.Field<string>("KAWAUSO_COL03") != "")
 .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 -