0

我已经尝试了一段时间,但我想修改一个特定的控件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);
                }
        }
}

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

提前致谢。

4

2 回答 2

3

LINQ 也会遍历整个ProgressBars集合,因此它并不比您当前的解决方案更好。

您应该考虑准备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)时间内完成的,所以它应该比你当前的解决方案更好。

于 2013-08-30T12:29:36.043 回答
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
    }
}

问候,威廉。

于 2013-08-30T12:32:00.997 回答