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

ProgressBarLINQ はのコレクション全体も反復処理するため、現在のソリューションよりも優れているわけではありません。

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 に答える