2
private static ManagementObjectSearcher VideoControl = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController");
ManagementObjectCollection GetVideo = VideoControl.Get();
foreach (ManagementObject w in GetVideo)
{
  string container;
  int int1024 = 1048576;
  if ((Convert.ToDouble(w["AdapterRam"]) / int1024) % 1024 == 0)
    container = ((Convert.ToDouble(w["AdapterRam"]) / int1024) / 1024).ToString() + " ГБ";
  else
    container = (Convert.ToDouble(w["AdapterRam"]) / int1024).ToString() + " МБ";
    if (w["Caption"] != null)
stringbuilder.AppendFormat("Ваша Видеокарта: {0}  -  ({1})", w["Caption"], container);

Есть ли более оригинальных способ вывести для каждой видеокарты свой объём памяти?

GooliveR
  • 1,979
  • 1
    Что подразумевается под оригинальностью? По идее, информацию можно так же достать в реестре и ,наверное, с помощью WINAPI. Однако, эти способы не такие лаконичные как WMI. – iluxa1810 May 22 '17 at 08:37
  • @iluxa1810, Оригинальный способ конвертирования памяти) Может можно как-то упростить это всё? – GooliveR May 22 '17 at 08:47
  • 2
    Я писал такой конвертер (там правда не видеопамять, а дисковое пространство): https://github.com/AndrewNowosad/DirScanNet/blob/master/DirScanNet/Views/Converters/FileLengthConverter.cs – Андрей NOP May 22 '17 at 09:34

2 Answers2

4

Утащил решение из Benchmark.NET и немного упростил код.

Получился вот такой класс:

public class SizeUnit
{
    public string Name { get; }
    public long ByteAmount { get; }
public SizeUnit(string name, long byteAmount)
{
    Name = name;
    ByteAmount = byteAmount;
}

private const long BytesInKiloByte = 1024L; // this value MUST NOT be changed

public static readonly SizeUnit B = new SizeUnit("B", 1L);
public static readonly SizeUnit KB = new SizeUnit("KB", BytesInKiloByte);
public static readonly SizeUnit MB = new SizeUnit("MB", BytesInKiloByte * BytesInKiloByte);
public static readonly SizeUnit GB = new SizeUnit("GB", BytesInKiloByte * BytesInKiloByte * BytesInKiloByte);
public static readonly SizeUnit TB = new SizeUnit("TB", BytesInKiloByte * BytesInKiloByte * BytesInKiloByte * BytesInKiloByte);
public static readonly SizeUnit[] All = { B, KB, MB, GB, TB };

public static SizeUnit GetBestSizeUnit(long value)
{
    foreach (var sizeUnit in All)
    {
        if (value < sizeUnit.ByteAmount * BytesInKiloByte)
            return sizeUnit;
    }
    return All[^1];
}

public static double Convert(long value, SizeUnit from, SizeUnit to) 
    => value * (double)from.ByteAmount / to.ByteAmount;

}

И вот такой вот тест:

static void Main(string[] args)
{
    long ram = 16L * 1024 * 1024 * 1024 * 1024; // 16 TB
    while (ram > 1)
    {
        SizeUnit sizeUnit = SizeUnit.GetBestSizeUnit(ram);
        Console.WriteLine($"{SizeUnit.Convert(ram, SizeUnit.B, sizeUnit):G4} {sizeUnit.Name}");
        ram /= 2;
    }
    Console.ReadKey();
}

И вот такой вывод в консоль:

16 TB
8 TB
4 TB
2 TB
1 TB
512 GB
256 GB
128 GB
64 GB
32 GB
16 GB
8 GB
4 GB
2 GB
1 GB
512 MB
256 MB
128 MB
64 MB
32 MB
16 MB
8 MB
4 MB
2 MB
1 MB
512 KB
256 KB
128 KB
64 KB
32 KB
16 KB
8 KB
4 KB
2 KB
1 KB
512 B
256 B
128 B
64 B
32 B
16 B
8 B
4 B
2 B
aepot
  • 49,560
1

Я думаю, что можно сделать через сдвиг бит, так как делитель кратен 2.

В любом случае проще сделать это не получится, так как даже если ты найдешь в .NET готовую функцию, то внутри себя она будет делать тоже самое, что и ты описал.

Для красоты я бы вынес конвертирование памяти в отдельный Helper класс, например MemoryConverter.

Так же ты несколько раз конвертируешь одну и туже строку в Double. Правильнее сконвертировать ее 1 раз в какую-нибудь переменную.

iluxa1810
  • 24,899
  • Могли бы и дать ответ в виде правильного решения)) ? – GooliveR May 22 '17 at 09:22
  • Твое решение нормальное, просто вынеси операции конвертирования в отдельный класс. – iluxa1810 May 22 '17 at 09:24
  • Так и сделаю наверное) – GooliveR May 22 '17 at 09:31
  • Сдвиг компилятор сам применит. Не зачем ухудшать читаемость высокоуровнего кода. – Андрей NOP May 22 '17 at 09:31
  • @Андрей, да, нету смысла особого в сдвиге, так как это не узкое место производительности. Предложил просто как альтернативу. – iluxa1810 May 22 '17 at 09:33
  • @iluxa1810, как альтернативу) скажите как присвоить w["AdapterRam"], из класса ? Чат для решения – GooliveR May 22 '17 at 09:45
  • Было бы неплохо, если бы вы приняли ответ в случае, если он оказался полезным. – aepot Apr 30 '21 at 18:36