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 应该工作,因为它具有更高的优先级
与其冒泡排序(这是对集合进行排序的最无效的方法之一(,不如使用 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;
}
}
}