-1

したがって、ATMはExcelドキュメントをプロジェクトにインポートします。次に、スプ​​レッドシートのいずれかの列が空の場合に適切なエラーメッセージを表示するためにifステートメントを使用しています。私のコードは機能していますが、きれいに見えません。エラーメッセージを表示するためにすべてのifステートメントをループにリファクタリングする方法はありますか?おそらくすべてをチェックする別のメソッドですか?checkIfColumnIsEmptyは、列が空の場合にtrueを返すboolメソッドです。

//if either column 0 and 1 are empty && column 2,3,4 and 5 are not
    if (!checkIfColumnisEmpty(r.ItemArray[0]) || !checkIfColumnisEmpty(r.ItemArray[1])
        && checkIfColumnisEmpty(r.ItemArray[2]) && checkIfColumnisEmpty(r.ItemArray[3])
         && checkIfColumnisEmpty(r.ItemArray[4]) && checkIfColumnisEmpty(r.ItemArray[5]))
    {
        if (checkIfColumnisEmpty(r.ItemArray[0]) && !checkIfColumnisEmpty(r.ItemArray[1]))
        {
            throw new ImportBOQException("Error importing document: First column is empty");
        }
        else if (!checkIfColumnisEmpty(r.ItemArray[0]) && checkIfColumnisEmpty(r.ItemArray[1]))
        {
            throw new ImportBOQException("Error importing document: Second column is empty");
        }

        else if (!checkIfColumnisEmpty(r.ItemArray[0]) && !checkIfColumnisEmpty(r.ItemArray[1]))
        {
            //all columns are valid so...
            Column0inSpreadsheet = r.ItemArray[0] as string;
            Column1inSpreadsheet = r.ItemArray[1] as string;

          //Other code which performs other operations, once the level as reached this far
        }
    }                                

    //if column 0 and 1 are NOT empty && Either column 2,3,4 or 5 is empty
    else if (checkIfColumnisEmpty(r.ItemArray[0]) && checkIfColumnisEmpty(r.ItemArray[1])
          || !checkIfColumnisEmpty(r.ItemArray[2]) || !checkIfColumnisEmpty(r.ItemArray[3])
           || !checkIfColumnisEmpty(r.ItemArray[4]) || !checkIfColumnisEmpty(r.ItemArray[5]))
    {
        if (checkIfColumnisEmpty(r.ItemArray[2]))
        {
            throw new ImportBOQException("Error importing document: Third column is empty");
        }
        else if (checkIfColumnisEmpty(r.ItemArray[3]))
        {
            throw new ImportBOQException("Error importing document: Fourth column is empty");
        }
        else if (checkIfColumnisEmpty(r.ItemArray[4]))
        {
            throw new ImportBOQException("Error importing document: Fifth column is empty");
        }
        else if (checkIfColumnisEmpty(r.ItemArray[5]))
        {
            throw new ImportBOQException("Error importing document: Sixth column is empty");
        }
        else
        //all columns are valid so...
        {   Column2inSpreadsheet = (r.ItemArray[2]) as string;
            Column3inSpreadsheet = (r.ItemArray[3]) as string;
            Column4inSpreadsheet = (r.ItemArray[4]) as string;
            Column5inSpreadsheet = (r.ItemArray[5]) as string;

            //Other code which performs other operations, once the level as reached this far
        }
    }
    else
    //other errors ot related to empty colums
    {
        throw new Exception("Error Uploading");
    }
}
4

2 に答える 2

1

まず、配列にインデクサーを使用する代わりに、rを名前付きプロパティを持つクラスに変換し、ソースからのコレクションを初期化します。次に、署名boolVerifyColumn(文字列値、文字列propertyName)を使用してヘルパーメソッドを作成します。これは基本的なリファクタリングです。ロジックを「Holys***」から「これはめちゃくちゃですが、変更できます」に変更できる可能性があります。

于 2013-01-21T12:26:46.947 に答える
1

列の1つが「空」であるかどうかを確認し、そのインデックスを取得するだけでよい場合は、次のように使用できます。

var firstEmptyColumn = r.ItemArray
    .Select((f, i) => new { Field=f, Index=i })
    .FirstOrDefault(x => r.IsNull(x.Index) || x.Field.ToString().Trim().Length == 0);
if (firstEmptyColumn != null)
{
    string errorMsg = string.Format("Error importing document: {0} column is empty",
        firstEmptyColumn.Index);
    throw new ImportBOQException(errorMsg);
}
于 2013-01-21T12:31:20.383 に答える