如何以更快的方式从xml中删除重复项

时间:2011-10-14 13:16:02

标签: c# xml

假设我们有像

这样的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中删除重复值。可以根据顶部和左侧属性进行过滤,而重复次数不固定。

3 个答案:

答案 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();
        }
    }