Вложенные циклы foreach? - PullRequest
       8

Вложенные циклы foreach?

0 голосов
/ 09 августа 2011

У меня есть приложение, в котором мне нужно пройти через кучу xml-файлов и собрать их связи ссылок в xml-файле.Приведенный ниже код отлично работает и выполняет только то, что должен, но я получил резкое предупреждение о возможном перечислении, и хотя я не могу придумать другого способа сделать это, код действительно пахнет для меня.

В двух словах вот что я делаю:

  1. Я собрал список всех файлов в каталоге в XML-файле (mapdoc).Затем идут все циклы:
  2. Для каждого файла в списке я получаю все ссылки hrefs из каждого файла.
  3. Для каждого из этих hrefs я снова перебираю список файлов в mapdoc (снова циклически перебирая xFiles, но с помощью оператора Linq это то, о чем предупреждал resharper)
  4. для каждого из связанных файлов, я получаю идентификатор файла и добавляю элемент с атрибутом 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)));
        }
    }
}
...