2015-05-04 2 views
2

Я пытаюсь выполнить алгоритм, который добавляет ProcTime к максимальному из двух других максимальных значений (JobNumMax и WSMax). У меня возникают проблемы с использованием FindLastIndex и FindLast в моих циклах. Вот мой код.Поиск списка по LastIndex в цикле.

public class JobListOrder 
     { 
      public int JobNum { get; set; } 
      public string Workstation { get; set; } 
      public int Sequence { get; set; } 
      public int ProcTime { get; set; } 
      public int EndHour { get; set; } 
      public DateTime DueDate { get; set; } 
      public int Priority { get; set; } 
     } 

Ввод в список.

//New List 
      List<JobListOrder> list = new List<JobListOrder>(); 
      using (StreamReader sr = new StreamReader("C:\\Users\\Nathan\\Documents\\Visual Studio 2013\\Projects\\PubsExample\\PubsExample\\JobsList.txt")) 
      { 
       //Add .txt to List 
       while (sr.Peek() >= 0) 
       { 
        string str; 
        string [] strArray; 
        str = sr.ReadLine(); 

        strArray = str.Split(','); 
        JobListOrder currentjob = new JobListOrder(); 
        currentjob.JobNum = int.Parse(strArray[0]); 
        currentjob.Workstation = strArray[1]; 
        currentjob.Sequence = int.Parse(strArray[2]); 
        currentjob.ProcTime = int.Parse(strArray[3]); 
        currentjob.EndHour = int.Parse(strArray[4]); 
        currentjob.DueDate = DateTime.Parse(strArray[5]); 
        currentjob.Priority = int.Parse(strArray[6]); 
        list.Add(currentjob); 

       } 

Сортировка в частности способ начать расчеты

//Job Sort 
       var ListSort = from jobsort in list 
           orderby jobsort.Sequence ascending, jobsort.Priority descending, jobsort.DueDate ascending, jobsort.JobNum ascending 
           select jobsort; 
       List<JobListOrder> SortList = new List<JobListOrder>(ListSort); 

Вот небольшая попытка у него

//foreach (var i in SortList) 
       //{ 
       // if (JobNumMax >= WSMax) 
       // { 
       //  return i.EndHour = JobNumMax + i.ProcTime; 
       // } 
       // else 
       //  return i.EndHour = WSMax + currentjob.ProcTime; 
       // for (var j = 0; j < SortList.Count; j++) 
       // { 
       //  int JobLNumMaxIndex = SortList.FindLastIndex(i.JobNum) 
       //  int JobNumMax = i.EndHour[JobNumMaxIndex]; 
       //  for (var k = 0; k < SortList.Count; k++) 
       //  { 
       //   int WSMaxIndex = SortList.FindLastIndex(i.Workstation); 
       //   int WSMax = i.EndHour[JobNumMaxIndex]; 

       //  } 
       // } 

       //} 

Я пытаюсь найти LastIndex для запроса и возвращает значение этого конкретного индекса. Я попытаюсь объяснить, что я имею в виду в коде ниже поиске JobNum = 1 и рабочая станция = Фрезерование с ProcTime 1

  foreach (var i in SortList) //Iterate through SortList 
      { 
       if (JobNumMax (3) >= WSMax (4)) 
       { 
        return i.EndHour = JobNumMax (3) + i.ProcTime (1); //assigns calculation to EndHour of current record 
       } 
       else 
        return i.EndHour = WSMax (4) + i.ProcTime (1); 
       for (var j = 0; j < SortList.Count; j++) 
       { 
        int JobLNumMaxIndex = SortList.FindLastIndex(1) //Finds last record with JobNum = 1 
        int JobNumMax = i.EndHour[JobNumMaxIndex];//Return what EndHour is at the index from JobNumMaxIndex search// Lets say 3 
        for (var k = 0; k < SortList.Count; k++) 
        { 
         int WSMaxIndex = SortList.FindLastIndex(Milling);//Finds last record with Workstation = Milling 
         int WSMax = i.EndHour[JobNumMaxIndex];//Return what EndHour is at the index from WSMaxIndex search// Lets say 4 

        } 
       } 

      } 

Результат будет 4 + 1 = 5.

Я имею проблема с синтаксисом алгоритма. Я не могу заставить FindLast работать вообще.

ответ

1

Похоже, что у вас могут возникнуть проблемы с синтаксисом LINQ.

FindLastIndex принимает в качестве аргумента Predicate<JobListOrder>, то есть функцию, которая принимает JobListOrder в качестве входных данных, возвращает true или false.

Таким образом, вместо SortList.FindLastIndex(i.JobNum) вероятно, вы должны иметь что-то вроде:

SortList.FindLastIndex(order => order.JobNum == i.JobNum); 

скорректированных в коде:

int JobNumMax = 0; 
int WSMax 0; 

foreach (var i in SortList) 
{ 
    if (JobNumMax >= WSMax) 
    { 
     return i.EndHour = JobNumMax + i.ProcTime; 
    } 
    else if (JobNumMax > 0 && WSMax > 0) 
    { 
     return i.EndHour = WSMax + currentjob.ProcTime; 
    } 

    for (var j = 0; j < SortList.Count; j++) 
    { 
     int JobLNumMaxIndex = SortList.FindLastIndex(order => order.JobNum == i.JobNum); 
     JobNumMax = i.EndHour[JobNumMaxIndex]; 

     for (var k = 0; k < SortList.Count; k++) 
     { 
      int WSMaxIndex = SortList.FindLastIndex(order => order.Workstation == i.Workstation); 
      WSMax = i.EndHour[JobNumMaxIndex]; 
     } 
    } 
} 
+0

Высокого. Это сработало для этих проблем FindLastIndex. Наверное, у меня другая проблема. В int JobNumMax = i.EndHour [JobNumMaxIndex]; он говорит, что применять индексирование с [] к выражению типа 'int'. Я могу что-то контролировать, но он также не распознает JobNumMax или WSMax в текущем контексте в инструкции If/else. – nbaylot46

+0

Я внес изменения в код, чтобы переместить объявления за пределы цикла - так как ранее они были привязаны только к внутренним контурам. Я немного смущен тем, почему вы используете цикл, хотя он только когда-либо собирается зацикливаться один раз, а затем возвращается из-за первого оператора if. Если вы отредактируете свой вопрос, чтобы показать некоторые входы образца и нужный результат из функции, это может быть легче помочь. – RagtimeWilly