2013-08-30 200 views
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); 
       } 
     } 
} 

這將遍歷所有進度條以找到合適的進度條。 這可能會變短嗎?

在此先感謝。

回答

3

LINQ將遍歷整個集合ProgressBar s,所以它沒有比你現有的解決方案更好。

您應該考慮使用它的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)的時間內完成,所以應該會更好,那麼你目前的解決方案。

+0

完美。正是我在找什麼,謝謝。 – Roel

0

要完成此任務,您必須:

上面導入Linq命名空間。

import System.Linq; 

然後使用類似的代碼是:

​​

問候,威廉·。

+0

'Find()'和'ToList()'遍歷源集合。 – MarcinJuraszek