假设我们有像
这样的xml <texts>
<text top="9" style="font-family:Helvetica;font-size:7;" left="671">Page:</text>
<text top="9" style="font-family:Helvetica;font-size:7;" left="671">Page:</text>
<text top="9" style="font-family:Helvetica;font-size:7;" left="671">Page:</text>
<text top="9" style="font-family:Helvetica;font-size:7;" left="671">Page:</text>
<text top="9" style="font-family:Helvetica;font-size:7;" left="720">1</text>
<text top="9" style="font-family:Helvetica;font-size:7;" left="720">1</text>
<text top="9" style="font-family:Helvetica;font-size:7;" left="720">1</text>
<text top="9" style="font-family:Helvetica;font-size:7;" left="720">1</text>
</texts>
如何以更快的方式从xml中删除重复值。可以根据顶部和左侧属性进行过滤,而重复次数不固定。
答案 0 :(得分:0)
使用Linq-XML
解析XML并创建列表。遍历list
并删除不需要的(双重)元素。
答案 1 :(得分:0)
你所做的很可能是foreach的foreach。 - &GT;表示O(n ^ 2)
你可以做的是散列每一行并将散列值添加到字典中。如果您散列字典中已存在的值,您知道您有重复,并且您不添加它。
应该是O(n + log(n))哪个更好(我假设字典访问的O(log(n))
答案 2 :(得分:0)
最快的方法是使用Linq Distinct
方法,该方法在内部使用HashSet
来比较每个值。您必须像这样编写自定义IEqualityComparer
。
XElement textsElement = ...;
var newTextsElement = new XElement("texts", texts.Elements().Distinct(new TextElementEqualityComparer()));
private class TextElementEqualityComparer : IEqualityComparer<XElement>
{
public bool Equals(XElement x, XElement y)
{
return x.Attribute("top").Value == y.Attribute("top").Value
&& x.Attribute("left").Value == y.Attribute("left").Value;
}
public int GetHashCode(XElement obj)
{
return obj.Attribute("top").Value.GetHashCode() ^ obj.Attribute("left").Value.GetHashCode();
}
}