2009-06-26 5 views
0

У меня есть это (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?

ответ

1

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

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

+0

Я не хотел использовать ToUpper, потому что мне нужен Ключ позже, и я не хочу, чтобы они были заглавными. Как указывалось ранее, я мог бы создать анонимный тип и определить свойство с значением samen в качестве ключа, но использовать исходное значение. Я не хотел этого делать, потому что мой ключ довольно сложный, но я могу использовать let в этом случае ... – riezebosch

+0

В этом случае я бы придерживался синтаксиса без запроса. –

+0

Хотя, если вы использовали ToUpper, только ключ группировки был бы верхней версией ключа, фактический ключ, сохраненный внутри объекта, все равно будет исходной версией ключа. –

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

Я не понимаю, что вы выбираете, знаете? Я не только нуждаюсь в ключах, поэтому я бы использовал Distinct. – riezebosch