1

我试图获得一个不同的元素列表,但它总是返回所有内容。

xml:

<root>
    <row>
        <unit>CAN</unit>
    </row>
    <row>
        <unit>KG</unit>
    </row>
    <row>
        <unit>KG</unit>
    </row>
    <row>
        <unit>PKT</unit>
    </row>
    <row>
        <unit>CAN</unit>
    </row>
    <row>
        <unit>PKT</unit>
    </row>
    <row>
        <unit>KG</unit>
    </row>
</root>

林克:

List<XElement> elements = (from e in xdoc.Descendants("row").Elements()
     where e.Name.Equals("unit")
     select e).Distinct().ToList();

预期输出:元素列表应包含 3 个项目

    <unit>CAN</unit>
    <unit>KG</unit>
    <unit>PKT</unit>
4

5 回答 5

7

Distinct()不知道XElement要比较哪个部分,所以它只会比较对象引用。由于所有 XElement 都是单独的对象,因此无论内容如何,​​它都会将它们全部返回。

您要么必须定义一个IEqualityComparer允许它比较它们的方法(可能是这样做的首选方式),要么只使用 GroupBy 可以采用一个 lambda 来允许它比较实际值;

var elements = (from e in xdoc.Root.Elements("row").Elements("unit")
                select e).GroupBy(x => x.Value).Select(x => x.First());

输出:

<unit>CAN</unit>
<unit>KG</unit>
<unit>PKT</unit>
于 2012-08-23T18:01:13.827 回答
0

这对我有用:

var query = (from e in xml.Root.Elements("row").Elements("unit")
         select e).GroupBy(e => e.Value).Select(x => x.First());

编辑:哎呀——我忽略了“不同”的要求。使用Joachim Isaksson的 lambda 表达式修改上述答案。这是新的输出:

<unit>CAN</unit> 
<unit>KG</unit> 
<unit>PKT</unit> 
于 2012-08-23T17:45:08.210 回答
0

选择 e.Value,

   from e in xdoc.Descendants("row").Elements()
 where e.Name.Equals("unit")
 select e.Value).Distinct().ToList();
于 2012-08-23T17:48:34.883 回答
0

我会分组并取每个组中的第一项:

    XDocument doc = XDocument.Load("../../XMLFile1.xml");

    List<XElement> distinctUnits =
        (from unit in doc.Root.Elements("row").Elements("unit")
         group unit by (string)unit into g
         select g.First()).ToList();

    foreach (XElement unit in distinctUnits)
    {
        Console.WriteLine(unit);
    }
于 2012-08-23T18:01:20.610 回答
0

这将得到结果

      List<XElement> elements = new List<XElement>();

     foreach (var item in xdoc.Descendants().Where(c => c.Name == "unit").Select(c=>c))
        {
            if (elements.Where(c => c.Value == item.Value).FirstOrDefault() == null)
            {
                elements.Add(item);
            }
        }


  <unit>CAN</unit>
  <unit>KG</unit>
   <unit>PKT</unit>
于 2012-08-23T18:07:40.383 回答