Ответы пользователя по тегу C#
  • Как закодировать цифры в символы?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Окай. Делается это очень просто - мощность алфавита равняется 12ти, то есть нам потребуется 4 бита, чтобы его закодировать (хотим меньше - придётся обратится к хафманам). То есть свичём или ифами выбираем нужный квартет битов. Другими словами имеем отображение из символа в полубайт. Чтобы получать нормальные байты нужно разбивать на пары и складывать побитово результаты каждого символа с соответствующим смещением.

    Есть способ попроще, возможно даже быстрее в скорости работы. Берём все пары [0-9\,\-]{2} и строим по ним хэш-таблицу, или те же самые ифы-свичи. Таким образом мы отказались от мутных складываний, а если использовали хэш-таблицу это ещё и быстрее будет. То есть в результате у нас будет отображение пар небольшого алфавита в байт.

    Что-то мы естественно потеряем - мощность алфавита не кратна двойке - так что если требуется минимизировать трафик, возможно стоит сразу поточно жать в gzip, без предварительных манипуляций.
    Ответ написан
    Комментировать
  • Как получить элементы массива или списка через рефлекцию (отражение, reflection)?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Не понял, что значит "поверхностный гугл".

    if (obj.GetType().IsArray)
      {
        obj.GetType().GetMethod("GetValue", typeof(int)).Invoke(obj, index);
      }


    Однако, возможно проще будет использовать DLR.
    Ответ написан
    1 комментарий
  • Как вытащить данные из массива анонимных объектов?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    С CLR всё понятно, но что с DLR? Ой

    IEnumerable<int> query = salaries.Where<dynamic>( s => {
        return s.Region == "Амурская область" && s.KindOfActivity == "Образование";
    } ).Select<dynamic, int>( s => s.Salary );
    Ответ написан
    Комментировать
  • Сколько бы у вас ушло времени на написание подобного приложения?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Нисколько. Я бы такое даже не попытался бы написать.

    Почему?
    1) ТЗ мутное.
    2) ТЗ мутное.
    3) ТЗ мутное.
    4) ???
    5) а где, блджад, профит?
    Ответ написан
    6 комментариев
  • Какой ЯП выбрать для Windows?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Посмотрел вопросы... На какой-то даже отвечал.

    В общем. Вот мой совет. Не ищи язык, он сам найдёт тебя когда потребуется. Вообще, программирование как таковое это ремесло. Ремесло, которое требует определённой дисциплины, порой определённого склада ума (который, безусловно, можно сформировать), но самое главное - время. Ибо ремеслом, при желании, может овладеть каждый, но далеко не каждый будет тратить на это своё время, поэтому на западе ремесленники очень ценятся и их труд щедро вознаграждается (порой намного лучше управляющий должностей; хотя есть "смешанные должности", разговор не о них).

    Возьми задачу. Тот же школьный звонок. Возьми ft232 - стоит копейки, подделок вообще тьма, которые стоят ещё меньше. Открываешь на чтение и пишешь. Очень просто, честно. Однако, надо потратить время на изучение референсов, даташитов и манов.

    Не нравиться? Не беда, есть сотни других видов задач. Computer Science, GameDev, обработка данных, спортивное программирование. Тысячи их. Выбирай не хочу.

    Но на всё надо время. Время - основной ресурс человека. Ссылки в основном python-ориентированные. Потому что я очень советую не бросать его сейчас. Потому что быдлокодить на python сложно. Потому что python прост. Потому что... гладиолус.

    И потом, когда овладеешь пайтоном достаточно, чтобы закончить на нём хоть какой-то проект. Любой, но проект. С проектированием, принятием решений, сдачей (хоть самому себе). Вот тогда смело выбирайте.

    Но даже здесь лично я советую Cи или Cи++. Ибо они формируют машинное мышление. Ибо так мыслит машина. Не надо думать о Haskell или Java. Это не то. Это абстракция над машиной, её порабощение. Си++ проще, Си лучше. Си ближе к машине, Си очень близок к машине, настолько, насколько возможно.

    И ещё кое-что, вместо PS. Учите английский. Просто читайте. Помогайте себе с помощью lingualeo. Пользоваться словариком в начале пути нормально, поэтому поставьте себе расширение в браузер, которое переводит выделенные слова. И мигрируйте на *nix. Хотя бы dual boot, хотя бы виртуалочка. Хотя бы cygwin. Хоть что-то. Просто потому, что там проще. Проще с программированием. Windows требует некоторой дисциплины, некоторого умения. Порог вхождения выше. И прозрачность намного меньше. Оно вам надо?
    Ответ написан
    2 комментария
  • Как правильно организовать регулярное выражение в C#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Алексей Немиро всё правильно написал. Единственное, что - msdn тут не причём. Да, статья по регексам там не очень, однако такого и без этого достаточно. Советую почитать, как они работают и банально потренироваться.
    Ответ написан
    Комментировать
  • А какой ваш путь изучения ЯП?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Оглянись! Эй, да отверни ты голову от монитора. Зеркало видишь? Подойди и посмотри туда. Видишь странного парня? Поздравляю, ты найден! Есть ещё вариант. Выключаем монитор. Смотрим в него. Снова видим себя! Ещё варианты?

    А вообще, не парься. Делай что нравиться, ходи куда с кем нравиться, ешь что любишь, помогай близким, но себе в первую очередь, люби всех, но близких в первую очередь, слушай их, но думай сам, и учись, учись и ещё раз учись. Всему. Не делай только двух вещей: не планируй и не планируй заниматься тем, что тебе не нравиться (кроме учёбы), ибо планы разочаровывают тем, что ничего не выполняется, а планы неприятных действий разочаровывают в двойне: ничего не выполняется, а делать надо всё равно. Ой, а при чём тут языки программирования? Тоже задаюсь этим вопросом.

    Удачи!
    Ответ написан
    Комментировать
  • Проигрывает ли ООП в Python по сравнению с C#, С++ или Java?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Странный вопрос, поскольку по сути модификаторы доступа имеют очень слабое отношение к инкапсуляции. Инкапсуляцию следует понимать не так, что это вообще чёрный ящик (хотя идеал именно такой, но мы же знаем, что идеалов не бывает). Инкапсуляция, это когда такой код:

    class Foo:
    	A = None
    
    
    foo = Foo()
    # some code here
    if foo.A is not  None:
    	# continue execute right way
    else:
    	exit(1)


    становиться каким-то таким:
    class Foo:
    	class PropertyUsedBeforeInit(Exception):
    		pass
    	_a = None
    	@property
    	def a(self):
    		if self._a is not None:
    			return self._a
    		else:
    			raise self.PropertyUsedBeforeInit()
    	@property.setter
    	def a(self, val):
    		self._a = val
    
    try:
    	foo = Foo()
    	# just write ur code here
    except Foo.PropertyUsedBeforeInit:
    	exit(1)
    finally:
    	exit(0)


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

    Хотя, на самом деле, на вкус и цвет друзей нет. Python крут тем, что он многогранен. Его можно использовать в тяжёлом энтерпрайзе (второй вариант), его можно использовать и для лабораторных в универе (первый вариант), его можно использовать и для домашних проектов (любой вариант). Его можно использовать везде. Его можно компилировать во что угодно. И его архитектура устроена именно таким образом - дать свободу. А модификаторы доступа - это то, за чем в общем-то должен следить программист. А соглашения помогают разрабатывать и использовать модули (библиотеки).

    Ну, а по поводу того, кто круче. На моё "ИМХО", Python таки в чём-то круче. В нём реализованы те вещи, которых нет в C++ и Java вместе взятые и при этом они реализованы лаконично и прозрачно. Взять те же декораторы: очень простая штука. Ну просто невероятно простая. А имеем что? Очень мощный инструмент. Плюсам и джавам потребовалось бы невероятное усилие, чтобы реализовать что-то подобное. Да что там, они анонимную функцию делали сто лет.
    Ответ написан
    Комментировать
  • Есть ли какой то шаблонизатор для C#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Этот велосипед пишется на раз-два.
    Ответ написан
    2 комментария
  • Стоит ли изучать JavaScipt и C# одновременно с нуля?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ну, тут зависит от человека... В общем случае, ответ, конечно нет. Причём это про любое так можно сказать. Не важно, насколько они похоже, при изучении чего либо требуется тотальная концетрация.

    Однако. Стоит заметить, что во-первых, JS и C# таки похожи в синтаксисе. По крайне менее, точно будут случаи, когда программу на C# почти без изменений браузер сожрёт да не подавиться.

    Но тут вот что важно помнить. C# - это такой канонический ООП. C# стабилен, C# стандартен, C# быстр. И да, он таки удобен. В чём-то. В большинстве.

    JS - это попытка впихнуть ООП в хаскел, дополнительно заменив все ключевые слова на куда большие в размерах. Однако, во-первых, зачем-то имплементировали прототипную модель наследования. Она удобна в относительно редких случаях. Во-вторых, JS сложен, а от этого сложна и компиляция и исполнение, да даже для освоения он сложен. В-третьих, JS-ов много. Вообще, JavaScript - это имплементация спецификаций ECMAScript. Как и ActionScript. И ещё тысяча этих script'ов. Однако. Есть ещё и DOM. И с ней надо работать. А это тоже медленная штука. И вообще - браузер очень медленная штука. Отчасти это связано с тем, что стандарт действительно сложен, отчасти с тем, что современные страницы мало чем отличаются от сложных программных продуктов, однако часто выполнены с ошибками (бывают даже умышленные ошибки). Причём доступа к железу нет почти никакого. Отсюда - сложный контроль производительности. Отсюда...

    А... Что там. JS убог. Чуть менее чем полностью. Если нет нужны верстать HTML не трогайте его вовсе. Если есть нужда - то придётся. В любом случае. Даже не смотрите на CoffeScript, TypeScript и подобные. Их можно будет изучить. Потом.

    Забыл написать самое главное. Программирование - штука многогранная. И как я писал выше - JS убог. Но так уж случилось - просили одно, хотели другое, выходило третье, а вышло - четвёртое. И всё перемешалось, умешалось, замешалось и.. Получился такой вот страшный гибрид. Функциональный, да не очень. Объектный, да не совсем. Портативный, да тоже как-то не сложилось целиком. Однако, он всё таки очень многогранный. Несомненно, те практики, которые Вы получите при изучении JS могут очень сильно помочь при использовании C#. И наоборот. Классические подходы разные, однако классика не всегда подходит.
    Ответ написан
    2 комментария
  • Как отрисовать куб в OpenGL используя SharpGL ?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Здесь кусок дерьма, а не код, однако работал. Когда-то. Может поможет. Тут Qt, но суть тот же OpenGL.
    Ответ написан
  • В чем отличия C++ и C# ?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Тут все пишут про отличия. Рискну написать про сходства.

    Во-первых, о чём бы ни писала Елена и Си++ и C# - оба языки общего назначения. Даже больше, оказывается - C# ни разу не заточён под объёмную библиотеку (или фреймворк) .NET, однако с ним намного, много проще. Но если таки учитывать .NET, то для Си++ есть Boost и Qt, так что здесь скорее паритет - библиотек для обоих хватает.
    Во-вторых, сложность разработки на Си++ часто преувеличена. Разве только дисциплины надо поболее - выстрелить в ногу здесь попроще. Однако при этом Си++ будет чутка более гибкий и без танцев с бубнами unmanaged код не запустить на C#. Если внезапно потребуется.
    В-третьих, оба языка, раз они общего назначения, таки мультипарадигмальные. То есть они реализуют большинство практик. И хотя Си++ развивается довольно медленно, сейчас Си++ резко догнал C# в плане нереализованных фич (здесь как минимум лямбды). Ну и метапрограммирования у Си++ поболее будет (наглая ложь).
    В-четвёртых, оба языка кроссплатформеные. Впрочем, C# будет более кроссплатформенный, чем Си++. Разве только тот же Qt резко стёр границы, но это не значит почти ничего - C# компилируется в тот же самый CIL для всех платформ, Си++ - в совершенно разный код для разных платформ (i386, amd64, ARM Cortex-AXX).
    Наконец, в пятых, синтаксис у них действительно очень похож. Оба языка принадлежат к семейству Алгол-подобных, так что и брейсы, и остальные скобки здесь имеют примерно одно предназначение.

    Различия, которые казалось бы делают языки совершенно разными, таки не столь принципиальны на том уровне абстракции, на котором был задан вопрос. А различия действительно колоссальны: C# - managed код, что означает, что скомпилированный код будет исполнятся не на прямую в CPU, а на специальной виртуальной машине. Это съедает производительность, но сильно облегчает перенос кода. Ну и потом, C# - полупроприетарный ответ Java (что интересно, так как получается, что C# - более свободный, чем Java), которая была создана как замена сложному и небезопасному C++ в том числе.

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

    Почему так? Потому что ООП... Оно как бы ООП, ничего сверхъестесственного ни один язык не предлагает, это не Haskell, и тем более не Brainfuck. Так что принципиально общие вещи в них будут. То подмножество, что реализует машину Тьюринга - у них общие. Сами посмотрите: циклы, ветвления, передача аргументов, арифметика... С небольшими правками всё совершенно одинаковое. Да, Дмитрий совершенно прав, traits на C# не повторишь, ибо та аналогия будет уже не traits, однако... Это уже [programming_language] related, то есть это попытка совладать с особенностями.

    Немного пруфов: лично я ходящий пруф. Зная C++ и C# и немного Java я просто начал программировать на Python. При том, что Python даже алголоподобным не принадлежит. А всё потому, что логика одна и та же, хотя различий между Python и C(++|#) намного, много больше. Но не читая почти никаких туториалов, пройдясь галопом по европам с документацией сейчас я знаю python достаточно для серьёзного проекта.

    UPD. По поводу метапрограммирования... Таки рантайм рефлекшн шарпа тащит. И хотя ни макросов, ни шаблонов, ничего. Но изменять код на лету - это уже очень круто. По дефолту плюсы так не умеют, и хотя шаблоны с макросами тащат, сильно, очень сильно тащат и вытаскивают его, Си++, со дна, надо признать - рефлешн у шарпа будет поинтереснее. Извиняюсь за дезу.
    Ответ написан
    6 комментариев
  • Как реализовать мгновенную фильтрацию DataGrid'a, используя многопоточность (WPF)?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Видимо, вы неправильно готовите асинхронные таски. Возможно это поможет.
    Ответ написан
    Комментировать
  • Почему приложение на C# съедает в 5 раз больше ожидаемого объема памяти?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Ой, ой, страшно.

    Ну сами подумайте, что такое C#? Это CIL. А рантайм CIL'а ой как память сжирает.

    Вообще, это всё к недавнему вопросу здесь о том, что должен знать хороший программист. А знать он должен то, с чем работает. Если бы Вы знали, что C# - это "виртуальный" язык, то есть реальной машины, которая исполняла бы его код не существует. Он компилируется в тот самый CIL, который исполнятся виртуальной машиной. Она же сразу резервирует какую-то память, мегабайт сто-стопятьдесят, дабы быстро расположить в ней вновь создаваемые объекты. К тому же, подгружается несколько весьма больших DLL от которых "стандартно зависит" .NET-приложение.

    Впрочем, и на Си контролировать память не так уж и просто. Как минимум будет пол-метра оверхеда, если не резать ножом. К слову, .NET тоже можно резать ножём, но так же эффективно, как Си, ясное дело, не получиться.
    Ответ написан
    Комментировать
  • Как обойти ограничение точности типа double в C#?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Так. Стойте.

    Decimal может принимать огромный диапазон значений, но из-за преобразований десятичную в двоичную систему исчисления точности всё равно может не хватить.

    Как вариант, можно использовать BigInteger и хранить запятую отдельным числом, можно тоже BigInteger. По сути - запятая это показатель степени при основании системы исчисления, то есть 10. Арифметика элементарная.

    Есть тысячи реализаций (включая BigRational в C# F#).

    Загружаться они почти все могут из строки, а те кто не могут, сплитим по точке и считаем количество нулей. Но должен предупредить - данный метод может зациклиться и очень на долго.
    Ответ написан
    1 комментарий
  • Где скачать оффлайн документацию по C# от msdn?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    deb3920754b24af9ac5f071cfaab4fd2.png
    Здесь можно всё поставить и хелп будет доступен как часть среды.
    Ответ написан
    Комментировать
  • Как в c# правильно написать такой алгоритм?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    В общем случае никак. Конечно можно соорудить примерно такой зоопарк:
    void tries(params Func<Void> bodies) {
    	try {
    		bodies[0]();
    	} catch {
    		tries(bodies.Skip(1).ToArray());
    	}
    }
    
    // using
    tries( () => {
    		// first try
    	}, () => {
    		// second try if first failed
    	}, () => {
    		// third try if second after first failed
    	} ... )


    Но @gleb_kudr и остальные правы - исключения далеко не лучший способ построения архитектуры приложения и уж точно он не должен быть использован для реализации алгоритма. Хотя исключения сегодня достаточно дёшевы (в C# по мелкомягкой политики мы и так платим за исключения даже не используя их), но алгоритм логичнее делать именно с помощью ветвлений, а не обработок исключений. Единственный use-case который я смог придумать - большое количество различных "одинаковых" ресурсов с различной степенью актуальностью - от сети до просьбы вставить диск. Как-то так. Но всё таки это экзотические ситуации и следует понимать, что исключения - всё таки исключительные ситуации и требоваться они должны редко. Если программа успешно (идеально) отработало, но было брошено сотни исключений - дело плохо.
    Ответ написан
    Комментировать
  • Какое есть высокопроизводительное сетевое API?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    В смысле API? Есть протокол UPD, на который есть службы с таким API.

    Если будет задача и условия, возможно подскажу точнее.
    Ответ написан
    9 комментариев