【发布时间】:2010-01-08 13:32:13
【问题描述】:
以下代码比较两个 XML 文本并返回它们之间的数据变化的集合。
此代码运行良好,但需要尽可能资源友好。
在 LINQ 中是否有更快的方法来执行此操作,例如不创建两个 XElement 集合并比较它们的每个字段的差异?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
namespace TestXmlDiff8822
{
class Program
{
static void Main(string[] args)
{
XDocument xdoc1 = XDocument.Parse(GetXml1());
XDocument xdoc2 = XDocument.Parse(GetXml2());
List<HistoryFieldChange> hfcList = GetHistoryFieldChanges(xdoc1, xdoc2);
foreach (var hfc in hfcList)
{
Console.WriteLine("{0}: from {1} to {2}", hfc.FieldName, hfc.ValueBefore, hfc.ValueAfter);
}
Console.ReadLine();
}
static public List<HistoryFieldChange> GetHistoryFieldChanges(XDocument xdoc1, XDocument xdoc2)
{
List<HistoryFieldChange> hfcList = new List<HistoryFieldChange>();
var elements1 = from e in xdoc1.Root.Elements()
select e;
var elements2 = from e in xdoc2.Root.Elements()
select e;
for (int i = 0; i < elements1.Count(); i++)
{
XElement element1 = elements1.ElementAt(i);
XElement element2 = elements2.ElementAt(i);
if (element1.Value != element2.Value)
{
HistoryFieldChange hfc = new HistoryFieldChange();
hfc.EntityName = xdoc1.Root.Name.ToString();
hfc.FieldName = element1.Name.ToString();
hfc.KindOfChange = "fieldDataChange";
hfc.ObjectReference = (xdoc1.Descendants("Id").FirstOrDefault()).Value;
hfc.ValueBefore = element1.Value;
hfc.ValueAfter = element2.Value;
hfcList.Add(hfc);
}
}
return hfcList;
}
public static string GetXml1()
{
return @"
<Customer>
<Id>111</Id>
<FirstName>Sue</FirstName>
<LastName>Smith</LastName>
</Customer>
";
}
public static string GetXml2()
{
return @"
<Customer>
<Id>111</Id>
<FirstName>Sue2</FirstName>
<LastName>Smith-Thompson</LastName>
</Customer>
";
}
}
public class HistoryFieldChange
{
public string EntityName { get; set; }
public string FieldName { get; set; }
public string ObjectReference { get; set; }
public string KindOfChange { get; set; }
public string ValueBefore { get; set; }
public string ValueAfter { get; set; }
}
}
【问题讨论】:
-
这两个文件根本没有改变(相同)是否很常见?或者那是一种罕见的情况?
-
理论上总会有一些变化,因为它们是更新对象的序列化,这是一种报告字段随时间变化的方法
标签: c# xml linq performance