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

    @kttotto
    пофиг на чем писать
    Проходите по коллекции с конца через for, доступ к элементам через индексатор. На коленке, просто чтоб смысл был понятен, что-то типа этого
    for(var i = arr.Count - 1; i >= 0; i--)
    {
         if(arr[i].Name == "Any")
         {
             arr.RemoveAt(i);
         }
    }

    Ну и на всякий случай, у linq есть метод RemoveAll
    arr.RemoveAll(x => x.Name == "Any");
    А еще можно вернуть новую коллекцию, где не будет этого значения
    arr.Where(x => x.Name != "Any");
    По смыслу это будет тоже самое. Но в первом варианте, для удаления, Вам не придется создавать копии коллекций, ибо варианты с linq вернут новые списки. Особенно это актуально когда нужно избежать лишние алокации, если Ваш список внушителен по объему.
    Ответ написан
    Комментировать
  • Как разделить строку на символы и записать сразу этот символ в массив?

    @kttotto
    пофиг на чем писать
    На вскидку
    Вы получили массив символов myarr_0[i].ToCharArray()
    Затем Вы хотите массив привести к инту, это для платформы не понятно, поэтому даст эксепшн.
    Зачем делать лишние преобразования, если у Вас уже есть массив, сделайте просто
    array[i] = myarr_0[i].ToCharArray();
    Ответ написан
    3 комментария
  • Почему не получается остановить анимацию?

    @kttotto
    пофиг на чем писать
    Дайте ссылку в исходном коде где именно код в том варианте, как привели. То, что я увидел в коде и в Вашем примере, это не одно и тоже. В исходнике запускается и останавливается таймер. Ваш пример вырван из контекста, поэтому по нему трудно что-то понять.

    С гитхаба Ваш код себе не клонировал, но заметил, что ChebyshevMachine это структура, а не класс. Не знаю причины такого выбора, но могу предположить, что именно в этом может быть проблема. Поставьте брейкпоинт на методе StopAnimation и проверьте, что это тот же объект на котором Вы запустили таймер.
    Ответ написан
    2 комментария
  • Как сделать деконструктор класса?

    @kttotto
    пофиг на чем писать
    Во первых не совсем понятно какой деструктор Вы хотите. Если такой как в С++, то в C# такого нет по причине существования GC. Если Вы хотите метод, который будет выполняться перед сборкой мусора, то нужно реализовать IDisposable. И даже если Вы явным образом вызовите Finalize, то в какой момент он выполнится, никто гарантии не даст, как GC решит.

    Во вторых, C# язык строго типизированный, а значит нужно каким то образом ему понимать, какого типа будет headerA и headerB. Значит для них нужно определить тип
    class HeaderA
    {
          public string Signature {get;set;}
          public DateTime CreatedDate {get;set;}
          public int Version {get;set;}
    }
    
    class HeaderB
    {
          public string Signature {get;set;}
          public DateTime CreatedDate {get;set;}
          public long AuthorId {get;set;}
          public string MagicString {get;set;}
    }

    затем инкапсулируете их
    public class A<TData>
    {
      //header
      public HeaderA Header {get;set;}
      //data
      public TData Data {get;set;}
    }
    
    public class B<TData>
    {
      //header
      public HederB Header {get;set;}
      //data
      public TData Data {get;set;}
    }

    Видно, что можно еще обобщить и сделать
    class HederData<THeder, TData>
    {
          public THeder Header {get;set;}
          public TData Data {get;set;}
    }

    Теперь объекты можно создавать таким образом
    var a = new DataHaeder<HeaderA, string>();
    var b = new DataHeader<HeaderB, int>();

    Ну вот собственно мы и получили объект с полями, какими Вы хотите
    (var headerA, dataA)
    a.Header и a.Data, b.Header и b.Data;

    И, кстати, общие поля можно вынести в один класс
    class CommonProp
    {
          public string Signature {get;set;}
          public DateTime CreatedDate {get;set;}
    }

    А потом хедеры от него отнаследуйте.
    class HeaderA : CommonProp
    {
          public int Version {get;set;}
    }
    
    class HeaderB : CommonProp
    {
          public long AuthorId {get;set;}
          public string MagicString {get;set;}
    }
    Ответ написан
  • Не удалось изменить возвращаемое значение "List.this[int]"?

    @kttotto
    пофиг на чем писать
    Вы сделали коллекцию структур. Нужно знать разницу между структурой и экземпляром класса. Структура - значимый тип, поэтому когда Вы запрашиваетеsheduleCells[idx], Вы получите копию значения, а не ссылку на объект. А у копии отдельные поля Вы менять не можете, можете только полностью новым значением всей структуры заменить.

    Поэтому есть два выхода, либо изменить struct на class, либо менять значение
    var temp = Data.sheduleCells[idx];
    Data.sheduleCells[idx] = new SheduleCell(temp.cell1, hours);
    Ответ написан
    Комментировать
  • Как десереализировать этот JSON?

    @kttotto
    пофиг на чем писать
    JSON, это описание объектов в JavaScript. И поле response это не массив, а объект с полями "AK-47 | A...", соответственно и эти поля тоже не массивы.

    Вариант первый, некрасивый и похож на хак, это заменить {} у респонса на [], тогда он станет массивом, ну и в остальных нужных местах и можно будет десериализовать к dictionary.

    Вариант второй, трансформировать этот Json к другому типу Json. Тут сложнее, потому что нормальных библиотек для этого просто нет. Когда мне это надо было делать, я использовал JUST.net. Что мне в ней понравилось, так это быстрый фидбек от разработчика, если не хватает функционала, то он очень быстро его по Вашему желанию добавит. Ну а после трансформации, десериализуйте его уже во что захотите.

    P.S. Тут в процессе диалога с Stalker_RED, еще один вариант созрел. Если Вы уверены в структуре Json объекта, то его можно привести к JObject. Этот объект представляет собой дерево, где Вы сможете взять узлы (поля) первого уровня, у них получить узлы второго уровня, соответственно из каждого из узлов получите имя и значение. Ну так и сформируете свою модель, какую захотите. В Вашем варианте это будет оптимальным решением.
    Ответ написан
  • Что здесь написано?

    @kttotto
    пофиг на чем писать
    В C# значимые типы по умолчанию не могут иметь значение null. Если Вы объявите переменную как
    int x;
    то при чтении она будет равна 0. Если попытаться сделать так x=null, то получите эксепшн.
    Чтобы иметь возможность присвоить переменной x null, есть тип Nullable
    Т.е. теперь, если сделать
    Nullable<int> x;
    то мы спокойно сможем сделать x=null;
    Тип int? является синтаксическим сахаром, укороченным вариантом записи Nullable<int>, эти две записи по сути одно и то же.
    Ответ написан
    Комментировать
  • Метод заставляет компьютер обожраться памятью?

    @kttotto
    пофиг на чем писать
    Вы бы сказали тогда какой длинны весь текст. Подвисает - он может долго думать, сжирать процессор. Если все таки память, то возможно он не выходит из цикла (кто знает, что у Вас там за текст) и строит список из миллионов результата.

    И мне кажется у Вас там ошибка. Возможно lenghtText должен быть равен findText.Lenght. Т.е. после того как Вы нашли позицию вхождения, дальше надо искать с позиции
    secondCharacter = (firstCharacter + findText.Lenght) - 1;
    нет смысла сдвигать только на один символ. И не проще ли было найти все вхождения регуляркой? Это было бы две строки текста.
    Ответ написан
  • Есть адекватная альтернатива Visual Studio?

    @kttotto
    пофиг на чем писать
    Пользуюсь vs2017 на i7, ssd, 8Гб. Каких-то особых проблем не испытываю. Но по сравнению с vs2015 она конечно глючнее, бывает подвисает у меня, приходится через менеджер закрывать и перезапускать. С vs2015 вообще никогда проблем не испытывал.
    А вообще студия нормально кастомизируется. Можно отключить многие вещи, которые не используешь в работе. Например профайлер, он не плохо так ресурсы ест.
    Ответ написан
    Комментировать
  • Как избежать множественного создания классов в c# web api?

    @kttotto
    пофиг на чем писать
    Вообще у Вас все правильно. Есть слой моделей, которые являются сущностями, есть слой моделей, которые для отображения данных, есть слой dto моделей. У меня в проектах тоже всегда так. Зря Вы думаете, что плодите их, они находятся в разных слоях (модулях), можете считать их разными доменными моделями. Для больших и сложных проектов, это оправдано. И хоть все классы со стороны могут показаться одинаковыми, но они разные, т.к. относятся к разным доменным моделям и выполняют разную функцию.

    Если у Вас проект небольшой, то можно было обойтись и одним слоем для работы с ORM и не усложнять код.
    Ответ написан
    4 комментария
  • Почему не работает данный пример с async await?

    @kttotto
    пофиг на чем писать
    У Вас здесь несколько ошибок.

    Во первых, Вы в сигнатуре метода Run()указали, что он возвращает объект типа Task, но return не сделали. Если Вы хотите, чтобы он возвращал таску, то ее надо создать
    var task = new Task(() => async
    { 
    	Console.WriteLine("Hello from begining \"Run\" method");
        int num = 1000000000;
        long res = await new TaskFactory().StartNew(() => { return SumZeroToNum(num); });
        Console.WriteLine($"Result: {res}");
    });

    а потом вернуть
    return task;

    Но сделав в методе Main Run(), Вы только получите объет задачи, автоматом он у Вас не выполнится. Для этого Вам нужно будет сделать t.Start();
    Если хотите, чтоб вызывать метод можно было через async, то внутри надо сделать так

    return Task.Run(() =>
    {
        ....
    })

    Тогда запустить его можно будет асинхронно
    await Run();
    Или синхронно
    Run().Result;
    Ответ написан
    Комментировать
  • Пишу таск-менеджер на ASP.NET. Как реализовать подсчёт времени выполнения задачи?

    @kttotto
    пофиг на чем писать
    Для замера времени работы обычно используется Stopwatch.

    А вообще не совсем понятен вопрос, если Вы вроде как все организовали. Что Вас не устраивает?
    Ответ написан
    Комментировать
  • Как передать часть кода в метод другого класса (C#)?

    @kttotto
    пофиг на чем писать
    Я бы посоветовал использовать T4.
    Это будет файлик с расширением .tt, в нем Вы можете описать логику кодогенерации. По сути он возьмет нужный Вам файл из проекта как текст и сгенерирует из него то, что Вы хотите. Перед запуском проекта Вы просто запустите Т4 файл.
    У нас на одном из проектов мы так генерируем код моделей на основе наших метаданных.
    Ответ написан
    Комментировать
  • Как перечислять дни в C#?

    @kttotto
    пофиг на чем писать
    var beginDate = DateTime.Now;
    var futureDate = beginDate.AddDays(365);
    
    for (var date = beginDate; date < futureDate; date = date.AddDays(1))
    {
        Console.WriteLine(date.ToString());
    }
    Ответ написан
    Комментировать
  • Как подключить C# WPF app к удаленной базе данных SQL?

    @kttotto
    пофиг на чем писать
    Может быть что угодно: таймаут, права, потеря пакетов. Если стоит нужный провайдер, то можно из VS напрямую подключаться к удаленной бд и vs даже сам конекшн стринг сформирует. Т.е. можно сначала так проверить подключение.
    Ответ написан
  • Почему говорят, что C# не подходит для WEB?

    @kttotto
    пофиг на чем писать
    На C# спокойно можно написать серверную часть для любой браузерной онлайн игры и это не будет медленнее, чем на любом другой яп. Тем более, те игры, что Вы привели в пример, вообще можно в одиночку запилить, если не заморачиваться графикой и сопутствующими поддержкой сообщества и т.д.
    Ответ написан
    Комментировать
  • С# почему возникает ошибка "вызванный объект был отключен от клиентов"?

    @kttotto
    пофиг на чем писать
    У меня Ваш код отработал нормально.
    59da92579a59a700422397.png
    Ищите проблему в студии, правах. Попробуйте студию запустить с правами админа.
    Ответ написан
    1 комментарий
  • Как парсить число из HTML с помощью C#?

    @kttotto
    пофиг на чем писать
    Это ангуляровская страница и значение является биндигом, которое для получения результата может например делать еще какой то запрос. Вообщем, если Вы получаете страницу запросом через HtmlClient (ну или RestSharp), то Вы получите страницу с неотработанными js скриптами, они то должны выполниться на стороне клиента в браузере после загрузки страницы. Поэтому Вы получите {{column.getValue(item)}}, но если этот результат получит браузер, то он выполнит скрипты и там будет значение.
    В общем решением может быть грузить страницу, например через Selenium (WebDriver) или через Phantom и уже с них доставать значение.

    Вот еще есть вариант. Я так не пробовал, но пишут, что так можно запустить js код, попробуйте.
    Ответ написан
    3 комментария
  • Как правильно построить n-layer архитектуру приложения ASP.NET MVC?

    @kttotto
    пофиг на чем писать
    В отдельный слой следует выделять только то, что подвержено изменениям при поддержке, либо будет использоваться как компонент еще где-то. Стандартно это ui/web, dal, business-logic. Иногда в отдельный слой выносят модели, т.к. они могут использоваться как промежуток между разными слоями, особенно если это dto модели.
    Ответ написан
    Комментировать
  • Как в браузере на C# подвязаться к значениям содержимого?

    @kttotto
    пофиг на чем писать
    MSD в принципе все рассказывает здесь. Внизу страницы есть такой абзац, обратите на него внимание:

    Также можно управлять содержимым веб-страницы через Document свойство, содержащее HtmlDocument объект, который предоставляет управляемый доступ к объектной модели документов HTML (DOM) для текущей страницы. Это свойство полезно, когда используется в сочетании с ObjectForScripting Свойства, чтобы реализовать двусторонний обмен данными между кодом приложения и динамический код HTML (DHTML) в веб-страницы, позволяющей объединять веб-элементы управления и элементы управления Windows Forms в единый пользовательский интерфейс. Можно использовать Document для вызова методов сценария кода из приложения.

    Дальше переходите по ссылке сюда, чтобы глянуть как работать с HtmlDocument и находим там методы для доступа к dom элементам: GetElementById(String), GetElementsByTagName(String). Собственно там достаточно методов чтобы узнать нужные значения со страницы.
    Ответ написан
    Комментировать