Linq: использование StringComparer с GroupBy/Distinct в синтаксисе запроса
У меня есть этот (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 ответа
Я не думаю, что вы можете использовать компаратор в синтаксисе запроса, однако вы можете вызвать ToUpper для вашего значения. Это тогда проигнорирует случай для вас. Как примечание, использование ToUpper более эффективно, чем использование ToLower, поэтому ToUpper был бы подходящим вариантом.
Команда C# очень разбиралась в том, что они ввели в синтаксис запроса, поэтому для чего-либо подобного вам придется использовать синтаксис методов расширения.
var grouped = from t in doc.Descendants()
group t by t.Element(ns + "GroupingAttr").Value into MyGroup
select MyGroup.Key