2009-06-26 80 views
0

我有這個(XLINQ)查詢,想知道如何將它轉換爲查詢語法:的LINQ:使用StringComparer用的GroupBy /查詢語法鮮明

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 

我的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,因爲我稍後需要密鑰,並且不希望它們全部大寫。如前所述,我可能會創建一個匿名類型並定義一個與鍵值相同的屬性,但使用原始值。我不想這樣做,因爲我的密鑰非常複雜,但在這種情況下我可以使用let ... – riezebosch 2009-06-26 12:16:52

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

我沒有看到您選擇的內容?我不僅需要鑰匙,所以我會使用一個不同的。 – riezebosch 2009-06-26 12:13:18