The easiest way to do this is to create a function that selects the required columns and creates a hash for comparison. I would do something like this:
Func<DataRow, IEnumerable<string>, string> f = (row, cols) =>
String.Join("|", cols.Select(col => row[col]));
, DataRow IEnumerable<string>. IEnumerable<string> ( ) (cols.Select(col => row[col]))), |. , , .
IEnumerable<IGrouping<object, DataRow>> groupings = table
.AsEnumerable()
.GroupBy(row => f(row, columns));
, , . , - , , .