我有一個XML文件,爲9MB大。顯然,它被打破了。這個微小的c#函數的任何優化技巧?
我要檢查,如果在任意級別2兄弟元素有一個屬性「身份證」具有相同的值。
目前它去太慢。我可以對此代碼進行哪些優化?
編輯,包括一些提示
namespace ConsoleApplication1{
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Xml.Linq;
internal class Program{
private const string [email protected]"C:\4\4";
private static readonly List<object> _duplicateLeafs=new List<object>();
private static void Main(){
var xml=ReadXml();
var elements=xml.Descendants();
foreach(var element in elements)
FindDupes(element);
Console.ReadLine();
Debugger.Break();
}
private static XDocument ReadXml(){
return XDocument.Parse(File.ReadAllText(_pathToXml));
}
private static void FindDupes(XElement element){
var elements=element.Descendants();
var elementsWithIds=elements.Where(x=>x.Attribute("Id")!=null);
var ids=elementsWithIds.Select(x=>x.Attribute("Id")).ToList();
for(var i=0;i<ids.Count;i++)
for(var j=i+1;j<ids.Count;j++)
if(i!=j&&ids[i]==ids[j])
_duplicateLeafs.Add(elementsWithIds.First(x=>x.Attribute("Id")==ids[i]));
foreach(var subElement in elements)
FindDupes(subElement);
}
}
}
使用XmlReader並按順序處理它,而不是完整地解析它以便開始(這就是XDocument.Parse所做的) – 2012-03-18 23:39:31
對於非常大的XML文件,我會使用[XmlReader]('http:// msdn。 microsoft.com/en-us/library/system.xml.xmlreader%28v = vs.100%29.aspx')而不是'XDocument'。 – Vlad 2012-03-18 23:40:50
你可以做int j = i + 1而不是從0開始 – 2012-03-18 23:42:44