Пытаюсь собрать всё максимально компактно.
Приведу пример:
private readonly static ManagementObjectSearcher Processor = new
ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_Processor");
private readonly static ManagementObjectSearcher OperatingSys = new
ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_OperatingSystem");
ManagementObjectCollection ProcG = Processor.Get();
foreach (var cr in ProcG)
{
stringbuilder.AppendFormat(cr["Name"]).ToString())
}
ManagementObjectCollection OperaSys = OperatingSys.Get();
foreach (var z in OperaSys)
{
stringbuilder.AppendFormat(z["SerialNumber"].ToString());
}
И.т.д .. Но код вышел очень длинным))
Можно ли как-нибудь объединить их?
Допустим в List<string>
? или вообще что лучше использовать?
Думал сделать так для начало как-то:
var collectionWmi =
{
"SELECT * FROM Win32_Processor",
"SELECT * FROM Win32_OperatingSystem",};
и.т.д и уже с ним работать, но я в сомнениях)
Что посоветуете?
Когда-то давно в институте нам вдалбливали на лабораторных работах по информатике, что любую программу можно разделить на этап сбора данных (чтение пользовательского ввода), её обработку и вывод на экран данных.
Если бы у вас не было бы такого маниакального желания смешать все эти фазы в одну, чтобы сразу и читать и загонять в стринг билдер -- то вы бы увидели много вариантов по объединению похожих чтений полей.
А вы думаете в терминах строк. Соберите данные в класс и представьте, что у вас не один формат, а много форматов и отделите в голове СБОР инфы от ФОРМАТИРОВАНИЯ и ВЫВОДА.
Я бы сначала бы объявил класс Machine и сказал бы что у него есть prop Processors[] и остальная ваша портянка свойств. Не строки, а строгие типы.
Потом бы взялся за упрощение сбора информации. И отдельно бы думал о выводе информации в нужных видах.
Вы например не думаете, что у вас на одной закладке приложения могут показываться лишь данные о процессорах, а на другой -- об оперативке? И что каждый раз нужно лишь часть инфы выводить, а не сгребать всё попало в строки.
Вы думаете в терминах процедурных языков, у вас по сути одна длиннющая функция.
А разбить это на десяток классов, у каждого из которых будет по 10 строк кода, каждый из которых инфу по своему свойству заполняет. Процессор - о процессоре, ОС - про ОС. Увидел бы, что каждый лезет в ManagementObjectSearcher и выполняет по сути типовые операции, вынес бы это в базовый класс...
Подскажите, на данный момент я использую stringbuilderи собираю все данные через strbuild.AppendFormat("",path);, Думаю за место билдера использовать List он может добавлять такие же строки через запятую?
Вы по-прежнему не можете отделить в голове способ хранения информации от формата вывода. Хранить строки можно разными способами, ничего не мешает использовать List, можно хранить в Array, можно в свойствах класса. Причём вы, проектируя своё приложение вы можете как скрывать детали реализации, так и наоборот активно использовать знание о способе хранения.
А вывод информации через запятую -- это только один формат, который совершенно не зависит от того, что у вас внутри - список или массив. В конкретной реализации у вас и для списка и для массива будет одно и то же:
var options = new[] { "first", "second", "third"};
var display = string.Join(",", options);
Тут два момента. Во-первых, замена стринг билдера на джойн ничего не меняет концептуально: меняете шило на мыло, а архитектура как была "трудоноподдерживаемый спагетти-код" -- так и осталась. Во-вторых, стринг билдер лучше, чем склейка строк: вряд ли вас интересуют копейки производительности (у вас в приложении есть множество мест, которые на порядки больше съедают ресурсов), но всё же если вы вспомните, что строки в c# -- неизменяемые объекты и сто раз делая склеивание строк вы сто раз создаёте новые объекты, в которые помещаете данные. В общем-то стринг билдер как раз и нужен в случаях, подобных вашему.
И ещё. Какая разница, как форматировать строки? Может быть вы завтра захотите свою программу сделать веб-приложением -- и не будет у вас ни стринг билдера, ни склейки Join'ом -- а будет у вас Razor и он будет строить <ul>
список из вашего List'а.
Я бы каждый WMI запрос обернул бы собственный тип.
Получится, что в коде не будет каши и будет соблюден принцип "разделяй и властвуй".
Так же результаты каждого запроса будут типизированны, так как вы загоните их в собственный тип.
Затем бы переопределил метод ToString()
, что бы все возвращалось в виде название поля-значение.
А уже вот эти маленькие классы объединил бы в более общую сущность SystemInfo, где бы были перечислены эти типы.
В SystemInfo
добавил бы метод GetReport()
, который бы вызвал ToString()
у каждого поля и вернул бы единую строку.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
How to create custom task and add it to Build Process so that after build this task sends my artefacts to my e-mail?
Как сделать, чтобы высота ячейки автоматически увеличивалась в зависимости от размера контента внутри неё?
Как при нажатии на этот Button удалить определенное слово из строки ListBox? Button вытягивает строку из ListBox и отправляет ее метод Find
Я в DirextX ноль, по этому нубский вопросКак мне рисовать линии в окне DirectX11 имея только классы: