嵌套循环选择定义的最小值asp.net



我有一个状态列表,定义为按最小到最大顺序排列。序列如下:

已取消-已完成-草稿-预订-已预订-已订购-已确认

所以取消是最小状态,确认是最大状态。我可能有不同状态的不同实例,所以我使用for each循环来运行所有状态,并选择循环中存在的最小状态。

也就是说:如果在列表中我有状态[完整、保留、草稿、已排序],我需要检查所有值并选择完整,因为这似乎是最小状态。或如果我已经[预订、确认、订购、起草、取消、确认、确认],我需要选择取消的值,因为它似乎是最小值。

我正在进行以下检查,但似乎不起作用:

string globstatus = " ";
foreach (var currentstatus in list)
{
if (currentstatus == "cancelled")
{
globstatus = "cancelled";
}
else
{
if (globstatus == "cancelled")
{
return globstatus;
}
else
{
if (currentstatus == "complete")
{
globstatus = "complete";
}
else
{
if (globstatus == "complete")
{
return globstatus;
}
else
{
if (currentstatus == "draft")
{
globstatus = "draft";
}
else
{
if (globstatus == "reservation")
{
return globstatus;
}
else
{
if (currentstatus == "reserved")
{
globstatus = "reserved";
}
else
{
if (globstatus == "ordered")
{
return globstatus;
}
else
{
if (currentstatus == "confirmed")
{
globstatus = "confirmed";
}
else
{
return currentstatus;
}
}
}
}
}
}
}
}
}
}
return globstatus;

实现所需行为的最佳解决方案是什么?

我发现一条经验法则很有用,如果我需要三个以上级别的大括号,我需要重新思考我的代码。它很难遵循,很容易出错,而且是调试的噩梦。我建议这在这里适用——试图遵循所有嵌套的if..else语句的流程是非常困难的。

使用枚举

我的首选解决方案是使用Enum来实现这一点,例如:

var list = new List<Status>
{
Status.Complete,
Status.Draft,
Status.Draft,
Status.Confirmed
};
var minStatus = (Status)list.Select(l => (int)l).Min();
// minStatus = Status.Complete
public enum Status
{
Cancelled,
Complete,
Draft,
Reservation,
Reserved,
Ordered,
Confirmed
}

工作原理:默认情况下,枚举为每个值提供一个从零开始的整数,即Cancelled = 0Complete = 1等。如果愿意,您可以用自己的值覆盖它(例如,如果要组合多个值,则为1/2/4/8/16(。

我建议使用Enum类型,而不是字符串。它有助于避免拼写错误,让其他查看您代码的人清楚地了解您的程序是如何工作的及其流程,并以简单字符串所不具备的方式表示层次结构。(例如,"complete"是出现在"draft"之前还是之后?如果没有上下文,我想大多数人会在之后说,但在这种情况下,它出现在之前-这在使用Enum时要明显得多。(

将字符串解析为枚举

但是,如果状态必须是字符串,则可以将它们解析为类似这样的枚举:

var stringList = new List<string>
{
"complete",
"draft",
"draft",
"confirmed",
"this will be ignored"
};
var statusList = new List<int>();
foreach (var str in stringList)
{
if(Enum.TryParse(typeof(Status), str, ignoreCase: true, out object? parsed) && parsed is Status status)
{
statusList.Add((int)status);
}
}
var minStatus = (Status)statusList.Min();
// minStatus = Status.Complete

然而,如果可以首先重构代码以使用Enum,那将是一个更好的解决方案,而且速度更快,因为解析字符串有一个很好的避免开销的方法。

最新更新