按自定义属性选择控件

时间:2013-08-30 12:23:15

标签: c# linq for-loop foreach

我已经尝试了一段时间,但我想修改特定控件的value而不循环遍历所有控件,以检查文本框的id属性是否与正确的值匹配。

目前这是我的代码,但我想也许使用LINQ它更有效;

for (int i = 0; i < protectMaxPlayers; i++)
{
    // Update the protect time.
        protect.setProtectTime(i, protect.getProtectTime(i) - 1);

        // Set the progressbar.
        foreach (ProtectProgressBar pb in pnlProtect.Controls.OfType<ProtectProgressBar>())
        {
            if (pb.Id == i)
                    pb.Value = protect.getProtectTime(i);
                }
        }
}

这会遍历所有进度条以找到正确的进度条。 这有可能缩短吗?

提前致谢。

2 个答案:

答案 0 :(得分:3)

LINQ也将迭代整个ProgressBar s 集合,因此它不比您当前的解决方案更好。

你应该考虑准备Dictionary<string, ProtectProgressBar>并使用它来找到使用它的ID的正确的:

var bars = pnlProtect.Controls.OfType<ProtectProgressBar>().ToDictionary(c => c.Id, c => c);

for (int i = 0; i < protectMaxPlayers; i++)
{
    // Update the protect time.
    protect.setProtectTime(i, protect.getProtectTime(i) - 1);

    ProtectProgressBar bar;
    if(bars.TryGetValue(i, out bar))
    {
        bar.Value = protect.getProtectTime(i);
    }
}

Dictionary<TKey, TValue>查询在 O(1)时间内完成,因此它应该比您当前的解决方案更好。

答案 1 :(得分:0)

要完成此任务,您必须:

上面导入Linq命名空间。

import System.Linq;

然后使用这样的代码:

for (int i = 0; i < protectMaxPlayers; i++)
{
    // Update the protect time.
    protect.setProtectTime(i, protect.getProtectTime(i) - 1);

    // Set the progressbar.
    ProtectProgressBar pb = pnlProtect.Controls.OfType<ProtectProgressBar>().ToList().Find(k => k.ID == i.ToString());

    // check if it was found
    if (pb != null)
    {
        // your code
    }
}

问候,威廉姆斯。