如何降低for...if循环中的圈复杂度#c#

How to reduce cyclomatic complexity in for...if loop in c#

我有一个简单的代码来打印 CSV 文件的行和列。这是我的代码,对于这个 class,圈复杂度是 6。我想将它降低到尽可能低的水平。

class PrintCSV
{
    /// <summary>
    /// Print all the rows of CSV File 
    /// </summary>
    /// <param name="lines"> </param>

    public static void PrintCSVRows(string[] lines)
    {

        foreach (string line in lines)
        {
            if (!string.IsNullOrEmpty(line) && line.Contains(','))
            {
                string columns = line.Split(',')[1];
                if (!string.IsNullOrEmpty(columns))
                {
                    PrintCSVCol(columns);
                }

            }
        }
    }

    /// <summary>
    /// Prints the column of CSV File
    /// </summary>
    /// <param name="columns"></param>

    public static void PrintCSVCol(string columns)
    {
        Console.WriteLine("{0}", columns);
    }

}

如何更改循环以降低整体圈复杂度?

这段代码做同样的事情:

public static void PrintCSVRows(string[] lines)
{
    foreach (var columns in lines
        .Where(x => !string.IsNullOrEmpty(x))
        .Select(x => x.Split(','))
        .Where(x => x.Length > 1 && !string.IsNullOrEmpty(x[1]))
        .ToArray())
    {
        PrintCSVCol(columns[1]);
    }
}

或者

public static void PrintCSVRows(string[] lines)
{
    foreach (var columns in lines
        .Where(x => !string.IsNullOrEmpty(x))
        .Select(x => x.Split(','))
        .Where(x => x.Length > 1)
        .Select(x => x.Skip(1).First())
        .Where(x => !string.IsNullOrEmpty(x)))
    {
        PrintCSVCol(columns);
    }
}

如果您的目标只是降低圈复杂度,您可以提取如下方法:

/// <summary>
/// Print all the rows of CSV File 
/// </summary>
/// <param name="lines"> </param>
public static void PrintCSVRows(string[] lines)
{
    foreach (string line in lines)
    {
        PrintLine(line);
    }
}

private static void PrintLine(string line)
{
    if (IsValidLine(line))
    {
        string columns = line.Split(',')[1];
        PrintCSVCol(columns);
    }
}

private static bool IsValidLine(string line)
{
    return !string.IsNullOrEmpty(line) && line.Contains(',');
}

/// <summary>
/// Prints the column of CSV File
/// </summary>
/// <param name="columns"></param>
public static void PrintCSVCol(string columns)
{
    if (!string.IsNullOrEmpty(columns))
    {
        Console.WriteLine("{0}", columns);
    }
}

使用此代码,根据 Visual Studio,每个方法的圈复杂度为 2。

但是,圈复杂度只是一个指标,并不一定意味着这段代码更好