■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());
|
|