[英]Select a control by custom property
我已经尝试了一段时间,但是我想修改特定控件的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);
}
}
}
这会遍历所有进度条,以便找到正确的进度条。 这有可能变得更短吗?
提前致谢。
LINQ还将遍历ProgressBar
的整个集合 ,因此它并没有比您当前的解决方案更好。
您应该考虑准备Dictionary<string, ProtectProgressBar>
并使用其ID来找到正确的Dictionary<string, ProtectProgressBar>
:
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)时间中完成的,因此比您当前的解决方案更好。
要完成此任务,您必须:
在上方导入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
}
}
问候,威廉。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.