Linq:在查询语法中使用StringComparer和Group By / Distinct

时间:2009-06-26 07:59:21

标签: c# linq linq-to-xml group-by ignore-case

我有这个(XLinq)查询,并想知道如何将其转换为查询语法:

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比这更复杂,所以我更喜欢使用组的键而不是引入新属性。

这是我尝试过的,但不起作用,因为let“键”在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 };

最后,区分大小写并不重要,因为我可以假设所有外壳都是相同的......

相关问题:LINQ Distinct operator ignore case?

2 个答案:

答案 0 :(得分:1)

我认为您不能在查询语法中使用比较器,但是您可以在值上调用ToUpper。这将忽略你的情况。使用ToUpper的旁注比使用ToLower更有效,因此ToUpper将是最佳选择。

C#团队对于他们在查询语法中引入的内容非常稀疏,所以对于这样的事情,你将不得不使用扩展方法语法。

答案 1 :(得分:0)

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