Сортировать взаимозависимый список вакансий - PullRequest
0 голосов
/ 25 октября 2018

Я хочу отсортировать список взаимозависимых заданий.

  • Для задания (возможно) потребуется несколько входных файлов.
  • Задание создает один выходной файл.

В списке (ObservableCollection) заданий для некоторых заданий требуется выполнение других заданий перед их запуском (им нужен выводс некоторых других работ).

Теперь я хочу упорядочить случайный список заданий, чтобы задания выполнялись в правильном порядке.В приведенном ниже коде я изо всех сил стараюсь дать короткую версию кода и пару готовых заданий.

SearchNewPos вводится 7 раз (в списке из 5 заданий), и это приводит к тому, что на один ход больше, чем оптимальное 5. Это не проблема для такого небольшого списка, но когда список увеличивается,число итераций также увеличивается больше, чем необходимо.

У кого-нибудь есть более умный способ сортировки?

namespace TestConsApp
{
  internal static class Program
  {
    private static void Main(string[] args)
    {          
      var work = new MyWork();
      work.ReorderJobs();

      Console.ReadLine();
    }
  }

  internal class MyWork
  {
    private ObservableCollection<Job> myJobs;

    private static int reorderSearces = 0;

    public void DoMyWork()
    {
      foreach (var j in myJobs)
      {
        j.DoWork();
      }
    }

    public MyWork()
    {
      myJobs = new ObservableCollection<Job>()
      {
        new Job()
          { OututFilename="output5", InputFilenames = new List<string>() {"output3","output4"} },
        new Job()
          { OututFilename="output4", InputFilenames = new List<string>() {"output2"} },
        new Job()
          { OututFilename="output3", InputFilenames = new List<string>() {"output1","input6"} },
        new Job()
          { OututFilename="output2", InputFilenames = new List<string>() {"input3","input4","input5"}},
        new Job()
          { OututFilename="output1", InputFilenames = new List<string>() {"input1","input2"}}
      };
    }

    public void ReorderJobs()
    {
      var newPos = 0;
      var oldPos = 0;
      while (SearchNewPos(ref newPos, ref oldPos))
      { myJobs.Move(oldPos, newPos);
        Console.WriteLine(string.Join(", ",myJobs.Select(j=>j.OututFilename).ToArray()));
      }
    }

    private bool SearchNewPos(ref int newPos, ref int oldPos)
    {
      Console.WriteLine("Reorder no. " + reorderSearces++);
      for (int iOldPos = myJobs.Count - 1; iOldPos >= 0; iOldPos--)
      {
        oldPos = iOldPos;
        for (int iNewPos = 0; iNewPos < iOldPos; iNewPos++)
        {
          if (myJobs[iNewPos].DoesJobUseFile(myJobs[iOldPos].OututFilename))
          {
            newPos = iNewPos;
            return true;
          }
        }
      }
      return false;
    }

  }

  internal class Job
  {

    public string OututFilename { get; set; }

    public List<string> InputFilenames { get; set; }

    public void DoWork()
    {
      ReadInput();
      Workout();
      WriteOutput();
    }

    private void Workout()
    {
      return;
    }

    private void ReadInput()
    {
      return;
    }

    private void WriteOutput()
    {
      return;
    }

    public bool DoesJobUseFile(string fileName)
    {
      return InputFilenames.Exists(s=>s.Equals(fileName));
    }

    public override string ToString()
    {
      return OututFilename;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...