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() 成为静态方法。然后传入 long 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 位数字、标签和原始大小,而不是在 sizer 中使用数组。然后 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 回答