重複する複数の値を持つことができる単一のテキスト列「タイトル」を持つデータテーブルがあります。データビューを使用して重複を削除できます。
DataView v = new DataView(tempTable);
tempTable = v.ToTable(true, "Title");
しかし、ループせずに、個別の値ごとに重複の数を取得するにはどうすればよいですか?
重複する複数の値を持つことができる単一のテキスト列「タイトル」を持つデータテーブルがあります。データビューを使用して重複を削除できます。
DataView v = new DataView(tempTable);
tempTable = v.ToTable(true, "Title");
しかし、ループせずに、個別の値ごとに重複の数を取得するにはどうすればよいですか?
ループしたりLinqを使用したりしたくない場合は、それを行う方法はありませんが、該当する場合は、もう1つの条件でデータテーブルの計算列を使用できます。つまり、データはこのような2つの関連するテーブルにある必要があります。
DataRelation rel = new DataRelation("CustToOrders", data.Tables["Customers"].Columns["customerid"], data.Tables["Orders"].Columns["customerid"]);
data.Relations.Add(rel);
Ordersテーブルの外部キーとしてそのcustomeridフィールドがあるとすると、重複があります。この方法で重複の数を取得できます。
data.Tables["Customers"].Columns.Add("Duplicates",
GetType(Decimal), "Count(child.customerid)");
私があなたが望む結果を得る方法は次のようになります:
tempTable.Rows.Cast<DataRow>()
.Select(dr => Convert.ToString(dr[0]))
.GroupBy(dr => dr)
.Select(g => new { Title = g.Key, Count = g.Count() });
ただし、実際には内部でループしています。実際、各レコードを調べずにそのようなグループ化を行う方法を考えることはできません。
欠点は、その式の結果が一連の匿名型インスタンスになることです。それでも結果をDataViewにしたい場合は、最後のSelectを書き直して、2つの列を持つ新しいDataRowを作成し、それらをDataViewに渡す新しいDataTableに押し込むことができます。