如何避免进入C#中的缓存块并返回循环迭代?

时间:2018-12-13 13:32:33

标签: c# for-loop

这是我的代码

     public List<Union100> Get(String IdType)
     {
        try
        {
            for (var i = 0; i <= 3; i++)
            {
                var typeIdOfObjectType = db.Objects.Where(x => x.ObjectsName == 
                        ObjectTypeName).Select(x => x.ObjectTgId).First();
                var d = GetParent();
            }
        }
        catch (exception e)
        {
        }
     }

假设我在第1次迭代的typeIdOfObjectType变量中为null,因此它应该返回for循环而不是去缓存块  它应该继续i = 2迭代 我该怎么办?

3 个答案:

答案 0 :(得分:2)

将“ First()”替换为FirstOrDefault(),代码将返回NULL且不会引发异常。

这里:

var `typeIdOfObjectType` = 
        db.Objects
            .Where(x => x.ObjectsName == ObjectTypeName)
            .Select(x => x.ObjectTgId)
            .FirstOrDefault();

答案 1 :(得分:1)

首先,您可以使用FirstOrDefault();代替First();

然后,您可以在块内使用try/catch。这样,如果发生异常,循环就不会停止。

例如:

 public List<Union100> Get(String IdType)
 {
     for (var i = 0;i <= 3; i++)
     {
         try
         {
             var typeIdOfObjectType = db.Objects.Where(x => x.ObjectsName == ObjectTypeName).Select(x => x.ObjectTgId).FirstOrDefault();
             var d = GetParent();
         }
         catch{}
     }
 }

答案 2 :(得分:1)

在执行查询的行中,有多个调用,其中一些依赖于它们返回内容之前的调用。如果其中任何一个返回null,则将引发异常。

使用null传播语法可以帮助您避免这种情况:

for (var i = 0;i <= 3; i++)
{
    var typeIdOfObjectType = 
                    db? // If db is null, then typeIdOfObjectType will be null
                      .Objects? // The same if .Objects is null
                      .Where(x => x.ObjectsName == ObjectTypeName)
                      .Select(x => x.ObjectTgId)
                      .First();

    if(typeIdOfObjectType == null)
    {
        continue; // Jump to the next iteration
    }

    // (Anything below here will be skipped for any iteration
    // where typeIdOfObjectType was null) 
}

这将在调用db和其他值之前检查db.ObjectsWhere(..)的值,并且如果其中一个为NULL,则将其设置作为变量的值,则可以避免某些例外情况。

另一个null引用来源。如果Where(..)条款未找到任何内容,则可能是一个例外;如果是这样,.First()调用将引发异常。因此,您应该将其替换为FirstOrDefault(),它将返回null

最后,我要添加一个检查以查看typeIdOfObjectType是否为null,如果是,则调用continue,这将跳过循环中剩余的任何逻辑,并跳转到嵌套迭代。