0

下面的代码将表单标签重置为“0”。出于好奇,我试图弄清楚如何仅访问某些项目而不是列表中的每个项目。foreach 函数在这里工作得很好,但在代码的其他部分我想以不同的方式访问和修改这些对象

例如,我如何将所有其他字段设置为“0”或仅将最后三个或前三个设置为某个值等。

// Set the form Labels to "0"
private void btnClear_Click(object sender, EventArgs e)
{
    // Create List of Labels for modifying form
    new List<Label>() { lbl1, lbl2, lbl3, lbl4, lbl5, lbl6 }.ForEach(p => p.Text = "0");
}

谢谢你

更新:

经过大量阅读和测试后,我回到了选择列表中所有其他项目的最基本方法。

        // Set the form Labels to "0"
    private void btnClear_Click(object sender, EventArgs e)
    {
        // Create List of Labels for modifying form
        List<Label> lbl = new List<Label>() { lbl1, lbl2, lbl3, lbl4, lbl5, lbl6 };
        int x =1; //  Set to get every other label. 0 = even, 1 = odd
        while (x < lbl.Count)
        {
            lbl[x].Text = "0";
            x = x + 2;
        }

@Jonathan Wood 有没有办法做到这一点 items.ForEach(p => { some code(), p.Text = "0"; });

4

4 回答 4

4

您传递给的委托ForEach()可以用大括号括起来,这样您就可以定义更复杂的逻辑,例如if语句。

items.ForEach(p => { if (p != null) p.Text = "0"; });

您甚至可以将您的委托定义为一个单独的方法并传递它。

但是,我想知道您的方法。这是一个winforms应用程序吗?为什么不做一个循环通过表单控件的常规循环呢?然后就不需要额外的表了。

于 2012-11-11T18:26:09.303 回答
3

要将所有其他字段设置为“0”,您可以尝试将当前元素的索引传递给谓词的IEnumerable.Where重载。

假设您要处理具有奇数索引的元素:

new List<Label>() { lbl1, lbl2, lbl3, lbl4, lbl5, lbl6 }.Where((p, i) => (i & 1) == 1).ToList().ForEach(p => p.Text = "0");
于 2012-11-11T18:44:21.503 回答
2

您可以使用 Linq:

前三个:

var labels = new List<Label>() { lbl1, lbl2, lbl3, lbl4, lbl5, lbl6 };
foreach(Label lbl in labels.Take(3))
    lbl.Text = someValue;

最后三个:

foreach(Label lbl in labels.Reverse().Take(3))
    lbl.Text = someValue;

其他标签:

var allLabels = this.Controls.OfType<Label>();
var otherLabels = allLabels.Except(labels);
foreach(Label lbl in otherLabels)
    lbl.Text = "0";
于 2012-11-11T18:24:48.127 回答
1

将前 3 设置为 0

new List<Label>() { lbl1, lbl2, lbl3, lbl4, lbl5, lbl6 }.Take(3).ForEach(p => p.Text = "0");

将最后 3 设置为 0

new List<Label>() { lbl1, lbl2, lbl3, lbl4, lbl5, lbl6 }.Skip(3).Take(3).ForEach(p => p.Text = "0");
于 2012-11-11T18:25:45.207 回答