我已经尝试了一段时间,但我想修改特定控件的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);
}
}
}
这会遍历所有进度条以找到正确的进度条。 这有可能缩短吗?
提前致谢。
答案 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
}
}
问候,威廉姆斯。