检查对象名称是否等于“文本框”+数字数组.任意()

本文关键字:文本框 数字 数组 任意 文本 对象 是否 检查 | 更新日期: 2023-09-27 18:31:17

我如何能够在一个if语句中检查textbox + numbers.Any()的组合,使其与控件的名称匹配?

foreach (Control con in this.Controls)
{
    if (con is TextBox)
    {
        if (con.Name == "textBox" + numbers.Any())
        {
            MessageBox.Show("Something");
        }
    }
}

这些是数字:

string[] numbers = new string[5] { "3", "4", "5", "6", "7" };

检查对象名称是否等于“文本框”+数字数组.任意()

如果存在要枚举的内容,则具有空参数的Any()重载返回 true。此外,它返回一个布尔值,所以如果你用字符串的方式连接它,你的 if 条件看起来像这样:

if(con.Name == "textBoxTrue")
//or
if(con.Name == "textBoxFalse")

所以你必须像奥利弗所展示的那样去做。另一个(更短的)选项是

if (numbers.Any(n => con.Name == "textBox" + n))
{
    MessageBox.Show("Something");
}

整个foreach的事情可以写在一行中(这是Linq帮助的地方):

foreach (var x in this.Controls
                      .OfType<TextBox>()
                      .Where(con => numbers.Any(n => con.Name == "textBox" + n)))
{
    MessageBox.Show("Something");
}

但是,如果您正在做的是更复杂的东西,那么最好这样写foreach以提高可读性。


您还可以利用 C# 提供的各种数组初始化语法。在向数组添加元素时指定大小使其几乎不冗余。看到这里。所以它只需要:

var numbers = new[] { "3", "4", "5", "6", "7" }; //may replace var with string[]
//or
string[] numbers = { "3", "4", "5", "6", "7" };

而不是

string[] numbers = new string[5] { "3", "4", "5", "6", "7" };

尝试:

numbers.Select(n => string.Format("textBox{0}", n)).Contains(con.Name);

你也可以使用这个:

var a="textBox5".Split(new string[]{"textBox"},StringSplitOptions.RemoveEmptyEntries);
if (a.Length==2) && numbers.Contains(a[1])) 
{
//  exists...
}