LINQ to DataSet不区分大小写的组

Ano*_*oop 11 linq datatable group-by case-insensitive dataset

我有一个数据表,我想通过一列数据表(比如Column1string类型)执行不区分大小写的组.我观察到通常LINQ to DataSet执行区分大小写的比较.例如,如果Column1有两个字符串值"Test"和"test",则在应用group by它之后返回两个单独的行,其值为"Test"和"test",而不是一个.

查询是:

var countGroupQuery = from table in dataTable.AsEnumerable()
                      group table by table.Field<string>(Column1) into groupedTable
                      select new
                      {
                          value = groupedTable.Key,
                          count = groupedTable.Count()
                      };
Run Code Online (Sandbox Code Playgroud)

是否有任何方法来执行不区分大小写,group by以便在上面的示例中我只获得一行具有一个值("Test"或"test")?ToUpper或者ToLower实际上将值更改为大写或小写而不是使用至少一个输入值,所以我不想使用它:

group table by table.Field<string>(Column1).ToUpper() into groupedTable
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 22

您无法从查询表达式执行此操作,但可以使用点表示法执行此操作:

var query = dataTable.AsEnumerable()
                     .GroupBy(x => table.Field<string>(Column1),
                              StringComparer.InvariantCultureIgnoreCase)
                     .Select(groupedTable => new
                             {
                                 value = groupedTable.Key,
                                 count = groupedTable.Count()
                             });
Run Code Online (Sandbox Code Playgroud)

您甚至GroupBy可以在一次调用中使用更复杂的重载:

var query = dataTable.AsEnumerable()
                     .GroupBy(x => table.Field<string>(Column1),
                              (key, group) => { value = key, 
                                                count = group.Count() },
                              StringComparer.InvariantCultureIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

显然,这是使用不变文化 - 你也可以使用当前的文化或序数规则.