为什么i ++"无法访问代码"?

时间:2014-03-22 03:24:08

标签: c# loops visual-studio

修改

我把它留在这里,即使它让我看起来很愚蠢,因为它是一个微妙的错误,如果你在深夜工作而不注意,可能会咬你。感谢Visual Studio提供这样一个智能解析器。

基本上我错过了我有嵌套循环,所以continue语句在这里基本上没用,因为它继续foreach循环,而不是for循环。

原始问题

我在工作簿上运行搜索,查找符合所有字符串搜索条件的工作表。在Visual Studio编辑器中,i++被加下划线为"无法访问的代码"。

/// <summary>
/// Finds the first sheet that has cells that match all the criteria.
/// </summary>
/// <param name="wb"></param>
/// <param name="searches"></param>
/// <returns></returns>
public static ISheet FindSheet( this IWorkbook wb, params string[] searches )
{
    if( null == wb || null == searches )
        return null;

    for( int i = 0; i < wb.NumberOfSheets; i++ )
    {
        var sheet = wb.GetSheetAt( i );
        foreach( var search in searches )
        {
            var cell = sheet.FindCell( search );
            if( null == cell )
                continue;
        }

        return sheet;
    }

    return null;
}

我认为continue语句在这里有明确的含义:&#34;如果任何搜索条件返回null单元格,则继续下一次迭代。否则,只需返回此迭代中找到的工作表。&#34;

没有持续声明的更正代码

/// <summary>
/// Finds the first sheet that has cells that match all the criteria.
/// </summary>
/// <param name="wb"></param>
/// <param name="searches"></param>
/// <returns></returns>
public static ISheet FindSheet( this IWorkbook wb, params string[] searches )
{
    if( null == wb || null == searches )
        return null;

    for( int i = 0; i < wb.NumberOfSheets; i++ )
    {
        var sheet = wb.GetSheetAt( i );
        if( searches.All( s => null != sheet.FindCell( s ) ) )
            return sheet;
    }

    return null;
}

2 个答案:

答案 0 :(得分:5)

在这里,你的for循环完全没用。在第一次迭代之后,无论如何都会返回。确定你的foreach循环有一个continue语句,但这仅适用于foreach循环。这就是您的代码无法访问的原因。

因此,仅分析第一张纸。如果这是你想要的,你可以简单地删除for循环并将索引0处的工作表作为目标,或者你需要重新安排你的循环。

答案 1 :(得分:3)

Eric Lippert有an SO answera blog post关于当您想要在内循环中继续外循环时可以执行的操作。

他标记为&#34;令人敬畏的技术&#34;是在可能的情况下摆脱所有循环,事实上我相信这是可能的:

public static ISheet FindSheet( this IWorkbook wb, params string[] searches )
{
    if( null == wb || null == searches ) { return null; }

    return wb.FirstOrDefault(sh => searches.All(sr => sh.FindCell(sr) != null));
}