首页 > 解决方案 > C# linq 从 XElement 树中选择重复项

问题描述

这是我的 XElement 树

        XElement myShoppingList = new XElement("myShoppingList",
            new XElement("Pasadena", new XAttribute("Vendor", "Tesla"),
                new XElement("Car",
                    new XElement("model3",
                        new XElement("Black")))),
            new XElement("LasVegas", new XAttribute("Vendor", "Tesla"),
                new XElement("Car",
                    new XElement("modelY",
                        new XElement("White")))),
            new XElement("Pasadena", new XAttribute("Vendor", "Apple"),
                new XElement("Phone",
                    new XElement("model13",
                        new XElement("Black")))),
            new XElement("Pasadena", new XAttribute("Vendor", "Apple"),
                new XElement("Phone",
                    new XElement("model12",
                        new XElement("White")))));

我似乎无法让这个工作,第一个问题 - 搜索“帕萨迪纳”时,我应该得到 3 次重复:

        var query = myShoppingList.Elements().AsEnumerable()
           .GroupBy(x => x.XPathSelectElement("Pasadena"))
          .Where(g => g.Count() > 1)
          .Select(y => new { Element = y.Key, Counter = y.Count() })
          .ToList();

在拉斯维加斯搜索特斯拉时,我期待 1 次重复

        var query = myShoppingList.Elements().AsEnumerable()
           .GroupBy(x => x.XPathSelectElement("Pasadena[@Name='Tesla']"))
          .Where(g => g.Count() > 1)
          .Select(y => new { Element = y.Key, Counter = y.Count() })
          .ToList();

最后,我想搜索“白色”,无论是谁制作了小部件,然后显示其制造商。所以我期待2次重复:

       var query = myShoppingList.Elements().AsEnumerable()
           .GroupBy(x => x.XPathSelectElement("../../../White"))
          .Where(g => g.Count() > 1)
          .SelectMany(y => y})
          .ToList();

我无法让这个工作我做错了什么?

标签: c#linqlinq-to-xml

解决方案


我似乎无法让这个工作,第一个问题 - 搜索“帕萨迪纳”时,我应该得到 3 次重复:

这是你想要达到的目标吗?:

var query = myShoppingList.XPathSelectElements("Pasadena")
    .GroupBy(x => x.Name)
    .Select(y => new { Element = y.Key, Counter = y.Count() });

在拉斯维加斯搜索特斯拉时,我期待 1 次重复

你可以这样试试。

var query = myShoppingList.XPathSelectElements("Pasadena")
    .Where(x => x.Attributes().Any(x => x.Name == "Vendor" && x.Value == "Tesla"))
    .GroupBy(x => x.Name)
    .Select(y => new { Element = y.Key, Counter = y.Count() });

对于这个,我不确定这是否是你想要实现的

var query = myShoppingList.XPathSelectElements("//White")
    .GroupBy(x => x.Name)
    .Select(y => new { Element = y.Key, Counter = y.Count() });

推荐阅读