【问题标题】:Linq: using StringComparer with GroupBy/Distinct in query syntaxLinq:在查询语法中使用带有 GroupBy/Distinct 的 StringComparer
【发布时间】:2011-01-04 20:05:11
【问题描述】:

我有这个 (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 比这个复杂一点,所以我更喜欢使用 group 的 key 而不是引入新的属性。

这是我尝试过的,但不起作用,因为在 select 的上下文中 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 };

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

相关问题:LINQ Distinct operator ignore case?

【问题讨论】:

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


    【解决方案1】:

    我认为您不能在查询语法中使用比较器,但是您可以根据您的值调用 ToUpper。然后,这将为您忽略大小写。附带说明一下,使用 ToUpper 比使用 ToLower 更有效,因此 ToUpper 将是可行的方法。

    C# 团队在查询语法中引入的内容非常稀少,因此对于这样的任何事情,您都必须使用扩展方法语法。

    【讨论】:

    • 我不想使用 ToUpper,因为我稍后需要 Key 并且不希望它们全部为大写。如前所述,我可能会创建一个匿名类型并定义一个与键值相同但使用原始值的属性。我不想这样做,因为我的密钥非常复杂,但在这种情况下我可以使用 let...
    • 在这种情况下,我会坚持使用非查询语法。
    • 虽然如果您使用 ToUpper 仅分组键将是键的大写版本,但存储在对象中的实际键仍将是键的原始版本。
    • 我已经更新了我的原始问题以说明我的发现(关于使用“让”)。
    【解决方案2】:
    var grouped = from t in doc.Descendants()
                  group t by t.Element(ns + "GroupingAttr").Value into MyGroup
                  select MyGroup.Key
    

    【讨论】:

    • 我不知道你在选择什么知道吗?我不仅需要钥匙,因此我会使用 Distinct。
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多