嵌套循环select最小定义值asp.net
Nested Loop select the minimum defined value asp.net
我有一个状态列表,定义为按最小到最大排序。顺序如下:
取消-完成-草稿-预订-保留-订购-确认
所以取消是最小状态,确认是最大状态。我可能有不同状态的不同实例,所以我使用 for-each 循环 运行 遍历所有状态,select 循环中存在的最小状态。
也就是说:如果在列表中我有状态 [complete, reserved, draft, ordered] 我需要检查所有值和 select complete - 因为它似乎是最小状态。要么
如果我有 [reserved, confirmed, ordered, draft, cancelled, confirmed, confirmed] 我需要 select 取消值,因为它似乎是最小值。
我正在进行以下检查,但它似乎不起作用:
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
语句的流程是非常困难的。
使用枚举
我的首选解决方案是使用枚举来实现此目的,例如:
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 = 0
、Complete = 1
等。如果你愿意,你可以用你自己的值覆盖它(例如,如果你想组合多个值,则为 1/2/4/8/16)。
我建议对此类内容使用 Enum
类型,而不是字符串。它有助于避免拼写错误,让查看您的代码的其他人清楚地了解您的程序如何工作及其流程,并以简单字符串所不具备的方式表示层次结构。 (例如 - 'complete' 是在 'draft' 之前还是之后?如果没有上下文,我想大多数人会说 在 之后,但在这种情况下它出现在 before - 这在使用枚举时更为明显。)
将字符串解析为枚举
但是,如果状态必须是字符串,您可以像这样将它们解析为枚举:
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
但是,如果可以重构您的代码以首先使用枚举,那将是一个更好的解决方案,并且速度更快,因为解析字符串的开销是可以避免的。
我有一个状态列表,定义为按最小到最大排序。顺序如下:
取消-完成-草稿-预订-保留-订购-确认
所以取消是最小状态,确认是最大状态。我可能有不同状态的不同实例,所以我使用 for-each 循环 运行 遍历所有状态,select 循环中存在的最小状态。
也就是说:如果在列表中我有状态 [complete, reserved, draft, ordered] 我需要检查所有值和 select complete - 因为它似乎是最小状态。要么 如果我有 [reserved, confirmed, ordered, draft, cancelled, confirmed, confirmed] 我需要 select 取消值,因为它似乎是最小值。
我正在进行以下检查,但它似乎不起作用:
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
语句的流程是非常困难的。
使用枚举
我的首选解决方案是使用枚举来实现此目的,例如:
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 = 0
、Complete = 1
等。如果你愿意,你可以用你自己的值覆盖它(例如,如果你想组合多个值,则为 1/2/4/8/16)。
我建议对此类内容使用 Enum
类型,而不是字符串。它有助于避免拼写错误,让查看您的代码的其他人清楚地了解您的程序如何工作及其流程,并以简单字符串所不具备的方式表示层次结构。 (例如 - 'complete' 是在 'draft' 之前还是之后?如果没有上下文,我想大多数人会说 在 之后,但在这种情况下它出现在 before - 这在使用枚举时更为明显。)
将字符串解析为枚举
但是,如果状态必须是字符串,您可以像这样将它们解析为枚举:
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
但是,如果可以重构您的代码以首先使用枚举,那将是一个更好的解决方案,并且速度更快,因为解析字符串的开销是可以避免的。