Linq: использование StringComparer с GroupBy / Distinct в синтаксисе запроса - PullRequest
0 голосов
/ 26 июня 2009

У меня есть этот (XLinq) запрос, и мне было интересно, как преобразовать его в синтаксис запроса:

var grouped = doc.Descendants()
                 .GroupBy(t => t.Element(ns + "GroupingAttr").Value, StringComparer.OrdinalIgnoreCase);

Это синтаксис запроса без StringComparer:

var grouped = from t in doc.Descendants()
              group t by t.Element(ns + "GroupingAttr").Value into group
              select group

Моя группа немного сложнее, поэтому я предпочитаю использовать ключ группы, а не вводить новое свойство.

Это то, что я пытался, но не работает, потому что «ключ» let не доступен в контексте выбора (я использую свое более сложное определение ключа, чтобы проиллюстрировать тот факт, что я не хочу повторяться это в избранном):

var grouped = from t in doc.Descendants()
              let key = ((t.Name != ns + "SomeElementName") ? t.Element(ns + "SomeAttribute") : t.Element(ns + "SomeOtherAttribute")).ElementValueOrDefault("Empty group")
              group t by key.ToUpper() into g
              select new { Name = key, Items = g };

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

Смежный вопрос: Оператор LINQ Distinct игнорирует регистр?

Ответы [ 2 ]

1 голос
/ 26 июня 2009

Я не думаю, что вы можете использовать компаратор в синтаксисе запроса, однако вы можете вызвать ToUpper для вашего значения. Это тогда проигнорирует случай для вас. Как примечание, использование ToUpper более эффективно, чем использование ToLower, поэтому ToUpper был бы подходящим вариантом.

Команда C # очень разбиралась в том, что они ввели в синтаксис запроса, поэтому для чего-либо подобного вам придется использовать синтаксис методов расширения.

0 голосов
/ 26 июня 2009
var grouped = from t in doc.Descendants()
              group t by t.Element(ns + "GroupingAttr").Value into MyGroup
              select MyGroup.Key
...