Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

SystemInfo как улучшить код?

#c_sharp #инспекция_кода


Проблема в том что выходит слишком много foreach, как всё это можно сократить?

private static string pcCPU;
private static string pcGPU;
private static string pcLocalIP;
private static string pcExternalIP;
private static string pcAntivirus;

string savePath = @"C:\Sys.txt";
using (FileStream file = new FileStream(savePath, FileMode.Append))
{
    using (StreamWriter twf = new StreamWriter(file, Encoding.UTF8))
    {
        foreach (ManagementBaseObject avResult in avsearcher.Get())
        {
            pcAntivirus = "& " + (avResult.GetPropertyValue("displayName")).ToString();
            pcAntivirus = (pcAntivirus.StartsWith("& ")) ? 
                                pcAntivirus.Substring(1) : 
                                pcAntivirus;
            twf.WriteLine(" антивирус: " + pcAntivirus);
         }
         foreach (ManagementObject gr in gs.Get())
         {
             foreach (PropertyData pty in gr.Properties)
             {
                 if (pty.Name == "Description")
                 {
                     pcGPU += pty.Value.ToString();
                     twf.WriteLine("  Видеоадаптер: " + pcGPU);
                 }
             }                 
         }
         foreach (ManagementObject gob in sar.Get())
         {
             twf.WriteLine("  Модель компьютера: " + gob["Manufacturer"] + gob["Model"]);
         }
    }
}


P.S:
Я вот попробовал так сделать, но тут не получается:

1 - Выводит ошибку Invalid Class

2 - в twf нельзя записать WriteALLtext, можно только Write

StringBuilder sb = new StringBuilder();
foreach (ManagementBaseObject avResult in avsearcher.Get())
{
Sb.Append(" антивирус: ").Append(pcAntivirus).Append("\n");
}
foreach (ManagementObject gr in gs.Get())
{
foreach (PropertyData pty in gr.Properties)
{
if (pty.Name == "Description")
{
Sb.Append("  Видеоадаптер: ").Append(pcGPU).Append(pty.Value.ToString()).Append("\n");;
}
}
}
foreach (ManagementObject gob in sar.Get())
{
Sb.Append("  Модель компьютера: ").Append(gob["Manufacturer"]).Append(gob["Model"]).Append("\n");;
}
twf.Write(sb.ToString());


А вот ошибка: 

На просторах интернета нашёл интересный код: с использованием List

Информация о системе
    


Ответы

Ответ 1



Например, вы можете отделить получение данных от их вывода. // зачем вам странный трюк с "& "? var avNames = avsearcher.Get() .Cast() .Select(av => (string)av["displayName"]) .ToList(); var graphicCardList = gs.Get() .Cast() .Select(mo => (string)mo["Description"]) .ToList(); var computerInfoList = sar.Get() .Cast() .Select(gob => (string)gob["Manufacturer"] + gob["Model"]) .ToList(); И теперь запись: File.AppendAllLines( savePath, avNames.Select(s => $" Антивирус: {s}"), Encoding.UTF8); File.AppendAllLines( savePath, graphicCardList.Select(s => $" Видеоадаптер: {s}"), Encoding.UTF8); File.AppendAllLines( savePath, computerInfoList.Select(s => $" Модель компьютера: {s}"), Encoding.UTF8); Циклы не нужны вовсе.

Ответ 2



сократить вряд ли, а улучшить - разбить на методы отдельные логические участки. Текст собирать в StringBuilder и по завершению запись в файл. Invalid Class - платформа х86 стоит? смените на AnyCPU. Не стоит все брать в using, он нужен для сохранения в файл, когда дойдет до сохранения, там стрим и создать и записать. В sb.ToString() как раз и будет весь текст, он write-ом и запишется

Комментариев нет:

Отправить комментарий