Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 嵌套循环选择定义的最小值asp.net_Asp.net Core_Nested Loops - Fatal编程技术网

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

Asp.net core 嵌套循环选择定义的最小值asp.net,asp.net-core,nested-loops,Asp.net Core,Nested Loops,我有一个状态列表,定义为按最小到最大顺序排列。顺序如下: 取消-完成-草稿-预订-保留-订购-确认 因此,取消是最小状态,确认是最大状态。我可能有不同状态的不同实例,因此我使用for each循环遍历所有状态,并选择循环中存在的最小状态 也就是说:如果列表中有状态[完成、保留、草稿、排序],我需要检查所有值并选择完成-因为它似乎是最小状态。或 如果我有[预订、确认、订购、草稿、取消、确认、确认],我需要选择取消的值,因为它似乎是最小值 我正在进行以下检查,但它似乎不起作用: st

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

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

因此,取消是最小状态,确认是最大状态。我可能有不同状态的不同实例,因此我使用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
语句的流程是极其困难的

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

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是一个字符串值,列表需要一个枚举状态值。是否首先正确地将字符串解析为枚举?