【问题标题】:Remove the duplcated element and then sort them with Linq删除重复的元素,然后用 Linq 对它们进行排序
【发布时间】:2009-12-14 15:46:30
【问题描述】:

我有一个 XML 文件:

  <School>
    <SchoolID>9</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>4</SchoolID>
    <SchoolID>1</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>9</SchoolID>
    <SchoolID>2</SchoolID>
  </School>

预期的结果应该是这样的:

 <School>
    <SchoolID>1</SchoolID>
    <SchoolID>2</SchoolID>
    <SchoolID>3</SchoolID>
    <SchoolID>4</SchoolID>
    <SchoolID>9</SchoolID>
 </School>

我的 C# 代码:

var xdoc = XElement.Load(filePath + "input.xml");
var temp = xdoc.Descendants("SchoolID").OrderBy(x => x.Value).Distinct();
xdoc.Save(filePath + "output_final.xml");

但是,结果并没有改变任何东西。

我的临时值是我想要的,如何更新我的输出 xml 结果?

非常感谢。

DY

【问题讨论】:

  • 您应该通过单击每个问题最喜欢的答案旁边的空心检查来接受您的问题的答案。这样做会给你更多的声誉。

标签: xml linq


【解决方案1】:

您的 LINQ 语句只创建一个可以稍后执行的语句,它不会修改任何内容。下面快速解决它:

var xdoc = XDocument.Load(filePath + "input.xml");
xdoc.Root.ReplaceAll(xdoc
    .Descendants("SchoolID")
    .DistinctBy(e => e.Value)
    .OrderBy(e => e.Value));
xdoc.Save(filePath + "output_final.xml");

【讨论】:

【解决方案2】:

像这样:

var ids = xdoc.Descendants("SchoolID")
              .Select(x => int.Parse(x.Value))
              .Distinct()
              .OrderBy(x => x);

var newDoc = new XElement("School", ids.Select(i => new XElement("SchoolID", i));
newDoc.Save(filePath + "output_final.xml");

如果 ID 大于 10,您需要调用 int.Parse 以确保排序正确,并且您需要在 Distinct 之前调用 Select,因为 XElement 是通过引用进行比较的,这意味着没有两个 @ 987654327@s 是相等的,即使它们具有相同的内容。您可以编写自己的IEqualityComparer,但这种方式要容易得多。

【讨论】:

  • 也许颠倒 Distinct 和 OrderBy?
  • 感谢 Intellisense,我找到了 DistinctBy。
  • 没有DistinctBy 方法。 stackoverflow.com/questions/520030/…
  • 感觉它来自MoreLinq/我创造了它。我的错。
【解决方案3】:

我找到了另一种使用 XSLT 解决此问题的方法。

<xsl:template match="SchoolID">
<xsl:if test="not(node()) or not(preceding-sibling::node()[.=string(current())])">
<SchoolID>
   <xsl:value-of select="SchoolID"/>
</SchoolID>
</xsl:if>   
</xsl:template>

此代码不包括排序。

谢谢。

DY

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多