2009-06-26 10 views
0

Ich habe diese (XLinq) Abfrage und frage mich, wie es um die Abfragesyntax zu konvertieren:Linq: mit StringComparer mit GroupBy/Distinct in Abfragesyntax

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

Dies ist die Abfragesyntax ohne StringComparer:

Meine groupby ist ein wenig komplizierter als das, also ziehe ich es vor, den Schlüssel der Gruppe zu verwenden, anstatt eine neue Eigenschaft einzuführen.

Dies ist, was ich versucht habe, aber nicht funktioniert, weil der Schlüssel "let" nicht im Kontext der Auswahl verfügbar ist (Ich habe meine kompliziertere Schlüsseldefinition verwendet, um die Tatsache zu illustrieren, die ich nicht möchte wiederholen Sie diesen Vorgang in der select):

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

Am Ende Groß- und Klein nicht wichtig war, weil ich, dass alle Gehäuse die gleichen waren vermuten könnte ...

Verwandte Frage: LINQ Distinct operator ignore case?

Antwort

1

Ich glaube nicht, dass Sie den Comparer innerhalb der Abfragesyntax verwenden können, jedoch können Sie ToUpper auf Ihrem Wert aufrufen. Dies wird dann für Sie ignorieren. Da eine Seitennotiz, die ToUpper verwendet, effizienter ist als die Verwendung von ToLower, wäre ToUpper der richtige Weg.

Das Team C# waren sehr spärlich mit dem, was sie in die Abfragesyntax eingeführt, so dass für etwas Derartiges Sie die Erweiterungsmethoden Syntax verwenden.

+0

Ich wollte das ToUpper nicht verwenden, da ich den Schlüssel später brauche und nicht möchte, dass sie alle in Großbuchstaben geschrieben sind. Wie bereits erwähnt, könnte ich wahrscheinlich einen anonymen Typ erstellen und eine Eigenschaft mit dem gleichen Wert wie der Schlüssel definieren, aber den ursprünglichen Wert verwenden. Ich wollte das nicht machen, weil mein Schlüssel ziemlich kompliziert ist, aber ich kann in diesem Fall ein ... – riezebosch

+0

verwenden In diesem Fall würde ich dann mit der Nicht-Abfragesyntax bleiben. –

+0

Wenn Sie mit ToUpper nur den Gruppierungsschlüssel verwenden, der die Großbuchstabeversion des Schlüssels ist, ist der tatsächliche Schlüssel, der in dem Objekt gespeichert wird, immer noch die ursprüngliche Version des Schlüssels. –

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

Ich sehe nicht, was Sie auswählen, wissen? Ich brauche nicht nur die Schlüssel, daher würde ich ein Distinct verwenden. – riezebosch