В ваших циклах for храните список в переменной вместо доступа к свойству Count.
для (int i = 0, idCount = ids.Count; i ++)
{
}
Хранить идентификаторы [i] в локальной переменной вместо того, чтобы искать их в коллекции более одного раза.
- Самым большим изменением было бы избегание вложенных циклов. Подумайте о переписывании.
Редактировать: внесены следующие изменения.
private const string _pathToXml = @"C:\test.xml";
private static readonly List<object> _duplicateLeafs = new List<object>();
private static void Main()
{
var xml = ReadXml();
var elements = xml.Descendants();
FindDupes(elements);
}
private static void FindDupes(IEnumerable<XElement> elements)
{
foreach (var element in elements)
{
var subElements = element.Descendants();
var subElementsWithIds = subElements.Where(x => x.Attribute("Id") != null).ToList();
var ids = subElementsWithIds.Select(x => x.Attribute("Id")).ToList();
var duplicates = ids.GroupBy(s => s.Value).SelectMany(grp => grp.Skip(1)).Distinct().ToList();
if (duplicates != null)
{
_duplicateLeafs.AddRange(duplicates);
}
FindDupes(subElements);
}
}
Использование следующего XML-файла:
<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person Id="1">
<name>Michael</name>
<age>29</age>
</person>
<person Id="1">
<name>Rebecca</name>
<age>29</age>
</person>
<person Id="2">
<name>Matthew</name>
<age>29</age>
</person>
<person Id="2">
<name>Paul</name>
<age>29</age>
</person>
</persons>
После тестирования вашей последней версии и кода, который я предоставил, при загрузке файла 16 МБ вот время:
Time: 2.8704708 seconds Lambda solution
Time: 692.043006 seconds Nested for loops