Задать вопрос
  • На чем лучше реализовать фоновую задачу в браузере?

    @cicatrix
    было бы большой ошибкой думать
    Background Service - правильный вариант.
    Условия его работы и тех действий, которые надо выполнить можно настроить
    Ответ написан
    Комментировать
  • Как отсортировать список из массивов?

    @cicatrix
    было бы большой ошибкой думать
    Создай сравиватель для сортировки:
    class ArrayComparer : IComparer<int[]>
    {
        public int Compare(int[] x, int[] y)
        {
            if (x is null || y is null) throw new ArgumentNullException();
            if (x.Length < 2 || y.Length < 2) throw new ArgumentException("Сравниваемые массивы должны иметь минимум 2 элемента");
            int comparisonResult = x[0].CompareTo(y[0]);
            if (comparisonResult == 0) comparisonResult = x[1].CompareTo(y[1]);
            return comparisonResult;
        }
    }
    Ответ написан
    Комментировать
  • System.OperationCanceledException Как правильно закрыть порт?

    @cicatrix
    было бы большой ошибкой думать
    А не проще ловить событие порта DataReceived?

    ...
    
    _serialPort.Open();
    _serialPort.DiscardInBuffer();
    _serialPort.DataReceived += SerialPort_DataReceived;
    _serialPort.ErrorReceived += SerialPort_ErrorReceived;
    
    ...
    
      public static void Disconnect()
            {
                try
                {
                    if (_serialPort is not null && _serialPort.IsOpen)
                    {
                        _serialPort.DataReceived -= SerialPort_DataReceived;
                        _serialPort.ErrorReceived -= SerialPort_ErrorReceived;
                        _serialPort.Close();
                    }
                } // try
                catch(Exception ex)
                {
                    Log.Error(ex, "Error closing the serial port.");
                } // 
            } // Disconnect
    ...
    
    
     private static void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                if (_serialPort?.IsOpen != true) return;
    
                try
                {
                    var encoding = _serialPort.Encoding;
                    var bytesRead = _serialPort.Read(_buffer, 0, _serialPort.BytesToRead);
                    var rawBytes = new ReadOnlyMemory<byte>(_buffer, 0, bytesRead);
    
                    var maxCharCount = encoding.GetMaxCharCount(bytesRead);
                    var charArray = ArrayPool<char>.Shared.Rent(maxCharCount);
    
                    var charsProduced = encoding.GetChars(
                        rawBytes.Span,
                        charArray.AsSpan()
                    );
    
                    var scannedData = new ScannedData(
                        rawBytes,
                        new ReadOnlyMemory<char>(charArray, 0, charsProduced)
                    );
    
                    IncomingData.Enqueue(scannedData);
                    DataReceived?.Invoke(null, new DataReceivedEventArgs(scannedData));
    
                    ArrayPool<char>.Shared.Return(charArray);
                } // try
                catch (Exception ex)
                {
                    Log.Error(ex, "Error processing barcode data");
                } // catch
            } // _serialPort_DataReceived
    Ответ написан
  • Считается ли моветоном отсутствие переноса для открывающей фигурной скобки?

    @cicatrix
    было бы большой ошибкой думать
    Пока ты работаешь один, можешь делать как хочешь.
    Когда работаешь в команде - надо придерживаться общего стиля.
    Ответ написан
    Комментировать
  • Как из класса, реализующего интерфейс, вызвать реализацию метода по умолчанию?

    @cicatrix Автор вопроса
    было бы большой ошибкой думать
    Василий Банников, на SO нашёл вот такой костыль:
    public class HappyGreeter : IGreeter
    {
        private interface IWorkAround : IGreeter
        {
            public void SayHello(string name)
            {
                (this as IGreeter).SayHello(name);
                System.Console.WriteLine("I hope you're doing great!!");
            }
        }
    
        private class WorkAround : IWorkAround {}
    
        public void SayHello(string name)
        {
            ((IWorkAround)new WorkAround()).SayHello(name);
        }
    }
    Ответ написан
  • Почему возвращается \0 при вводе русских букв в консоли C#?

    @cicatrix Автор вопроса
    было бы большой ошибкой думать
    Доходило долго, но я справился.
    Внутри строки в нынешнем шарпе хранятся в utf-16, а в консоли - в utf-8.
    чтобы работало, надо указать явно кодировку utf-16:
    Console.InputEncoding = System.Text.Encoding.GetEncoding("utf-16");
    Console.WriteLine("Hello, World!");
    var ans = Console.ReadLine();
    Console.WriteLine(ans);

    Может, кому пригодится.
    Ответ написан
    1 комментарий
  • WPF. Почему не стреляет PreviewMouseDown?

    @cicatrix Автор вопроса
    было бы большой ошибкой думать
    А ларчик просто открывался. Просто надо было сделать vh.IsHitTestVisible = false;
    Ответ написан
    Комментировать
  • Почему счётчик таймера на windows forms увеличивается на 2, а не на 1?

    @cicatrix
    было бы большой ошибкой думать
    У тебя скорее всего две подписки на Tick оформлено.
    Вот эта строчка у тебя в конструкторе:
    timer1.Tick += timer1_Tick;
    И ещё точно такая же, скорее всего, в Form1.Designer.cs присутствует. Убери одну из них
    Ответ написан
    Комментировать
  • Способы блокировки программ на фрилансе?

    @cicatrix
    было бы большой ошибкой думать
    Вынеси критичную часть бизнес-логики на внешний сервер. Это лучше, чем авторизация на сервере, потому что если перехватить запрос и подменить ответ сервера можно, то заменить работу критически-важного метода - нельзя. После оплаты можно скинуть плагин, делающий то же самое, только локально.
    Ответ написан
    Комментировать
  • Как подставить вместо foreign key значение?

    @cicatrix
    было бы большой ошибкой думать
    SQL JOIN - соединение таблиц базы данных
    https://function-x.ru/sql_join.html
    Ответ написан
    Комментировать
  • Все говнокодеры?

    @cicatrix
    было бы большой ошибкой думать
    Благими намерениями мостится дорога в ... говнокод.
    Вот здесь надо быстро, лень смотреть, зафигачу прямой запрос.
    Вот в этом классе сделаю это поле public. Тест провалился, хорошо, добавлю отдельный if для этого случая. А вот здесь какая-то хрень написана, ладно, напишу ещё один метод, делающий то же самое, но по-моему. Ой, а в этой либе фича новая. А вот тут жалуются, что медленно, пох, закэшируем данные... В общем, даже хорошо задуманный проект со временем обрастает вот этим вот всем. Ни разу не видел, чтобы было по-другому (видел, кривую архитектуру изначально, ещё видел полное отсутствие архитектуры как таковой).
    Ответ написан
    Комментировать
  • Как из byte[] звукового файла получить спектр с помощью FFT?

    @cicatrix
    было бы большой ошибкой думать
    Гугл в помощь, как говорится:

    Делай раз: Быстрое преобразование Фурье
    Делай два: Алгоритм Кули — Тьюки
    Ответ написан
    Комментировать
  • Как сделать сканирование COM-портов и добавление в ComboBox?

    @cicatrix
    было бы большой ошибкой думать
    В своё время делал перечисление последовательных портов так, но не уверен, что это есть хорошо.
    Тоже интересно было бы узнать, можно ли сделать поэлегантнее:
    using System.Management;
    
    public static Dictionary<string, ManagementBaseObject> EnumerateComPorts()
    {
        Dictionary<string, ManagementBaseObject> result = new Dictionary<string, ManagementBaseObject>();
        string[] ports = SerialPort.GetPortNames();
        foreach (string port in ports)
        {
            using (var entitySearcher = new ManagementObjectSearcher(
                "root\\CIMV2", $"SELECT * FROM Win32_PnPEntity WHERE Caption LIKE '%{port}%'"))
            {
                var matchingEntity = entitySearcher.Get().Cast<ManagementBaseObject>().FirstOrDefault();
                if (null != matchingEntity)
                {
                    result.Add(port, matchingEntity);
                }
            } // using
        } // foreach
        return result;
    } // EnumerateComPorts


    Далее, уже сделал Listener на нужный порт и ждал данные:
    public RS232Listener(string portname)
            {
                m_queue = new Queue<string>();
                try
                {
                    if (null != m_port)
                    {
                        m_port.Close();
                        m_port.Dispose();
                        GC.Collect();
                        GC.WaitForPendingFinalizers();
                    }
                    m_port = new SerialPort(portname, 9600, Parity.None, 8, StopBits.One);
                    m_port.DataReceived += this.M_port_DataReceived;
                    m_port.ErrorReceived += this.M_port_ErrorReceived;
                    m_port.Open();
                } // try
                catch(Exception ex)
                {
                    Logger.LogError("RS232Listener constructor", ex.Message, ex);
                    ErrorMessage = ex.Message;
                    ErrorState = true;
                }
            } // RS232Listener constructor
    Ответ написан
  • Как из массива получить слова начинающиеся с заглавной буквы и поместить их в list?

    @cicatrix
    было бы большой ошибкой думать
    https://onlinegdb.com/3ME6NWfmb
    using System;
    using System.Linq;
    
    class SplitToUpper {
      static void Main() {
          var input = "Это тестовое предложение, Некоторые из Слов начинаются с Заглавной буквы";
          var words = input.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
          var output = words.Where(w => char.IsUpper(w[0])).Reverse().ToArray();
          foreach(var word in output) 
            Console.WriteLine(word);
      } // Main
    } // class SplitToUpper


    Вывод:
    Заглавной
    Слов
    Некоторые
    Это
    Ответ написан
    Комментировать
  • Как обновить тип данных у в приложении в visual studio после редактирования в БД?

    @cicatrix
    было бы большой ошибкой думать
    Это решается форматированием вывода значений. Да и тип данных в базе менять было не обязательно.
    Ответ написан
    Комментировать
  • Бесконечный цикл, что за дичь?

    @cicatrix
    было бы большой ошибкой думать
    Цикл останавливается, это Paint вызывается каждый раз, когда форма отрисовывается.
    Поставил точку останова в Paint - отлично. Когда ты запустишь программу исполняться дальше, отрисовка должна будет произойти заново и снова вызовется Paint. И так будет каждый раз, когда окно будет скрыто или частично перекрыто.
    А обновлять текстбокс в Paint - за многие годы, ничего подобного видеть не доводилось. Вам удалось меня удивить.
    Ответ написан
    Комментировать
  • Что нужно и на каком уровне знать в математике чтобы читать Дональда Кнута?

    @cicatrix
    было бы большой ошибкой думать
    Если честно, думаю, что искусство программирования читают только, чтобы выпендриться. Практически же, никаких особых навыков книга не даёт. Да, как академический труд можно почитать, иногда даже интересно, горизонты расширяет, в целом. Но вот как программисту лично мне эта книга абсолютно ничего не дала.
    Ответ написан
    9 комментариев
  • Должен ли я запоминать это все?

    @cicatrix
    было бы большой ошибкой думать
    Гугл в помощь, как говорится, программист - это человек, который умеет гуглить. Всё помнить невозможно. Если часто пишешь и используешь, знания откладываются. Если давно чем-то не занимался, иногда забываются даже тривиальные вещи.
    Ответ написан
    Комментировать
  • Как написать юнит тест для ввода с клавиатуры?

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

    1. Зачем ввод с клавиатуры в отдельном потоке, да ещё и с очередью, если ReadLine() блокирующий метод.
    2. Convert.ToInt32() выдаст исключение, если аргументом будет строка, не содержащая цифры.
    3. num == "q" || num == "Q" - есть методы .ToLower(), ToUpper(). Название переменной num абсолютно нелогично, если оно не числовое.
    4. Ещё тестом надо покрыть PumpMessage(), чтобы проверить, выходит ли программа из цикла

    UPD: Вот рефактор, который делает более-менее то же самое, и его можно тестировать:
    using System;
    using System.Linq;
    using System.Collections.Generic;
    
    class Program {
    
      static List<int> _numbers = new List<int>();  
      static void Main() {
        while(UserInput(Console.ReadLine()));
        Console.WriteLine($"Sum is: {CalcSum(_numbers)}");
      }
      
      static bool UserInput(string input)
      {
          if(string.IsNullOrEmpty(input)) return false;
          if(!int.TryParse(input, out int number)) return false;
          _numbers.Add(number);
          return true;
      }
      
      static int CalcSum(IEnumerable<int> numbers)
      {
          return numbers.Sum();
      }
    }


    Тесты для UserInput
    UserInput получает на вход null и должен вернуть false
    UserInput получает на вход "" и должен вернуть false
    UserInput получает на вход что угодно, кроме числа и должен вернуть false
    UserInput на вход число и возвращает true

    Тесты для CalcSum
    Получает на вход пустой список и возвращает 0
    Получает на вход массив [1, 2] возвращает 3
    (ну для пущей надёжности можно ещё добавить проверку входящего аргумента на null) и проверить, выбрасывается ли исключение
    Ответ написан
  • Какое регулярное выражение использовать, что бы достать все подстроки начинающиеся с одного слова?

    @cicatrix
    было бы большой ошибкой думать
    Если нужно просто разделить, то подойдёт и string.Split();
    А вообще, парсить JSON регулярками, когда есть нормальные парсеры как-то странно, по меньшей мере.
    Ответ написан