У меня есть это (XLinq) запроса и было интересно, как преобразовать его в синтаксис запроса:Linq: с помощью StringComparer с GroupBy/Distinct в синтаксисе запроса
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
Моя группа немного сложнее, поэтому я предпочитаю использовать ключ группы вместо того, чтобы вводить новое свойство.
Это то, что я пробовал, но не работает, потому что пусть «ключ» недоступен в контексте выбора (я использую свое более сложное определение ключа, чтобы проиллюстрировать тот факт, что я не хочу повторить это в избранном):
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 operator ignore case?
Я не хотел использовать ToUpper, потому что мне нужен Ключ позже, и я не хочу, чтобы они были заглавными. Как указывалось ранее, я мог бы создать анонимный тип и определить свойство с значением samen в качестве ключа, но использовать исходное значение. Я не хотел этого делать, потому что мой ключ довольно сложный, но я могу использовать let в этом случае ... – riezebosch
В этом случае я бы придерживался синтаксиса без запроса. –
Хотя, если вы использовали ToUpper, только ключ группировки был бы верхней версией ключа, фактический ключ, сохраненный внутри объекта, все равно будет исходной версией ключа. –