12

Column1我有一个数据表,我想通过一列数据表(比如字符串类型)执行不区分大小写的分组。我观察到通常 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()
                      };

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

group table by table.Field<string>(Column1).ToUpper() into groupedTable
4

3 回答 3

23

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

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

您甚至可以GroupBy在一次调用中使用更复杂的重载来执行此操作:

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

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

于 2009-09-29T07:19:01.883 回答
3

这篇MSDN 文章有一些关于数据集和区分大小写的信息。

您可以通过设置数据集的CaseSensitive 属性来控制过滤、搜索和排序的区分大小写。

于 2009-09-29T07:02:33.683 回答
0
var query = dt.AsEnumerable()
              .GroupBy(r => r.Field<string>("Mes"))
              .Select(g => new { Mes = g.Key, 
                                 Tns = g.Sum(s => Convert.ToDecimal(s.Field<string>("Tns"))) })
              .OrderBy(g => g.Mes.First())
              .Where(g => g.Mes == ddlMes.SelectedValue.ToString());
于 2012-03-01T07:00:50.683 回答