Ответы пользователя по тегу .NET
  • Нужен эвристический алгоритм заполнения таблицы или существует обычный?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Сразу можно сказать, что число столбцов в таблице - L=M*(N-1)/2+1, число строк - K=M*L/N. Оба этих числа должны быть целыми.
    В частном случае, когда N=q+1, M=2*(q+1), где q - простое число или степень простого, матрицу построить можно, в ней каждая строка будет встречаться дважды, а верхняя (и нижняя) половинка матрицы будет матрицей инцидентности конечной проективной плоскости. В остальных случаях - боюсь, что нужна эвристика, или вообще полный перебор. Всё-таки, это получается задача о покрытии - надо покрыть удвоенный набор рёбер полного графа с L вершинами непересекающимися графами с N вершинами. Свойство "в каждом столбце M ячеек" выполнится автоматически.
    Ответ написан
    Комментировать
  • Рефакторинг циклов возможен?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Вынести дублирующиеся тела циклов в отдельные функции. Циклов останется столько же, но они станут короче. Потом можно будет смотреть, что ещё можно исправить.
    Ответ написан
    Комментировать
  • Как найти красный квадрат на сером фоне (C#)?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Посмотрите на LockBitmapData (работа со строчками Bitmap напрямую). Там можно работать гораздо быстрее, чем через GetPixel.
    И действительно, ищите красные точки с шагом 4 или 5 (можно и 8, но есть риск промахнуться, если квадрат оказался чуть меньше).
    Ответ написан
  • В чем разница между List ArrayList и Array?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Размер Array задаётся при создании, и за ним надо специально следить. Доступ к нему чуть быстрее, чем к List. Можно получить указатель на элемент через fixed. Если в Array лежат структуры - можно изменить их поля: A[x].B=c;
    Элемент массива можно передавать в функцию как ref или out.
    Преимущество List в том, что его размер меняется автоматически при добавлении элемента. Менять поля структур в нём нельзя, передавать элементы по ссылке тоже нельзя.
    ArrayList - не generic тип (он пришёл ещё из первой версии C#), поэтому состоит только из объектов. С появлением List стал не очень нужен, разве что для случаев, когда действительно нужно хранить объекты разных типов - но и тогда List< object > его полностью заменит.
    Ответ написан
    2 комментария
  • C# - Как лучше работать с XSD-схемами?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Есть программа xsd.exe, которая генерирует C# классы из xsd-файла. Можно запускать её перед сборкой проекта - всё сделает. Правда, как поступить с двумя схемами, не очень понятно (читать одной, а если выдала ошибку - то другой?)
    Ответ написан
    Комментировать
  • Перегрузки методов без дублирования кода в C#?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Пишу общий метод (возможно, со слегка другим набором параметров), который вызываю из каждой из перегрузок. Впрочем, чаще удаётся обойтись вызовом второго метода из первого.
    Ответ написан
    Комментировать
  • Как преобразовать коллекцию объектов в коллекцию значений одного из его свойств одной строкой?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    var result=source.ConvertAll(c=>c.Text);
    Ответ написан
    Комментировать
  • Как определить возвращает ли экземпляр Delegate значение?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Попробуйте так:
    static bool IsAction(Delegate x){
        return x.Method.ReturnType==typeof(void);
      }

    Правда, я не все возможные делегаты проверял.
    Ответ написан
    Комментировать
  • Как выполнить циклический сдвиг битов вправо в C#?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    ((a*257)>>s)&255.
    Будет работать быстрее, почему-то логические операции на C# очень дорогие по сравнению с умножением.
    Ответ написан
  • Как просмотреть код, генерируемый компилятором .NET?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Посмотрите здесь: habrahabr.ru/post/253105
    Может быть, получится то, что надо.
    Ответ написан
    Комментировать
  • Время жизни объекта, если передали ссылку его поля в статический класс?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Будет. Ссылка идёт не на поле объекта, а на объект, который когда-то лежал в этом поле. После чистки останется только объект d. Вот если бы в d при конструировании была ссылка на b, как на "родителя", то b бы тоже остался.
    Ответ написан
    Комментировать
  • Как хранить в файле огромный массив объектов?

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

    Mrrl
    @Mrrl
    Заводчик кардиганов
    В цикле в условие while (!_commandQueue.IsEmpty) добавить проверку какого-нибудь внешнего флага, который установить в false, когда источник команд примет решение, что делать больше ничего не надо: while(fgoing || !_commandQueue.IsEmpty).
    По хорошему, надо бы при пустой очереди ждать не секунду, а какого-нибудь события, которое возникнет, когда добавится новая команда. Иначе команду, которая пришла через 1.2 секунды после первой, он отправит только через две секунды.
    Ответ написан
    6 комментариев
  • Где, когда и как лучше использовать лямбда-выражения?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Я использую лямбда-выражения в двух случаях:
    - когда это действительно "выражение", т.е. всё вычисление укладывается в одну формулу;
    - когда для вычислений нужно использовать значения переменных текущего метода.
    При этом я помню, что "под ковром" компилятор создаст для каждого контекста с лямбда-выражением отдельный класс, и захваченные переменные будут полями этого класса (а само лямбда-выражение - его методом). Причём они будут использоваться, как поля, не только для кода, вычисляющего это выражение, но и для всей работы с этими переменными. Так что, если в конкретном месте приходится думать об эффективности, то надо всё взвесить.
    Ответ написан
    1 комментарий
  • Нельзя изменять данные в структуре на прямую?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Предполагаю, что поле Company в объекте Im.Work описано тоже как свойство:
    public Company Company{ get; set; }

    В этом случае, когда вы пишете Im.Work.Company.CompanyName="Name", вызывается метод get для Company, возвращает копию структуры (потому что вернуть ссылку не может), и дальше вы пытаетесь в этой копии, никуда её не положив, поменять одно из полей. Оригинал от этого точно не изменится, и, по-видимому, компилятор не даёт выполнить заведомо бессмысленное действие (изменить объект, который сейчас будет уничтожен).
    Ответ написан
    8 комментариев