Asp.net core 嵌套循环选择定义的最小值asp.net
我有一个状态列表,定义为按最小到最大顺序排列。顺序如下: 取消-完成-草稿-预订-保留-订购-确认 因此,取消是最小状态,确认是最大状态。我可能有不同状态的不同实例,因此我使用for each循环遍历所有状态,并选择循环中存在的最小状态 也就是说:如果列表中有状态[完成、保留、草稿、排序],我需要检查所有值并选择完成-因为它似乎是最小状态。或 如果我有[预订、确认、订购、草稿、取消、确认、确认],我需要选择取消的值,因为它似乎是最小值 我正在进行以下检查,但它似乎不起作用:Asp.net core 嵌套循环选择定义的最小值asp.net,asp.net-core,nested-loops,Asp.net Core,Nested Loops,我有一个状态列表,定义为按最小到最大顺序排列。顺序如下: 取消-完成-草稿-预订-保留-订购-确认 因此,取消是最小状态,确认是最大状态。我可能有不同状态的不同实例,因此我使用for each循环遍历所有状态,并选择循环中存在的最小状态 也就是说:如果列表中有状态[完成、保留、草稿、排序],我需要检查所有值并选择完成-因为它似乎是最小状态。或 如果我有[预订、确认、订购、草稿、取消、确认、确认],我需要选择取消的值,因为它似乎是最小值 我正在进行以下检查,但它似乎不起作用: st
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=新列表
{
状态。完成,
现状草案,
现状草案,
状态。已确认
};
var minStatus=(Status)list.Select(l=>(int)l.Min();
//minStatus=状态。完成
公共枚举状态
{
取消,
完成
草案,
预订,
含蓄的,
命令,
证实
}
工作原理:默认情况下,枚举为每个值提供一个基于零的整数,即Cancelled=0
,Complete=1
等等。如果愿意,您可以使用自己的值覆盖该值(例如,如果要组合多个值,请使用1/2/4/8/16)
我建议使用Enum
类型,而不是字符串。它有助于避免拼写错误,让其他人在查看您的代码时清楚地了解您的程序如何工作及其流程,并以简单字符串所不具备的方式表示层次结构。(例如,“complete”是在“draft”之前还是之后?如果没有上下文,我想大多数人会说是在之后,但在本例中是在之前,这在使用枚举时更为明显。)
将字符串解析为枚举
但是,如果状态必须是字符串,则可以将其解析为如下所示的枚举:
var stringList=新列表
{
“完成”,
“草案”,
“草案”,
“确认”,
“这将被忽略”
};
var statusList=新列表();
foreach(stringList中的var str)
{
if(Enum.TryParse(typeof(Status)、str、ignoreCase:true、out object?已解析)&&parsed为状态)
{
状态列表。添加((int)状态);
}
}
var minStatus=(Status)statusList.Min();
//minStatus=状态。完成
但是,如果可以首先重构代码以使用枚举,那么这将是一个更好的解决方案,而且会更快,因为解析字符串会产生开销,这是可以避免的。
currststatus
?你是说currentstatus
对吗?@SirStopIt是的,很抱歉我打错了。谢谢你的更正。非常感谢。我使用解析字符串枚举来解决这个问题。foreach(Model.Sessions中的var st){list.Add(st.State);}--我得到一个错误-无法将字符串转换为状态。听起来好像st.State是一个字符串值,列表需要一个枚举状态值。是否首先正确地将字符串解析为枚举?