2009-06-26 13 views
0

私はこの(XLinq)クエリを持っており、クエリ構文に変換する方法を思っていた:これは、StringComparerのないクエリ構文であるLINQのクエリ構文で明確なGROUPBY /でStringComparerを使用して

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

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

私のgroupbyはこれより少し複雑です。新しいプロパティを導入する代わりに、グループのキーを使用することをお勧めします。

ましょう「キーは」(私はしたくないという事実を説明するために、私のより複雑なキー定義を使用してきた選択のコンテキストで使用できないので、これは私が試したものですが、動作しません。 )の選択でこれを繰り返します。私はすべてのケーシングが同じであったことを推測する可能性があるため

最後に
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

関連する問題