Группа LINQ to DataSet без учета регистра

У меня есть таблица данных, и я хочу выполнить группу без учета регистра по столбцу таблицы данных (скажем, Column1 строки типа). Я заметил, что обычно LINQ to DataSet выполняет сравнение с учетом регистра. Например, если Column1 имеет два строковых значения «Тест» и «тест», после применения group by он возвращает две отдельные строки со значениями «Тест» и «тест» вместо одной.

Запрос:

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

person Anoop    schedule 29.09.2009    source источник
comment
Ваши последние правки являются неуместными и , учитывая возраст постов, к которым вы их применяете, вероятно, спам. Пожалуйста, воздержитесь.   -  person Michael Petrotta    schedule 10.04.2012


Ответы (2)


Вы не можете сделать это из выражения запроса, но вы можете сделать это с помощью записи через точку:

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));

Очевидно, что используется инвариантная культура — вы также можете использовать текущую культуру или порядковые правила.

person Jon Skeet    schedule 29.09.2009
comment
Спасибо за ответ. это то что я ищу!!! Кстати, если я хочу применить группу более чем к одному столбцу (столбец 1 и столбец 2), то как должен выглядеть этот запрос?? - person Anoop; 29.09.2009
comment
@Anoop: группировка по нескольким столбцам и без учета регистра будет сложной задачей. Вероятно, вам лучше создать собственный тип, содержащий интересующие вас столбцы, и переопределить Equals. - person Jon Skeet; 29.09.2009
comment
Джон! Не могли бы вы объяснить это немного подробнее?? - person Anoop; 29.09.2009
comment
Боюсь, у меня сейчас нет времени. Я постараюсь вернуться к этому позже. - person Jon Skeet; 29.09.2009

В этой статье MSDN содержится некоторая информация о наборах данных и учете регистра.

Вы можете управлять чувствительностью к регистру при фильтрации, поиске и сортировке, задав набору данных CaseSensitive.

person Quintin Robinson    schedule 29.09.2009
comment
В моем случае DataTable не зависит от набора данных, поэтому для свойства с учетом регистра установлено значение false. Я думаю, что Linq не относится к этому свойству. Он предназначен для операций, предоставляемых классом Dataset/Datatable. - person Anoop; 29.09.2009
comment
DataTable также имеет свойство. Но, честно говоря, я не использовал LINQ для взаимодействия с наборами данных/таблицами, поэтому не могу сказать, будет ли это на самом деле иметь эффект. - person Quintin Robinson; 29.09.2009