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ため、オブジェクト参照のみを比較します。すべての XElements は個別のオブジェクトであるため、コンテンツに関係なく、すべてが返されます。

それらを比較できるように定義する必要がありIEqualityComparerます(おそらくそれを行うための推奨される方法です)か、代わりに実際の値を比較できるようにするラムダを取ることができる GroupBy を使用する必要があります。

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のラムダ式を使用して上記の回答を修正します。新しい出力は次のとおりです。

<unit>CAN</unit> 
<unit>KG</unit> 
<unit>PKT</unit> 
于 2012-08-23T17:45:08.210 に答える
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 に答える
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 に答える