2009-06-26 79 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