4

それは私には混乱しているように思えます。私の心は、もっと良い方法があるはずだと言っています。

Web ページに 6 つのコントロールがあります。

if (printer_make_1.Text != "" && printer_model_1.Text != "" && printer_make_2.Text != "" && printer_model_2.Text != "" && printer_make_3.Text != "" && printer_model_3.Text != "")
{
  // Do something
}

これを行うための最良/最も効率的な方法は何ですか?

4

7 に答える 7

6

読みやすさを改善したり、他の場所で同じロジックを使用したりする場合は、メソッドにリファクタリングできます。

public Boolean AllControlsHaveAValue() {
    return (printer_make_1.Text != ""
        && printer_model_1.Text != ""
        && printer_make_2.Text != ""
        && printer_model_2.Text != ""
        && printer_make_3.Text != ""
        && printer_model_3.Text != "");
}

次に、次のように尋ねます。

if (AllControlsHaveAValue()) {
    // do something
}
于 2012-04-27T15:49:23.353 に答える
5

再構築はデータから始まります: 回避printer_make_1, printer_make_2, ...

class PrinterData
{
   public string Make { get; set; }
   public string Model { get; set; }
}

PrinterData[] printers = new PrinterData[3];  //or use a List<>

printers[0] = new PrinterData { Make = "PH", Model = "1A" };
...

if (printers.All(p => ! (p.Make == "" || p.Model == "")) )
  ...
于 2012-04-27T15:51:37.997 に答える
3
if(new[] { printer_make_1, printer_model_1 ...}.All(l => l.Text != string.Empty)
{
    //do something
}

読みやすくするために分割することもできます。

var labels = new[] { printer_make_1, printer_model_1 ... };
if(labels.All(l => l.Text != string.Empty))
{
    //do something
}
于 2012-04-27T15:47:04.917 に答える
2

私は通常、そのテストをメソッドに入れ、それを呼び出して if を読みやすくします

private boolean AreAllPrinterFieldsFilled()
{
    return (printer_make_1.Text != "" 
        && printer_model_1.Text != "" 
        && printer_make_2.Text != "" 
        && printer_model_2.Text != "" 
        && printer_make_3.Text != "" 
        && printer_model_3.Text != "");
}

次に、if:

if (AreAllPrinterFieldsFilled)
{
    // Do something
}
于 2012-04-27T15:49:40.663 に答える
1

これを実現する方法はたくさんありますが、どれもエレガントではありません。あなた (およびあなたの後ろにいる人) にとって最も読みやすいことを行います。

私はおそらくこのアプローチを取るでしょう:

string makeText = String.Concat(printer_make_1.Text, printer_make_2.Text, printer_make_3.Text);
string modelText = String.Concat(printer_model_1.Text, printer_model_2.Text, printer_model_3.Text);

if (makeText.Length != 0 && modelText.Length != 0)
{
    // Do something
}
于 2012-04-27T15:49:41.257 に答える
0
private bool CheckAllEmpty(params TextBox[] textBoxes)
{
    return textBoxes.All(tb => tb.Text != null);
}

private void Foo()
{
    ...

    if (CheckAllEmpty(tb1, tb2, tb3))
    {
        mbox("tb1, tb2 and tb3 are all empty");
    }
    else
    {
        mbox("tb1, tb2 or tb3 isn't empty");
    }

    ...
}
于 2012-04-27T15:57:00.540 に答える
0
if (!Enumerable.Range(1, 3)
    .Any(i => ((TextBox)FindControl("printer_make_" + i)).Text == "" || 
        ((TextBox)FindControl("printer_model_" + i)).Text == "") {...}

後でプリンターのメーカーとモデルの数を増やすことができますが、厳密な型付けではありません。

于 2012-04-27T15:50:44.970 に答える