1

それで、私はあなたにすべてが何であるかについての要約を与えましょう:

  • 最初のセクションは、ドライブのサイズ情報を取得するだけです

  • Sizerは、配列を返すクラスです。

  • 配列には(4桁に変換されたサイズ、サイズラベル、生のサイズ)が含まれています理解を深めるために下部にコードを貼り付けました

  • ラベルはサイズを表示する単なるラベルです

今、私はこれを行うためのより効率的な方法があることを深く知っています、そして私は脳のおならを持っていてそれを理解することができません。ループでこれを行う方法が必要ですか、それともこれを行うための本当に最良の方法ですか?

private void driveList_SelectedIndexChanged(object sender, EventArgs e)
        {
            DriveInfo wow = therehasgottobeanotherway[driveList.SelectedIndex];
            if (wow.IsReady)
            {
                //get drive sizes
                long tot = wow.TotalSize;
                long free = wow.TotalFreeSpace;
                long aval = wow.AvailableFreeSpace;

                sizer totSize = new sizer(tot);
                sizer freeSize = new sizer(free);
                sizer avalSize = new sizer(aval);

                String[] tots = totSize.getSizeStringType();
                String[] frees = freeSize.getSizeStringType();
                String[] avals = avalSize.getSizeStringType();

                totalSizeLabel.Text = tots[0] + tots[1];
                freeSizeLabel.Text = frees[0] + frees[1];
                avalSizeLabel.Text = avals[0] + avals[1];

                driveName.Text = wow.VolumeLabel;
            }
            else
            {
                driveName.Text = "Drive Not Ready";
            }
        }




using System;

namespace compy
{
    internal class sizer
    {
        private long fSize;
        private String[] fSizer = new String[3];

        public sizer(long fs)
        { fSize = fs; }

        public String[] getSizeStringType()
        {
            fSizer[2] = Convert.ToString(fSize);

            if (fSize > 0 && fSize < 1024)
            {
                fSizer[0] = Convert.ToString(fSize);
                fSizer[1] = " Bytes";
            }
            else if (fSize > 1024 && fSize < 1048576)
            {
                fSizer[0] = Convert.ToString(fSize / 1000);
                fSizer[1] = " Kilobytes";
            }
            else if (fSize > 1048576 && fSize < 1073741824)
            {
                fSizer[0] = Convert.ToString(fSize / 1000 / 1000);
                fSizer[1] = " Megabytes";
            }
            else if (fSize > 1073741824 && fSize < 1099511627776)
            {
                fSizer[0] = Convert.ToString(fSize / 1000 / 1000 / 1000);
                fSizer[1] = " Gigabytes";
            }
            else if (fSize > 1099511627776 && fSize < 1.1259e15)
            {
                fSizer[0] = Convert.ToString(fSize / 1000 / 1000 / 1000);
                fSizer[1] = " Terabyte";
            }

            return fSizer;
        }
    }
}
4

3 に答える 3

1

最適化が必要だと思う理由は何ですか...実行速度が遅くなりますか?読み取り可能なコードを台無しにして、実行速度を大幅に向上させないでください。

コードを改善したい場合は、次のように行を変更します。

else if (fSize > 1048576 && fSize < 1073741824)

これに:

else if (fSize > 0x100000 && fSize < 0x40000000)

PS:あなたの番号は正しいですか?

于 2012-09-19T02:25:26.370 に答える
0

Sizerを静的クラスにし、getSizeStringType()を静的メソッドにすることができます。次に、長いfSizeを引数として渡します。

したがって、driveList_SelectedIndexChangedは次のようになります。

        DriveInfo wow = therehasgottobeanotherway[driveList.SelectedIndex];
        if (wow.IsReady)
        {
            String[] tots = sizer.getSizeStringType(wow.TotalSize);
            String[] frees = sizer.getSizeStringType(wow.TotalFreeSpace);
            String[] avals = sizer.getSizeStringType(wow.AvailableFreeSpace);

            totalSizeLabel.Text = tots[0] + tots[1];
            freeSizeLabel.Text = frees[0] + frees[1];
            avalSizeLabel.Text = avals[0] + avals[1];

            driveName.Text = wow.VolumeLabel;
        }
        else
        {
            driveName.Text = "Drive Not Ready";
        }

それとは別に、サイザーで配列を使用する代わりに、4桁、ラベル、および生のサイズを格納する3番目のクラスを作成できます。次に、getSizeStringType()メソッドは、配列の代わりにこのクラスのインスタンスを返すことができます。それは物事を少し厄介にするでしょうが、より多くのコードを必要とします。しかし、結局、ここであなたの質問の意見があります。

于 2012-09-19T02:14:31.143 に答える
0

まず第一に、あなたの状態は、サイズがちょうど1024、1048576などの閉じた領域ではありません...

ループ方式がありますが、より効率的な方法ではありません

        String[] aStrSizeUnit = new String[] { " Bytes", " Kilobytes", " Megabytes", " Gigabytes", " Terabyte" };
        int iSizeLevel = 0;
        long iSizeTmp = (long)fSize;
        fSizer[2] = Convert.ToString(fSize);

        while (iSizeTmp > 0)
        {
            fSizer[0] = Convert.ToString(fSize / Math.Pow(1000 , iSizeLevel));
            fSizer[1] = aStrSizeUnit[iSizeLevel];
            iSizeTmp /= 1024;
            iSizeLevel++;
        }
于 2012-09-19T02:47:14.900 に答える