• Нужно ли использовать структуры в C#?

    @Sumor
    Используйте классы, если вы не видите преимуществ использования структур в вашем коде.
    Не уверен, что использование структуры со строкой внутри в листе быстрее использования аналогичного класса. Особенно по сравнению со временем доступа к СУБД.
    Подробнее про структуры в MSDN
    Структуры можно использовать:
    1. Если у вас связь с неуправляемым кодом, где ожидается подобная структура.
    2. Если вам критично использование value-типов.
    При этом нужно не забывать об особенностях их использования, например, что при присваивании или передачи в функцию структура копируется. Наверняка можно написать пример, где из-за этого производительность работы с большой структурой будет ниже, чем с классом.
    Ответ написан
    Комментировать
  • Как правильно сравнить массивы и оценить их схожесть?

    @Sumor
    Правильного способа сравнить два массива с двумя и более элементами не существует в принципе.
    Допустимые способы сравнения зависят от вашей предметной области, от того откуда берутся эти самые круги с числами. Какая мощность массивов? Одинаковая ли она? Это набор чисел (множество) или их порядок на круге имеет значение? Числа представлены количественной шкалой (можно проводить математические расчёты) или это качественные значения (математические расчёты невозможны или не имеют логического смысла)?
    В качестве меры схожести можно выбрать, например:
    1. Количество разных элементов: [1,2,3,4,5,7,2,8] [2,9,5,5,7,2,8,1] - мера равна 2
    2. Сумма модулей разности элементов: [1,2,3,4,5,7,2,8] [1,2,3,4,6,7,4,8] - мера равна 3
    3. Аналог расстояния Левенштейна: [1,2,3,4,5,7,2,8] [2,3,4,5,7,2,8,1] - мера равна 2
    Ответ написан
    Комментировать
  • Как открыть шаблон Word, находящийся в ресурсе проекта (*.resx)?

    @Sumor
    Шаблон из ресурсов нужно сохранить куда-нибудь на диск, например, во временную папку, и указывать временный путь.
    Ответ написан
    1 комментарий
  • Кто может объяснить алгоритм Умножение Карацубы?

    @Sumor
    ab × cd
    По формуле получаем:
    (a × c) × 1000   +   b × d   +   ( (a + b) × (c + d) - a × c - b × d ) × 100 =
    = 1000 × a × c + b × d  + ( a × c + a × d + b × c + b × d - a × c - b × d ) × 100 =
    = 1000 × a × c + b × d  + ( a × d + b × c )  × 100 =
    = 1000 × a × c + 100 × a × d + 100 × b × c + b × d

    Итого получили классическое умножение столбиком, только в стоичной системе счисления.
    Только в классическом умножении у нас четыре умножения, а в предложенном алгоритме всего три.
    Ответ написан
    4 комментария
  • Как задать другого пользователя при подключении через Microsoft SQL Server 2014?

    @Sumor
    Можно запустить Management Studio или sqlcmd через runas с указанием нужных вам логинов и паролей.
    Ответ написан
    Комментировать
  • Очень медленная работа MS SQL с VS 2013, в чем причина?

    @Sumor
    Долгое соединение с MSSQL может быть из-за проверки сертификатов клиентского компьютера.
    В Internet Explorer, на сервере с MSSQL нужно отключить проверку отозванных сертификатов.

    Internet Explorer -> "Internet Options" -> Advanced".
    Отключить:
    Проверять аннулирование сертификатов издателей (Check for publisher's certificate revocation)
    Проверять аннулирование сертификатов серверов (Check for server certificate revocation)
    Ответ написан
    Комментировать
  • Почему не открывается диалог WPF?

    @Sumor
    В целом, то что вы закрыли диалог совершенно не означает, что ваша длительная операция прервалась.
    backgroundWorker.CancelAsync(); всего лишь информирует задачу, что её прерывают. Внутри обработчика backgroundWorker должна быть специальная проверка свойства CancellationPending, при установке которого нужно выполнять выход из потока обработки.
    Закрытие формы не уничтожает поток с задачей - она будет выполняться, пока не дойдёт до конца.
    Скорее всего при повторном открытии формы у вас происходит конфликт с ресурсами, которые уже используются первым потоком обработки.

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

    @Sumor
    Нужно переключиться, по необходимости, в поток, которому принадлежит TextBox.
    Для проверки используется функция CheckAccess(). Её нет в Intellisence (то есть в автодобавлении), но она нормально компилируется.
    Если вы находитесь не в нужном потоке, то для вызова кода в нужном используется функция Invoke, от объекта Dispatcher того объекта, в потоке которого нужно выполнить код.
    Код примерно такой (возможны синтаксические ошибки - нет под рукой студии):
    void AddText(string message)
    {
       if (!textbox.CheckAccess())
       {
           textbox.Dispatcher.Invoke(new Action<string>(AddText), message);
       }
       else
       {
           textbox.AppendText(message);
       }   
    }
    Ответ написан
    5 комментариев
  • Как сделать динамический список CheckBox в WPF ?

    @Sumor
    В простейшем случае это должно выглядеть где-то так:
    XAML:
    <ListBox x:Name="lst">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Value}" />
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    В коде, например:
    lst.ItemsSource = new List<KeyValuePair<int, string>>()
    {
        new KeyValuePair<int, string>(1, "1"),
        new KeyValuePair<int, string>(2, "2"),
    };

    Данный код покажет вам ваш список с чекбоксиками. К чекбоксу можно привязать событие на изменение и отлавливать какой элемент зачекили или расчекили.
    При желании можно получить список отмеченных, но это не так тривиально.

    Лучше использовать для отображения объект у которого есть логическое свойство, например IsChecked, и его привязать к IsChecked CheckBox.
    Например:
    Класс:
    class MyClass
    {
        public int id { get; set; }
        public string Name { get; set; }
        public bool IsChecked { get; set; }
    }

    XAML:
    <ListBox x:Name="lst">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <CheckBox Content="{Binding Name}" IsChecked="{Binding IsChecked}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    Добавление элементов:
    lst.ItemsSource = new List<MyClass>()
    {
        new MyClass(){id=1, Name="1"},
        new MyClass(){id=2, Name="2"},
    };

    В таком случае отметка пользователем галочки сразу отражается в привязанном списке и можно легко получить список отмеченных:
    foreach(var tObj in (lst.ItemsSource as List<MyClass>).Where(myObj => myObj.IsChecked))
        MessageBox.Show(tObj.Name);
    Ответ написан
    2 комментария
  • Есть ли простой в реализации алгоритм нахождения простых чисел?

    @Sumor
    Для больших чисел поиск решетом Эратросфена долгий, поэтому используется тест Ферма
    Подробнее и с реализацией
    Ответ написан
  • Как освободить память в C# в unsafe?

    @Sumor
    Я могу конечно сильно ошибаться, но что-то я тут не вижу выделения памяти.
    surfase — указатель, переменная освободится в конце блока.
    tmpSurface — кусок памяти, существующий до и после блока. Как он был получен, так и освобождать, — вне блока unsafe.
    textureWidth, textureHeight — внешние, относительно блока, переменные. Скорее всего числовые. Их управлением также занимается кто-то другой вне этого блока.
    surfase->w, surfase->h — скорее всего здесь просто присваивание и выделения памяти не происходит.
    Ответ написан
  • Можно ли избежать принудительного возврата false в C#?

    @Sumor
    В C# функция во всех возможных путях выполнения должна либо возвратить какое-либо значение возвращаемого типа, либо вызвать исключение.
    В вашем случае я вижу три варианта:
    1. Оставить всё как есть. Удобно, если нужно в случае отсутствия ключа возвращать значение по-умолчанию.
    2. Возвращать вместо bool объект типа Nullable (короткая запись bool?). В этом случае последний оператор будет return null. И вызывающие эту функцию будут знать, что либо возвратится значение, либо, если ключ не найден, — null.
    3. Вызывать исключение. Например, throw new ArgumentOutOfRangeException("Ключ не найден");
    В таком случае вызывающие должны уметь обрабатывать ситуацию, когда вызовется исключение.
    Ответ написан
    Комментировать
  • Как объяснить принцип работы открытых ключей простыми словами?

    @Sumor
    Обычный почтовый ящик.
    Открытый интерфейс — это щель для конвертов или газет. Любой может оставить сообщение адресату.
    Закрытый интерфейс — это ключ от ящика, которым владелец открывает ящик и достаёт свою корреспонденцию.

    Как обычному среднему пользователю объяснить принцип работы шифрования с открытыми ключами?
    Ответ написан
    Комментировать
  • Как вставить элементы несортированного массива в сортированный на Pascal?

    @Sumor
    Вы путаетесь с началом и концом массивов.
    В паскале принято нумеровать элементы массивов с 1. SetLength создаёт массив, который нумеруется с 0.
    У вас есть цикл где вы читаете с 0 — проверьте всегда ли правильно вы указываете нижнюю границу массива.
    Для универсальности нужно применять функции High и Low, которые указывают нижний и верхний элементы массива:
    For i := Low(Arr) to High(Arr) do
    Begin
        write(Arr[i]:4);
    End;


    Дальше конечно много ещё замечаний к стилю и к коду.
    Например, в задании сказано, что n<=300, а вы проверяете n<300. Есть места, где вы лишний раз инициализируете переменные.
    В целом, задание не просто на программирование, а на алгоритмы.
    Ваш способ работающий, но сильно не оптимальный. Например, для решения задачи достаточно просто приписать массив B в конец массива A, а затем всё отсортировать.
    Задание в такой постановке как-бы намекает на изучение алгоритма сортировки слиянием.
    Ответ написан
    6 комментариев
  • Как импортировать(экспортировать) из Excel в C#?

    @Sumor
    Посмотрите ComponentOne Excel .Net
    Ответ написан
    Комментировать
  • Работа с ini-файлами?

    @Sumor
    Если только Windows, то есть winapi функция GetPrivateProfileString, которая как раз для этого и предназначена.
    Пример использования на c# GetPrivateProfileString
    Ответ написан
    Комментировать
  • Нахождение наибольшего простого делителя?

    @Sumor
    Число 600851475143 превышает 4 байта.
    Если брать только 4 байта от этого числа, то получается число -443946297, которое как раз и делится на 3 и на 29.
    То есть у вас программа работает только с четырёхбайтными числами.
    Ответ написан
    Комментировать
  • Как передать в параметр ссылку, с помощью xaml?

    @Sumor
    Может стоит отказаться от конструкторов с параметрами и задавать параметры свойствами.
    Примерно так:
    <ObjectDataProvider x:Key="userDCustom" ObjectType="{x:Type local:UserData}">
                <ObjectDataProvider.ConstructorParameters>
                    <local:User>
                          <local:User.UserData>
                                 <local.User Name="MyName" />
                          </local:User.UserData>
                    </local:User>
                </ObjectDataProvider.ConstructorParameters>
    </ObjectDataProvider>
    Ответ написан
    4 комментария
  • Проект на C# WinForm не завершается полностью после перехода между формами, как решить?

    @Sumor
    Чувствую, что вам следует прочитать про ShowDialog.
    Если вы открываете форму с помощью ShowDialog, то вторая форма открывается в модальном режиме, а первая будет ожидать кода возврата от второй формы.
    Ответ написан
    Комментировать