У меня есть приложение, в котором мне нужно пройти через кучу xml-файлов и собрать их связи ссылок в xml-файле.Приведенный ниже код отлично работает и выполняет только то, что должен, но я получил резкое предупреждение о возможном перечислении, и хотя я не могу придумать другого способа сделать это, код действительно пахнет для меня.
В двух словах вот что я делаю:
- Я собрал список всех файлов в каталоге в XML-файле (mapdoc).Затем идут все циклы:
- Для каждого файла в списке я получаю все ссылки hrefs из каждого файла.
- Для каждого из этих hrefs я снова перебираю список файлов в mapdoc (снова циклически перебирая xFiles, но с помощью оператора Linq это то, о чем предупреждал resharper)
- для каждого из связанных файлов, я получаю идентификатор файла и добавляю элемент с атрибутом id, соответствующимid связанного файла.
Это звучит очень сложно даже для меня, когда я пытаюсь это объяснить.Но это работает.Я просто хочу знать, упускаю ли я какой-то очевидный способ сделать это более элегантно и, возможно, более эффективно.Это не столько проблема с производительностью, сколько обычно требуется всего лишь доли секунды для завершения всех циклов, но для лучшего кода и простоты.
Вот часть кода, о которой идет речь:
List<XElement> xFiles =
(from descendant in mapdoc.Element("mapdoc").Descendants()
select descendant).ToList();
foreach (var xFile in xFiles)
{
//Only check links in xml docs.
List<string> extensions = new List<string> { ".dita", ".ditamap", ".xml" };
string extension = Path.GetExtension(xFile.Attribute("path").Value);
if (extensions.Contains(extension))
{
var hrefs = GetHrefs(xFile);
foreach (var href in hrefs)
{
var linkedToFiles = xFiles.Where(
file => file.Attribute("path").Value == href);
foreach (var linkedToFile in linkedToFiles)
xFile.Add(new XElement("link",
new XAttribute("id",
linkedToFile.Attribute("id").Value)));
}
}
}