ない素朴な疑問。ここに解決策があります(それは私にとっては複雑すぎるようですが、機能します)。
- 全て共通の値
- のいずれかを持っているすべての行の行の単一の発生を探すために複数のリスト交差するデータセット
- へのLINQを使用して、各列からID値を取得します一致するID
DataTableでLinqを使用するには、this articleを参照してください。あなたは
var setsOfIds = dataTables.Select (
t => t.AsEnumerable().Select (x => x.Field<int>("ID")).OfType<int>());
この
var ids = dt.AsEnumerable().Select (d => d.Field<int>("ID")).OfType<int>();
のような一つのテーブルから複数のテーブルからIDが複数のリストを交差するために得ることができる
、this articleを試してみてください。そこのメソッドの1つを使用すると、すべてのIDの共通部分を取得できます。
var rows = dataTables.SelectMany (t => t.AsEnumerable()).Where(
r => commonIds.Contains(r.Field<int>("ID")));
グループ:ジョンスキートのヘルパーメソッド
public static class MyExtensions
{
public static List<T> IntersectAll<T>(this IEnumerable<IEnumerable<T>> lists)
{
HashSet<T> hashSet = new HashSet<T>(lists.First());
foreach (var list in lists.Skip(1))
{
hashSet.IntersectWith(list);
}
return hashSet.ToList();
}
}
を使用して
我々は今、共通のIDでのDataTableとフィルタからすべての行を平ら
var commonIds = setsOfIds.InsersectAll();
を書くことができますidによって、各行の最初のインスタンスを取得します。
var result = rows.GroupBy (r => r.Field<int>("ID")).Select (r => r.First());
私は過去にIntersectを使用していましたが、いつの間にか平等比較が行われていました。プリミティブ型のEnumerablesで作業していましたが、通常は大丈夫ですが、 。あなたがまだしていないか調べる価値がある – SpaceBison