【问题标题】:Select a control by custom property通过自定义属性选择控件
【发布时间】:2013-09-03 04:18:27
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: c# linq for-loop foreach


    【解决方案1】:

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

    您应该考虑准备Dictionary&lt;string, ProtectProgressBar&gt; 并使用它的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&lt;TKey, TValue&gt; 查找在 O(1) 时间内完成,因此它应该比您当前的解决方案更好。

    【讨论】:

      【解决方案2】:

      要完成这项任务,您必须:

      在上面导入 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
          }
      }
      

      问候,威廉。

      【讨论】:

      • Find()ToList() 都遍历源集合。
      猜你喜欢
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多