在执行c#之前检查linq操作是否为空

本文关键字:操作 是否 linq 检查 执行 | 更新日期: 2023-09-27 18:17:08

我有一个60个单选按钮的Win-form。我想用以下代码从选中的单选按钮中获取文本:

private void button1_Click_1(object sender, EventArgs e)
    {
         string[] boxes = new string[30];
         string[] names = new string[30];
        for (int i = 1; i < boxes.Length; i++)
        {
            var label = this.Controls.Find("lb" + i, true)[0];
            var panelcontr = this.Controls.Find("panel" + i, true)[0] as Panel;
            var panels = panelcontr;
            var p = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked).Text;
            boxes[i] += p;
            names[i] += label.Text;
            tobeWritten += names[i] + boxes[i] + ",";
                textBox1.Text = "Anamnese(" + tobeWritten + ")";
        }
    }

它完全可以工作,但问题是,当只有一个单选框未选中时,我在调试期间得到一个警告。我知道为什么会出现警告,但我希望程序不要停止。

我要问的是:是否有可能创建一个出现的MessageBox,当我没有检查一个radioButton,例如说"你必须分配每个按钮"。我点击"确定"按钮,我可以选中未选中的按钮。我尝试了在StackOverflow的其他问题的建议,但没有成功,因为函数panels.Controls.OfType<RadioButton>()在查询之前执行。

在执行c#之前检查linq操作是否为空

如果没有选中RadioButton,这里将得到NullReferenceException:

var p = panels.Controls.OfType<RadioButton>()
    .FirstOrDefault(r => r.Checked).Text;

因为FirstOrDefault返回null,因为RadioButton是引用类型。然后你不能访问它的Text属性。那么如何避免这种情况呢?

存储结果并在使用它之前检查它是否为null:

RadioButton firstCheckedRadioButton = panels.Controls.OfType<RadioButton>()
    .FirstOrDefault(r => r.Checked);
if(firstCheckedRadioButton != null)
{
    string text = firstCheckedRadioButton.Text;
    // ...
}

你的问题在这里:

var p = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked).Text;

如果FirstOrDefault调用的结果为null,则Text调用将抛出空引用异常。您可以通过拆分调用来避免这种情况,这样您就可以调用FirstOrDefault,检查结果是否为空,然后只有在知道结果不为空时才调用Text。

如果把

var p = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked).Text;

var ch = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked);
if (ch == null)
{
  // show message box and break;
}
var p = ch.Text;

现在可以使用下面的代码了:

private void button1_Click_1(object sender, EventArgs e)
    {
         string[] boxes = new string[30];
         string[] names = new string[30];
        for (int i = 1; i < boxes.Length; i++)
        {
            var label = this.Controls.Find("lb" + i, true)[0];
            var panelcontr = this.Controls.Find("panel" + i, true)[0] as Panel;
            var panels = panelcontr;
            var radiobutton = panels.Controls.OfType<RadioButton>()
                        .FirstOrDefault(r => r.Checked);
            if(radiobutton==null)
            {
                MessageBox.Show("Check all Buttons!");
                break;
            }
            boxes[i] += radiobutton.Text;
            names[i] += label.Text;
            tobeWritten += names[i] + boxes[i] + ",";
            textBox1.Text = "Anamnese(" + tobeWritten + ")";
        }
    }