У меня есть XML-файл размером 9 МБ. По-видимому, он сломан.Любые советы по оптимизации этой крошечной функции C#?
Я хочу проверить, есть ли на каком-либо уровне 2 родственных элемента атрибут «Id» с одинаковым значением.
В настоящее время идет слишком медленно. Какие оптимизации я могу сделать для этого кода?
Edited включить некоторые советы
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) –
Для действительно больших файлов XML я бы использовал [XmlReader] ('http: // msdn. microsoft.com/en-us/library/system.xml.xmlreader% 28v = vs.100% 29.aspx') вместо 'XDocument'. – Vlad
вы можете сделать int j = i + 1, а не начинать с 0 –