Ответы пользователя по тегу C#
  • Уничтожить объект в foreach?

    Nipheris
    @Nipheris Куратор тега C#
    Если я прохожусь циклом foreach

    Не стОит удалять что-либо из коллекции, по который вы В ДАННЫЙ МОМЕНТ проходитесь foreach. Чревато исключениями по причине умерших енумераторов.

    как уничтожить объект из массива, если имеется только его копия

    Взять обычный for, определить критерии сравнения двух объектов (чтобы собственно выяснить, какой объект является "копией" - по ссылке не сравнишь, т.к. это уже другой самостоятельный объект) - по каким-либо свойствам или еще как-то, найти этот объект и удалить его смещением остальных элементов массива на его место. Если бы у вас был список, достаточно было бы RemoveAt.
    Ответ написан
    Комментировать
  • Оптимизация графики?

    Nipheris
    @Nipheris Куратор тега C#
    А не будет ли GDI быстрее GDI+?

    GDI+ будет медленнее только при включенном сглаживании. В остальном их отличия не принципиальны.

    что без directx и opengl не добиться нормальной прорисовки на форме

    Смотря что вы понимаете под нормальной прорисовкой, и сколько у вас на форме контролов. Конечно, сегодня графику стараются рисовить на железе, собственно отсюда и новые стандарты качества. А вообще, Артём прав - что вы хотите от managed-обертки над GDI/GDI+ и стандартными виндовыми контролами, коей и является WinForms.
    Ответ написан
    Комментировать
  • Как правильно передавать объекты в N-layer архитектуре?

    Nipheris
    @Nipheris Куратор тега C#
    GenericRepository и его метод GetAll - это ни о чем. В том смысле, что вам такой репозиторий не нужен - он ничего не делает и ничего не абстрагирует. Вы выставляете IQueryable - и получаете проблемы на свою голову. Да, это очень соблазнительная штука, но таки репозиторий для того, чтобы все возможные запросы оставлять там, иначе они уходят далеко в логику приложения. Вам нужен конкретный репозиторий (интерфейс GenericRepository может и пригодится) с конкретными запросами, возвращающими IEnumerable. В этом и его суть - на уровне репозитория делается ПЕРВИЧНАЯ выборка (с помощью IQueryable), которая по сути есть запрос к БД и материализация всех НУЖНЫХ объектов, а потом уже мелкую фильтрацию можно делать с объектами в IEnumerable коллекции.

    Как организовать передачу сложных объектов (НЕ СУЩНОСТЕЙ) с уровня DAL на уровень BLL?

    Я бы сделал свой репозиторий для каждой такой вещи. Он будет ОТЛИЧАТЬСЯ от репозитория для сущностей, т.к. там не будет, например, Update. Это будет репозиторий ЗАПИСЕЙ, не объектов. В остальном все также - все возможные запросы нужно постараться собрать там. И класс тоже можно и нужно завести вроде BookReport, только он будет immutable, т.е. будет вести себя как запись. А дальше уже делайте с ним что пожелаете.

    Но если такая выборка находится в репозитории, получается метод репозитория должен возвращать List и уровень DAL будет связан с уровнем BLL.

    Вот тут не понял. Ну пусть возвращает List или IEnumerable, в чем тут вы связь видите?

    Вообще, возможно вам нужно поменьше париться о разделении DAL и BLL. Как правило это приводит к anemic data model, и ничего кроме вреда это вам не принисет. Вообще не знаю откуда эта мода пошла, у меня всегда получалось 80% логики оставлять в самих классах сущностей, и все было ок.
    Ответ написан
    1 комментарий
  • Актуален ли сейчас WPF?

    Nipheris
    @Nipheris Куратор тега C#
    разработка остановилась 5 лет назад и тому подобное

    Да, есть некоторый застой, основные силы переброшены на .net core и asp.net

    Правда ли, что WPF ждет судьба WinForms?

    Что конкретно вы имеете в виду под "судьбой WinForms"?

    Есть ли альтернатива WPF?

    Под .Net нету, под WinRT есть аналогичная подсистема, во многом скопированная с WPF, вообще под десктоп есть еще Qt, но это C++ (если не считать биндингов на другие языки)

    Что сейчас Microsoft предлагает для разработки GUI?

    Universal Windows Platform для Windows 10 - их основное направление, для классического десктопа - ничего нового.

    что WPF уходит в прошлое

    Альтернативы под .net нету, никуда он уходить не может (не все пока хотят связываться с Metro и UWP приложениями).
    Ответ написан
    Комментировать
  • Что использовать для написания приложения без многожества форм?

    Nipheris
    @Nipheris Куратор тега C#
    1) определитесь, что у вас будет базовым документом. Т.е., чего у вас будет много. Сейчас, я так понимаю, это заказ. Итак, это документ и он будет множиться. Советую его сделать табами.
    2) информационная панель и список пользователей вполне могут быть сделаны док-панелями справа и слева. Причина проста - на них придется часто смотреть, следить за ними. Постоянно переключаться не вариант. Правда, тогда они должны быть не так обильно наполнены элементами, как панель заказа, но мне кажется у вас как раз так и будет. Если у вас на инф. панели в основном сообщения, а на вкладке "список пользователей" - только этот список, ты выделять под такое весь экран нет смысла.

    Итого: слева инф. панель (15-20%), справа список пользователей (15%), оставшееся по центру - таб-контрол для заказов, по принципу табов в браузере (можно даже плюсик сделать для создания нового заказа). Альтернативный варинт - инф. панель снизу, под таб-контролом для заказов
    Ответ написан
    Комментировать
  • Как показать сообщение после завершения всех webClient.DownloadFileAsync?

    Nipheris
    @Nipheris Куратор тега C#
    Почему бы в download_completed не уменьшать счетчик оставшихся загрузок и дожидаться, пока не он станет равным нулю?
    Ответ написан
    3 комментария
  • Стиль оформления кода в .NET приложениях. Встречался ли вам ад в коде?

    Nipheris
    @Nipheris Куратор тега C#
    Для меня очевидно, что это писали бывшие разработчики на C/C++. Это древняя нотация, многие называют ее венгерской, только тут какой-то извращенный вариант (надо сказать, что и саму венгерку правильно применяли единицы в свое время, большинство не понимало до конца ее смысла). Сейчас так не пишут и на самих плюсах, для шарпа же это моветон. Выдает нотацию n перед именем индекса (это значит именно "индекс", а не int, правда обычно пишут nUnit или nEmployee, а не nIndex) и C перед именемами классов.
    Если есть нормальная IDE, то венгерская нотация нафиг не нужна, код превращается в рябь из смеси сокращений, которые только раздражают

    Совершенно согласен с вами.

    Не такие уж опытные ребята писали этот код, и они точно не в ладах с оформлением кода в C#. Вероятно, писали давно, когда C# еще появился, и все C++ программеры начинали писать на нем, сохраняя все свои привычки, многие из которых не нужны или даже вредны.
    То, что разные классы по-разному оформлены это не еще не большая беда, далеко не всем проектам удается поддержать одинаковый стиль (хотя оно того стоит конечно).
    Почти все классы в основном проекте лежат, никаких папок и соответствия им нэймспэйсов (за редким исключением).

    Это тоже из плюсов - нормальные люди конечно пользуются неймспейсами, но там они не настолько вездесущи, как в C#, т.к. технология сборки в принципе иная.
    А у вас было подобное? Вы как-то решали эту проблему?

    А это кроме вашей команды во главе с тимлидом и даже с привлечением менеджеров никому не решить. Если вы готовы отрефакторить половину продукта - вперед. Не готовы - лучше не трогайте. Пишите новый код в адекватном стиле. Если бы это был C++, я бы даже вам посоветовал новый код оформлять по правилам проекта, но ЭТИ правила в рамках C# неадекватны совершенно.

    Резюмирую: если нет ресурсов на переработку кода - терпите. Терпение и способность работать с legacy кодом не самого высокого качества - вероятно самая важная черта "программиста в команде". Старый и не самый симпатичный код - это реальность, это так же реально, как и ветхие здания, которые просто так не перестроишь без серьезных вложений.
    Работал в одной организации полтора года, написал сам несколько проектов. код в плане оформления просто чуть ли не идеален. Без всякой чуши типа венгерской нотации и т.д.

    Вам везло в плане качества кода. Теперь не очень повезло. Как сказал AtomKrieg, хорошо что не Кобол (хотя б тогда вам платили еще больше).
    Над методами простые комментарии, а не XML или их вообще нет

    Нормальные XML-комментарии в C# коде это вообще роскошь. Я их вижу только в серьезных библиотеках, а во всяком корпоративном треше так комментятся только самые важные классы в программе (штук 10-15). Радуйтесь, что вообще есть документация. Если есть желание и время - переносите в код, это наверняка будет полезно.
    Ответ написан
    Комментировать
  • Область применения C, C++, C#?

    Nipheris
    @Nipheris Куратор тега C++
    > Хотел задать вопрос к опытным программистам.

    Ну раз опытным, то думаю разумно поделиться своим опытом. Итак, в чем участвовал за последние 5-6 лет, где были плюсы или шарпы. Три места работы, три команды:
    - десктопная софтинка наподобие 2ГИС - база данных услуг и предприятий с привязкой на карту. C#, карту отрисовывали сами с помощью Direct3D;
    - TCP-сервер GPS-трекеров (такие фиговины, отправляют по GRPS/SMS свои текущие GPS/ГЛОНАСС координаты + всякие плюшки для транспорта - уровень топлива, скорость движения и т.д. - зависит от модели). C++ и обыкновенные сокеты. Сервер небольшой, принимал именно данные от трекеров и писал в базу. Отображалось все на обыкновенном сайте с PHP в бэкенде.
    - веб-сервис, принимающий платежи по WebMoney Merchant и поддерживающий балансы на счетах клиентов. Открывал урл для серверов вебмани, плюс давал простейшие отчеты (проведена транзакция или нет, текущий баланс, транзакции на списание). C# (WCF), данные писались в PostgreSQL.
    - десктопное приложение для проходной - по отпечаткам пальцев входящих/уходящих сотрудников регистрировалось их время пребывания на предприятии. Ну и разумеется - отчеты, агрегации (время отработанное за неделю, опоздания, переработки и т.д.). C# + некоторые части на С++, соединяющие драйвер сканера отпечатков и библиотеку их распознавания по образцам.
    - здоровенное декстопное приложение на C++ + Qt, трейдинговый терминал (более 10к файлов исходников, команда из 30+ человек);
    - довольно объемный ГИС-проект на C#, клиент десктопный (WPF+SharpMap), серверная часть - ASP.NET WebAPI (JSON API).
    - планируется новый ГИС-проект с клиентом уже на C++ и Qt, т.к. существует нереально крутые рендереры на OpenGL от MapBox (тык), а большинству участников текущего проекта плевать - C++ или C#. Qt сейчас развивается очень серьезно, поэтому на сегодняшний день он выровнялся с C#+WPF, а т.к. рендерер на плюсах - то и клиента будем писать на плюсах. На сервере по-прежнему ASP.NET, вероятно новой версии (пока начнем писать, должна успеть выйти в релиз); тех, кто считает, что с ним "сложно в вебе" - аргументы в студию;
    - небольшой сайд-проект - рендер сложного 3D объекта для внедрения в рекламный ролик новой фантастической книги. С++ и OpenGL, написано быстро, дешево и сердито, отрисовано покадрово в PNG-шки, смонтировано в After Effects, все довольны.

    Вывод: поверьте, если инструмент подчиняется вам, то вам открыто много способов решения различных задач. Конечно, для Web-бэкенда C++ будет очень странным выбором, но лично у меня хватает задач и без бесконечных мелких сайтиков.

    Послесловие: безусловно, начинать лучше с того же Паскаля (да, я серьезно, отличный язык для обучения, дисциплинирует, и при этом не скрывает машину от программиста). Но если уж выучите С++, или хотя бы Си, то остальные языки после него будут как игрушки с наворотами. Конечно, для этого вам уже надо знать, что вы хотите стать программистом. Если еще не уверены - лучше попробовать на более простом языке, иначе перегорите не дойдя и до середины.
    Ответ написан
    12 комментариев
  • Как узнать что Task завершил свою работу?

    Nipheris
    @Nipheris Куратор тега C#
    Да, вы поняли правильно. На первый взгляд в коде проблемы нет (если он выполняется из GUI-потока и FromCurrentSynchronizationContext() дает контекст GUI-потока). Что-то не работает?
    Ответ написан
  • Как сделать изменяемый интерфейс на стороне клиента c# WinForm?

    Nipheris
    @Nipheris Куратор тега C#
    > Подскажите пожалуйста если есть какие мысли по решению данной задачи.
    Есть мысль поставить задачу более конкретно. Понять, что это за "поля", которые можно добавить, к каким сущностям будут привязаны эти поля, какие будут к этим полям запросы, будут ли поля глобальны для всех пользователей, или же они свои у каждого пользователя, и другим не видны.

    > Необходимо что бы администратор программы мог добавить новый label, текстовое поле, изображение, мб даже форму.
    Я не уверен в том, что вы действительно заходите администратору программы давать выполнять такие действия, т.к. он будет понемногу превращаться в программиста. Рано или поздно (а скорее всего рано) клиентам захочется добавлять еще и логику на формы, они попросят для этого язык, и уже целиком превратятся в программистов.

    Я представляю решение вашей задачи как мини-IDE + шелл для работы с базой (непонятно кстати, какой лучше - SQL или, например, документной) в одном флаконе. Такие решения в общем-то существуют и имеют смысл - достаточно вспомнить про 1C с его конфигурациями и средствами разработки, или, например, про Лексему. Однако, я не уверен, что вы хотите и сможете получить подобное решение, раз задаете такой вопрос). Мне все-таки кажется, что ваша проблема более частная, а желание дать возможность администратору клепать формочки - острый недостаток в проработанном техническом задании и/или нежелание вашего клиента платить вам в последствии за развитие и техническую поддержку продукта, которое выливается в попытку переложить рутинные задачи (эти самые "новые поля", "новые формы и лэйблы" и прочие вещи) на дешевые кадры. В общем-то в этом есть смысл, однако чтобы это организовать, нужно довольно много стартовых затрат.
    Ответ написан
    Комментировать
  • Как правильно регулировать уровень громкости?

    Nipheris
    @Nipheris Куратор тега C#
    Спасибо за суммон.
    В Висте и выше архитектура аудио подсистемы была переработана, поэтому современным API считается WASAPI, а WINMM считается устаревшим.
    Можно разобрать следующий пример: blogs.msdn.com/b/larryosterman/archive/2007/03/06/...

    Необходимые хедеры:
    #include <windows.h>
    #include <mmdeviceapi.h>
    #include <endpointvolume.h>


    Запустим COM:
    CoInitializeEx(NULL, COINIT_MULTITHREADED);

    Создадим перечислитель устройств:
    IMMDeviceEnumerator *deviceEnumerator = NULL;
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);


    Вытащим дефолтовый девайс:
    IMMDevice *defaultDevice = NULL;
    hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
    deviceEnumerator->Release();
    deviceEnumerator = NULL;


    Получим интерфейс для работы с громкостью (этот интерфейс полезен именно для работы с master-громкостью устройства):
    IAudioEndpointVolume *endpointVolume = NULL;
    hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
    defaultDevice->Release();
    defaultDevice = NULL;


    Получим предыдущее значение громкости:
    float currentVolume = 0;
    endpointVolume->GetMasterVolumeLevel(&currentVolume);


    Установим новое значение громкости:
    hr = endpointVolume->SetMasterVolumeLevel((float)newVolume, NULL);


    P.S. Не сразу обратил внимание, что у вас C#, постараюсь скорректировать ответ вечером.
    Ответ написан
    2 комментария
  • MVP как правильно вернуть переменную во ViewModel прогрессбара?

    Nipheris
    @Nipheris Куратор тега C#
    Посмотреть бы на код, который регулярно считывает progressVal из модели и пихает в прогресс-бар. Иными словами, SetValProg откуда еще вызывается, кроме как при старте? Лично я пока не вижу никакой проблемы с потоками, про которую говорит tex0, т.к. из другого потока устанавливается только интовое поле у Model.
    Ответ написан
    Комментировать
  • Как считывать символ нажатой клавиши?

    Nipheris
    @Nipheris Куратор тега C#
    Ответ написан
    Комментировать
  • Извлечение данных из sqlite c#?

    Nipheris
    @Nipheris Куратор тега C#
    "SELECT * FROM 'peoples';"

    select name, year, age, city from peoples
    Делать плановые запросы со звездочкой - моветон, оставьте звездочку для административной консоли.

    object getname = people[0];

    string name = peopleReader.getString(peopleReader.getOrdinal("name"));
    Ответ написан
    4 комментария
  • Как запустить C# код через браузер?

    Nipheris
    @Nipheris Куратор тега C#
    Так или иначе вам нужно выставить веб-сервис наружу. amf1k предложил один из вариантов. Можно WebAPI, можно WCF, можно и Nancy взять. Если код программы недоступен для модификации, тогда вызывайте ее из ком. строки (хотя так будет менее гибко - сложно будет получить, например, текущий статус операции с файлами).
    Ответ написан
    1 комментарий
  • Как проверить все биты в байте?

    Nipheris
    @Nipheris Куратор тега C#
    Такие конструкции if надо заменять на словарь.

    Если у вас индексы последовательные и начинаются с нуля, то роль словаря может сыграть список или массив.
    В любом случае, вам нужно сделать отображение "номер бита" => "сообщение".

    Номер бита предлагаю сохранять, чтобы было удобнее записывать таблицу и идти по ней циклом. Оператор сдвига даст вам нужную константу для операции "И".
    Итого:
    using System;
    using System.Collections.Generic;
    
    public class Test
    {
    	private static void AddMessage(Tuple<string, string> message)
    	{
    		Console.WriteLine("{0}, {1}", message.Item1, message.Item2);
    	}
    	
    	public static void Main()
    	{
    		byte val = 176;
    		
    		for (int i = 0; i <= 7; i++)
    		{
    			if ((val & (1 << i)) != 0)
    				AddMessage(messageByBitIndex[i]);
    		}
    	}
    	
    	private static Tuple<string, string>[] messageByBitIndex =
    	{
    		Tuple.Create("1", "А1"),  // 0
    		Tuple.Create("1", "А2"),  // 1
    		Tuple.Create("2", "Б1"),  // 2
    		Tuple.Create("2", "Б2"),  // 3
    		Tuple.Create("1", "АА1"), // 4
    		Tuple.Create("1", "АА2"), // 5
    		Tuple.Create("2", "ББ1"), // 6
    		Tuple.Create("2", "ББ2"), // 7
    	};
    }


    ideone.com/vbLapl
    Ответ написан
    1 комментарий
  • Воспроизведение музыки WPF?

    Nipheris
    @Nipheris Куратор тега C#
    Есть еще либа на свете - NAudio. Можно ей попробовать. Возможно, она сама не умеет качать по урлу, тогда скачайте сами WebClient-ом и отдайте либе.
    Ответ написан
    Комментировать
  • Как создать новоге окна используя паттерн MVVM, используя существующий ViewModel?

    Nipheris
    @Nipheris Куратор тега C#
    > PersonsList
    советую форму назвать PersonsListWindow.

    Потом вам надо создать еще одну вьюмодельку - PersonsListViewModel, которая будет вьюмоделью для ВСЕЙ ФОРМЫ в целом, и у которой будет свойство Persons/PersonViewModels типа IObservableCollection. В этой коллекции у вас будут все вьюмодельки для каждого человека. Тогда вы вашей форме PersonsListWindow должны будете назначить PersonsListViewModel в качестве DataContext, а уже ваш контрол списка (ListView например, или DataGrid, смотря что там у вас) забиндить на свойство Persons/PersonViewModels. Это будет что называется, "по паттерну". Итого:
    1) personsListWindow.DataContext = new PersonsListViewModel();
    2) в XAMLе контрол-список (его свойство ItemsSource) биндите на свойство PersonViewModels
    3) каждый элемент списка автоматически сопоставляется с вьюмоделькой из ObservableCollection.

    Если потом на форму добавите еще контролы, то и во вьюмодельку для формы (PersonsListViewModel) сможете добавить еще данные для показа/модификации. Например, захотите в этом списке выбирать ответственного за работу человека - тогда можно сделать в PersonsListViewModel свойство Leader типа PersonViewModel. Или если у вас там будут кнопки Создать/Удалить - то можно выставить соответствущие ICommand-объекты.
    Ответ написан