Ответы пользователя по тегу C#
  • Как добавить grammar файл в готовый exe-файл?

    @Sumor
    у Grammar есть конструктор, принимающий Stream.
    Соответственно, вы ресурс представляете в виде Stream (например, через GetManifestResourceStream) и подставляете в конструктор.
    Ответ написан
    7 комментариев
  • Как реализовать отрисовку префиксного дерева?

    @Sumor
    Ищите что-то с названием OrgChart.
    Например, на WinForms
    https://documentation.devexpress.com/WindowsForms/...
    или на WPF
    https://www.grapecity.com/en/controls/wpf/orgchart
    Ответ написан
    Комментировать
  • Не получается на c# .NET 2.0 отправить get запрос, в чем ошибка?

    @Sumor
    req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

    Поддержки этого нет в Windows XP.
    Для получения полной ошибки не забывайте обрамлять try-catch и выводить полный текст сообщения, который и подскажет вам причину ошибки.
    Ответ написан
    7 комментариев
  • В чем нарисовать и сохранить в файл график без сильной привязки к GUI?

    @Sumor
    Можно в консоль подтянуть wpf классы и сделать через WritableBitmap по точкам или DrawinImage по линиям. Сохранить можно хоть в png, хоть в jpg.
    Можно в консоль подтянуть Winforms классы и сделать через Bitmap по точкам.

    Можно воспользоваться библиотечками, например Magick.NET.
    Ответ написан
    Комментировать
  • Как обработать выборку из базы построчно?

    @Sumor
    Хоть так
    using(var reader = sqliteCommand.ExecuteReader())
    {
      while(reader.Read())
      {
        // вызов вашего метода для конкретной строчки
      }
    }

    Хоть так
    using(var reader = sqliteCommand.ExecuteReader())
    {
      // вызов вашего метода для reader, где вы будете сами перебирать строчки  
    }


    А если хотите поиграться с делегатами (если у вас, например, несколько вариантов обработки методами всей базы)
    Тогда передаёте хоть банальный Action (в том числе и в виде лямбда выражения) в функцию считывания и...

    void Do()
    {
      DoSmthWithDB((Action<DataReader>)((reader) => {Console.WriteLine(reader[0].ToString());}));
    }
    
    void DoSmthWithDB(Action<DataReader> myAction)
    {
    ...
    // Создание команды к БД
    ...
    using(var reader = sqliteCommand.ExecuteReader())
    {
      while(reader.Read())
      {
        myAction(reader); // Action<DataReader> переданный в виде параметра
      }
    }
    }
    Ответ написан
    Комментировать
  • Почему не работает UPDATE c#?

    @Sumor
    Возможно требуется точка с запятой в конце выражения?
    Ответ написан
  • Клиент-серверное приложение UDP Socket?

    @Sumor
    UDP и TCP это разные протоколы над протоколом IP.
    TCP устанавливает соединение и ведёт "разговор" между клиентом и сервером в рамках установленного соединения, пока кому-нибудь из них не надоест. В простейшем случае устанавливается соединение, клиент посылает запрос, сервер отправляет ответ. Размер полученных и отправляемых данных не ограничивается размером пакета. Пакетов может быть много, также может быть много запросов-ответов в рамках одного соединения. Доставку всех пакетов TCP гарантирует. В том смысле, если соединение есть, то отправленные вам данные будут доставлены.
    UDP по сути просто отправка данных на какой-то адрес. Обработали его там или не обработали - для того, чтобы вам это узнать нужна дополнительная синхронизация. Размер передаваемых данных определяется размером пакета - максимум MTU, для Ethernet это 1500 байт. Может быть больше или меньше. Есть возможность отправить и больше данных, но они будут разбиты по частям и какие-то из них могут не дойти.
    Аналогия примерно такая: TCP - телефон: соединение устанавливается, дальше идёт разговор между собеседниками. UDP - радиообмен: нажали PTT, говорите, но вы не знаете находится ли ваш абонент в зоне действия радио и услышит ли вас.

    Для реализации и клиента и сервера UDP на C# можно использовать класс UDPClient. Он один и на сервер и на клиент. Для приёма сообщений сервер открывает порт на чтение. Размер принимаемых данных ограничен приёмным буфером. Если данные приходят, а вы их не успеваете обрабатывать - они затираются.
    UDP используют для передачи данных, для которых критично время получения, но не критичен сам факт получения.
    Для понимания того как ходят пакеты и устанавливается соединение используйте Wireshark или подобные программы.
    Ответ написан
    Комментировать
  • Как определить, попадает ли точка в заштрихованную область?

    @Sumor
    Круг:
    (x - x0)^2+(y-y0)^2 < R^2 - множество точек внутри круга
    (x - x0)^2+(y-y0)^2 > R^2 - множество точек вне круга
    R - радиус круга, x0, y0 - координаты центра

    Эллипс:
    ((x - x0)/a)^2+((y-y0)/b)^2 < 1 - множество точек внутри эллипса
    ((x - x0)/a)^2+((y-y0)/b)^2 > 1 - множество точек вне эллипса
    a, b - радиусы эллипса

    Прямые:
    x < 0 - множество точек левее оси 0Y
    x > 0 - множество точек правее оси 0Y
    y < 0 - множество точек ниже оси 0X
    y > 0 - множество точек выше оси 0X
    ax+by < c множество точек ниже прямой, заданной уравнением ax+by = с
    ax+by > c множество точек выше прямой, заданной уравнением ax+by = с

    Для вашей задачи:
    1. Находите нужные коэффициенты для всех прямых и кривых.
    2. Выясняете для каждого уравнения знак, который получается при попадании точки в заштрихованной области
    3. Создаёте набор тестов для точки.

    Например для зоны B:
    Точка должна быть внутри круга, вне эллипса и выше прямой, то есть должны выполняться следующие неравенства (коэффициенты a, b x0, y0 для каждого неравенства свои):
    (x - x0)^2+(y-y0)^2 < R^2
    ((x - x0)/a)^2+((y-y0)/b)^2 > 1
    ax+by > c
    Дальше для тестовой точки проверяете неравенства, и если они все правильные - точка принадлежит заштрихованной области.
    Ответ написан
    Комментировать
  • Wpf Mvvm Как получить значение из другой формы?

    @Sumor
    У вас одна ViewModel, которую и передаёте из одной формы в другую (устанавливаете, например, в DataContext). По нажатию клавиши во второй форме сохраняете то, что вам нужно в переданной ViewModel и автоматически эта информация станет доступной в первой форме.

    void button_click(object sender, RoutedEventArgs e)
    {
      var form = new Form2(){DataContext = DataContext};
      form.ShowDialog();
    }
    Ответ написан
    Комментировать
  • Номера ошибок. Требуется однократно указать номер ошибки в коде. Есть хорошая практика?

    @Sumor
    Используйте для своих ошибок свой класс исключений. Так вы отделите свои ошибки от чужих.
    В качестве номера ошибок используйте enum с явным указанием числового значения - с одной стороны в своём коде вы используете понятные буквенные обозначения, с другой - у вас есть их числовое значение.
    public MyException : Exception
    {
      public enum MyErrorCodeEnum { Error1 = 1, Error2 = 2, Error22 = 22};
      
      private MyErrorCodeEnum _myErrorCode;
      public MyErrorCodeEnum MyErrorCode
      {
        get {return _myErrorCode;}
      }
    
      public MyException(MyErrorCodeEnum errorCode)
      {
        _myErrorCode = errorCode;
      }
    }
    Ответ написан
    2 комментария
  • Почему ошибка Argument is out of range?

    @Sumor
    При первом запуске у вас список AllSymbols видимо чем-то заполнен.
    Перед вторым запуском вы его очищаете: AllSymbols.Clear()
    А затем
    int rnd = Random.Range(0, AllSymbols.Count);
    
    while (AllSymbols[rnd].GetComponent<Text>().text != "-")
                    rnd = Random.Range(0, AllSymbols.Count);

    С учётом того, что AllSymbols.Count == 0, Random.Range(0, 0) я даже не знаю что возвратит. В любом случае у вас нет ни AllSymbols[0], ни тем более AllSymbols[-1]
    Ответ написан
    2 комментария
  • Как полностью очистить массив?

    @Sumor
    Вы можете после использования сделать:
    checkAddDel = null;
    или
    checkAddDel = new int[0];
    А заполненный ранее массив уничтожится сборщиком мусора.
    Ответ написан
    Комментировать
  • Как правильно перевести длину в прямоугольных координатах в проекцию wgs84?

    @Sumor
    Вопрос в том насколько точно вам нужно провести расчёты.
    В первом и самом простом приближении можно использовать следующее:
    Для точки полигона с заданными координатами X, Y вычислить примерные коэффициенты перевода в метры для данной точки.
    Для широты это примерно 6356752/360~17657 метров на градус
    Для долготы вычисляется в зависимости от широты, для каждой точки отдельно: 6378137/360 * cos(широты)
    Например, если вам нужно найти примерные координаты точек отстоящих от точки с координатами (55,0000; 37,0000) на 1000 метров, то:
    17657 метров на градус широты дают нам расстояние в 0,056634762 градуса на 1000 метров
    Для долготы: 6 378 137/360 * cos(55 градусов) ~ 10162 метров на градус, что даёт 0,098405826 градуса на 1000 метров.
    Итого нужные нам точки лежат в пределах 55+dY; 37+dY, где (dx/0,056634762)^2 + (dy/0,098405826)^2 < 1000^2

    Подсчёты примерные, и наверняка с ошибками, но общий смысл должен быть понятен. Точность данных расчётов около метра, нужно больше - считайте точнее. При увеличении расстояний начнёт сказываться кривизна земли и данный метод станет совсем неточным.
    Ответ написан
  • Как копировать выбранные папки C#?

    @Sumor
    На входе IEnumerable или IEnumerable. Тогда:
    void perebor_updates(IEnumerable<DirectoryInfo> dirs)
    {
      foreach(var dir in dirs)
    ...
    }

    или
    void perebor_updates(IEnumerable<string> dirNames)
    {
      foreach(var name in dirNames)
      {
        var dir = new DirectoryInfo(name);
    ...
      {
    ...
    }


    А дальше у вас есть рекурсивная функция, принимающая одну папку в качестве параметра и выполняющая нужное действие.
    Ответ написан
    1 комментарий
  • C# .Net Как изменить имя и расширение в другой папке?

    @Sumor
    Как-то так, рекурсивно:

    string name = @"C:\Путь";
    DirectoryInfo dir = new DirectoryInfo (name);
    ChangeNameRecursive(dir);


    void ChangeNameRecursive(DirectoryInfo dir)
    {
      int i = 0;
      foreach(var item in dir.GetFiles())
      {  
        File.Move (item.FullName, name + "test_" + i.ToString() + ".pp");
        i++;
      }
      foreach(var d in dir.GetDirectories())
      {  
        if(d.Name == "." || d.Name == "..") continue;
        ChangeNameRecursive(d);
      }
    }
    Ответ написан
  • Как задать координаты прямоугольника без StackPanel?

    @Sumor
    Рисуй на Canvas - есть и координаты и размеры.
    Ответ написан
    Комментировать
  • Как избавится от A call to PInvoke function unbalanced the stack?

    @Sumor
    Все вызовы WinApi являются stdcall (winapi). Отличие от Cdecl - как раз в том, кто прочищает стек с параметрами.
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    public static extern int CallNextHookEx(IntPtr hhk, int nCode, MouseMessages wParam, [In]MSLLHOOKSTRUCT lParam);
    Ответ написан
    Комментировать
  • Как вычислить сумму с факториалами (C# консольное приложение)?

    @Sumor
    Во-первых, у вас должно быть sin(n!), так как факториал определён (если не считать извращенцев с мехмата) для натуральных чисел. На области значений sin, это только число 1, так что здесь явная опечатка.
    Во-вторых, так как это задача по информатике, то её вам дали для того, чтобы проверить ваши знания в написании алгоритмов и разбиения задачи на части.
    Задачу можно решить рекурсивно, а можно в цикле. Всё зависит от того, что хочет увидеть преподаватель.
    Ответ написан
    Комментировать
  • Как при обновлении переменной TText обновить TextBox Text?

    @Sumor
    Без извращений никак, так как статическое поле не может быть субъектом INotifyPropertyChanged и тп.
    Нужно либо строить промежуточную обёртку, поддерживающую логику оповещения об изменении, либо вручную оповещать Binding об изменении через UpdateSource.
    Ответ написан
    Комментировать
  • Иммутабельность строк?

    @Sumor
    1. Неизменяемость строк используется при операциях сравнения - сравниваются только указатели. Ещё есть вопросы экономии места при повторном использовании, но не уверен, что здесь можно много выиграть.
    2. Для активной работы со строками как раз и используются StringBuilder. по сути они представляют собой выделенный массив большого размера, в рамках которого происходит работа со строкой. Во время манипуляций новый массив не создаётся - всё происходит по месту, если не превышается выделенный размер. Если буфера не хватит - выделяется новый, большего размера. Текущий размер буфера можно узнать из свойства Capacity, его можно сразу задать достаточно большим.
    Ответ написан
    3 комментария