C# IF statement

本文关键字:statement IF | 更新日期: 2023-09-27 18:20:10

        for (int k = 0; k < proc.Count; k++){
            for (int i = k + 1; i < proc.Count; i++){
                if (proc[k].arrivalTime >= proc[i].arrivalTime && proc[k].priority >= proc[i].priority && proc[k].brust > proc[i].brust){ 
                    temp = proc[i];
                    proc[i] = proc[k];
                    proc[k] = temp;
                }
            }
        }

输入

Process Arrival Brust Priority P0 0 10 5 P1 1 3 1 P2 1 2 1 P3 5 1 5 P4 5 8 2

我想按照这些规则对这些流程进行排序1(如果过程单独到达,无论如何它都会起作用。2(如果两个进程同时到达,我们将检查优先级,如果第一个具有更高的优先级(较低的数字(,它将首先工作,如果它们具有相同的优先级,我们将让具有较低Brust的那个首先工作。

最后 2 个进程有问题,问题出在哪里?

P3    5    1     5
P4    5    8     2

进程 4 应该工作,因为它具有更高的优先级

C# IF statement

与其冒泡排序(这是对集合进行排序的最无效的方法之一(,不如使用 LINQ 的 OrderBy() 对集合进行排序,例如

var sorted = proc.OrderBy(x => x.arrivalTime)
                 .ThenBy(x => x.priority)
                 .ThenBy(x => x.brust)
                 .ToList(); // or .ToArray() or whatever collection you need

你对规则提供了非常清晰的解释。

现在检查此行

if (proc[k].arrivalTime >= proc[i].arrivalTime && proc[k].priority >= proc[i].priority && proc[k].brust > proc[i].brust)

它是否按照规则说的去做?绝对没有。规则的直接翻译将是这样的

if (proc[k].arrivalTime > proc[i].arrivalTime ||
   (proc[k].arrivalTime == proc[i].arrivalTime &&
   (proc[k].priority > proc[i].priority ||
   (proc[k].priority == proc[i].priority && proc[k].brust > proc[i].brust))))

更好,更具可读性将是

int compare = proc[k].arrivalTime.CompareTo(proc[i].arrivalTime);
if (compare == 0)
    compare = proc[k].priority.CompareTo(proc[i].priority);
if (compare == 0)
    compare = proc[k].brust.CompareTo(proc[i].brust);
if (compare > 0)
{
    // ...
}

这是进行多键比较的标准方法。

Mahmoud,你的 if 语句是不正确的,因为如果满足所有条件,它将计算为 true,你的语句应该级联条件。

        for (int k = 0; k < proc.Count; k++){
        for (int i = k + 1; i < proc.Count; i++){
            bool doSwap = false;
            if (proc[k].arrivalTime > proc[i].arrivalTime)
            {
                 doSwap = true;
            }
            else if (proc[k].arrivalTime == proc[i].arrivalTime)
            {
                if(proc[k].priority > proc[i].priority)
                {
                      doSwap = true;
                }
                else if (proc[k].priority == proc[i].priority )
                {
                     if(proc[k].brust > proc[i].brust)
                     {
                           doSwap = true;
                     }
                }
            }
            if(doSwap)
            {
                temp = proc[i];
                proc[i] = proc[k];
                proc[k] = temp;
            }
        }
    }