Advertisement
Guest User

XDocComparer

a guest
Mar 31st, 2013
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.87 KB | None | 0 0
  1.  public sealed class XDocComparer:IEqualityComparer<XDocument>
  2.     {
  3.  
  4.         private bool ElementsEqual(XElement elem1,XElement elem2)
  5.         {
  6.             Func<string, string, bool> equals =
  7.                 (s1, s2) => string.Equals(s1, s2, StringComparison.InvariantCultureIgnoreCase);
  8.             if (elem1.Name != elem2.Name)
  9.                 return false;
  10.  
  11.             var attrs1 = elem1.Attributes().Where(k=>!k.IsNamespaceDeclaration);
  12.             var attrs2 = elem2.Attributes().Where(k => !k.IsNamespaceDeclaration);
  13.             if (attrs1.Count() != attrs2.Count())
  14.                 return false;
  15.  
  16.             var equalities =
  17.               attrs1.OrderBy(k => k.Name.LocalName)
  18.                     .Zip(attrs2.OrderBy(k => k.Name.LocalName),
  19.                         (a, b) => equals(a.Name.LocalName, b.Name.LocalName)
  20.                                && equals(a.Value, b.Value));
  21.             return equalities.All(k => k);
  22.         }
  23.  
  24.         private bool ElementsContentEqual(XElement elem1, XElement elem2)
  25.         {
  26.             var ec1 = elem1.Elements();
  27.             var ec2 = elem2.Elements();
  28.             if (ec1.Count() != ec2.Count())
  29.                 return false;
  30.  
  31.             foreach (var xElement in ec1)
  32.             {
  33.                 var xEl2 = ec2.FirstOrDefault(k => ElementsEqual(xElement, k));
  34.                 if (xEl2 == null)
  35.                     return false;
  36.                 if (!ElementsContentEqual(xElement, xEl2))
  37.                     return false;
  38.             }
  39.  
  40.             return true;
  41.         }
  42.  
  43.         public bool Equals(XDocument x, XDocument y)
  44.         {
  45.             if (!ElementsEqual(x.Root, y.Root))
  46.                 return false;
  47.  
  48.             return ElementsContentEqual(x.Root, y.Root);
  49.         }
  50.  
  51.         public int GetHashCode(XDocument obj)
  52.         {
  53.             throw new NotImplementedException();
  54.         }
  55.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement