C# Linq:在查询语法中使用带有GroupBy/Distinct的StringComparer

C# Linq:在查询语法中使用带有GroupBy/Distinct的StringComparer,c#,linq,linq-to-xml,group-by,ignore-case,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()

我有一个(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“key”在select上下文中不可用(我使用了更复杂的key定义来说明我不想在select中重复这一点):

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


相关问题:

我认为您不能在查询语法中使用比较器,但是您可以根据自己的值调用ToUpper。这将忽略您的案例。作为旁注,使用ToUpper比使用ToLower更有效,因此ToUpper将是一种选择


C#团队在查询语法中引入的内容非常少,因此对于类似的内容,您必须使用扩展方法语法。

我认为您不能在查询语法中使用比较器,但是您可以根据自己的值调用ToUpper。这将忽略您的案例。作为旁注,使用ToUpper比使用ToLower更有效,因此ToUpper将是一种选择


C#团队在查询语法中引入的内容非常少,因此对于类似的内容,您必须使用扩展方法语法。

我不知道您选择了什么,知道吗?我不仅需要钥匙,因此我会使用一个独特的。我不知道你在选择什么,知道吗?我不仅需要密钥,因此我会使用一个独特的。我不想使用ToUpper,因为我以后需要密钥,不希望它们都是大写的。如前所述,我可能会创建一个匿名类型,并使用samen值作为键定义一个属性,但使用原始值。我不想这样做,因为我的密钥非常复杂,但在这种情况下我可以使用let…在这种情况下,我会坚持使用非查询语法。尽管如果使用ToUpper,只有分组密钥是密钥的大写版本,存储在对象中的实际密钥仍然是密钥的原始版本。我已经更新了原始问题以说明我的发现(关于使用“let”)。我不想使用ToUpper,因为我以后需要密钥,不希望它们都是大写的。如前所述,我可能会创建一个匿名类型,并使用samen值作为键定义一个属性,但使用原始值。我不想这样做,因为我的密钥非常复杂,但在这种情况下我可以使用let…在这种情况下,我会坚持使用非查询语法。尽管如果使用ToUpper,只有分组密钥是密钥的大写版本,存储在对象中的实际密钥仍然是密钥的原始版本。我更新了原始问题以说明我的发现(关于使用“let”)。
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 };
var grouped = from t in doc.Descendants()
              group t by t.Element(ns + "GroupingAttr").Value into MyGroup
              select MyGroup.Key