Ответы пользователя по тегу .NET
  • Как сделать деконструктор класса?

    @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;}
    }
    Ответ написан
  • Почему не работает данный пример с 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());
    }
    Ответ написан
    Комментировать
  • Как парсить число из HTML с помощью C#?

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

    Вот еще есть вариант. Я так не пробовал, но пишут, что так можно запустить js код, попробуйте.
    Ответ написан
    3 комментария
  • Как сменить формат даты в C#?

    @kttotto
    пофиг на чем писать
    var date = DateTime.Now;
    Console.WriteLine(date.ToString("yyyy-MM-dd"));

    Подробно о форматировании даты
    Но s у Вас типа string, поэтому его надо сначала привести к DateTime:
    DateTime.Parse(s);
    или надежнее
    DateTime date;
    var result = DateTime.TryParse(s, out date);
    if(result)
    {
        var dateFormat = date.ToString("нужный формат");
    }
    Ответ написан
    Комментировать
  • Какие технологии .NET стоит изучать сейчас?

    @kttotto
    пофиг на чем писать
    Зря Вы так о WPF ) Десктоп востребован до сих пор, загляните в вакансии. Но самое востребованное web конечно. Выше постом правильный список и приоритеты там как есть, упустили только мобильную разработку xamarin, но я это на последнее место поставил бы.

    Я бы посоветовал в web. Вакансий много, работы много, разработчиков не хватает.

    И еще плюсану за комент Толстый Лорри.
    Ответ написан
    1 комментарий
  • Несколько элементов в ячейке БД ASP.NET?

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

    В какой таблице надо сделать ссылку на пользователя? UserID это и есть ссылка, зачем ее заменять?
    Что значит сделать несколько юзеров в одной ячейке? Наверное Вы имеете ввиду связь один-ко многим или многие-ко многим? Непонятно какую таблицу с какой и какой связью связать хотите.

    Вы показываете БД, а Вы же наверное через EF делаете, покажите модели. Или Вам надо показать модели в коде как будут выглядеть? В общем ничего не понятно)

    Продолжение:
    Из комментариев я так понял, что Вы хотите знать как будут выглядеть модели в коде для EF. И еще раз посмотрев на Ваши таблицы, я понял, что Вы их не совсем верно составили.

    В таблице User поле Balance, по всей видимости должен был указывать на таблицу Balance. В таком случае его надо было назвать BalanceId. Но опять таки, только для случаев, если у пользователя может быть только один баланс. Тогда в таблице Balance было не обязательно указывать на пользователя UserId.

    Я примерно накидал как это будет в C#
    public class User
    	{
    		public int Id { get; set; }
    		public string Login { get; set; }
    		public string Password { get; set; }
    		public string FirstName { get; set; }
    		public string LastName { get; set; }
    
    		public virtual IEnumerable<Event> Events { get; set; } 
    		public virtual IEnumerable<Balance> Balances { get; set; }
    
    		public User()
    		{
    			Events = new List<Event>();
    			Balances = new List<Balance>();
    		}
    	}
    
    	public class Event
    	{
    		public int Id { get; set; }
    		public string Name { get; set; }
    		public DateTime EndTime { get; set; }
    
    		public virtual IEnumerable<User> Users { get; set; }
    
    		public Event()
    		{
    			Users = new List<User>();
    		}
    	}
    
    	public class Balance
    	{
    		public int Id { get; set; }
    		public decimal Amount { get; set; }
    
    		public int UserId { get; set; }
    		public virtual User User { get; set; }
    	}

    Обратите внимание, что пользователи связаны с балансом как один-ко многим: один пользователь может иметь много счетов, но счет может иметь только одного пользователя. А события с пользователями связаны как многие-ко многим, т.е. один пользователь может быть прикреплен ко многим событиям и в одном событии может участвовать много пользователей. Для такой связи EF создаст дополнительную таблицу.

    Вообще, мой совет, не кидайтесь сразу в код, почитайте базу по БД и EF или вот хотя бы от сюда
    Ответ написан
  • Каким способом в .NET Core рекомендуется заполнять мастер страницу (_Layout.cshtml) динамическим контентом?

    @kttotto
    пофиг на чем писать
    Инжектить можно прямо на странице
    @inject ModelOrService ModelOrService;
    И в принципе в этом случае это может быть сервис, который будет работать с бд.

    Но когда мне надо в шаблоне сделать вывод динамик контента, я это реализую в js. Или важно это решить именно Разором.
    Ответ написан
    1 комментарий
  • Какие есть готовые C# библиотеки для работы с геообластями, ну или хотя бы с геометрией?

    @kttotto Автор вопроса
    пофиг на чем писать
    Решил вопрос руками. Переводил в прямоугольные координаты, трансформировал, потом обратно. Погрешности правда есть, но в разы меньше, чем большинство других способов.
    Ответ написан
    Комментировать
  • Почему другие могут перезаписать файл?

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

    По идее пока поток открыт, то доступ к файлу будет заблокирован, при попытке получить еще один доступ будет выскакивать эксепшин. Можно посмотреть, после while поставить брекпоинт или thread.sleep и с второго приложения попытаться прочитать файл.

    И если создание потока прячется в using, то нет смысла прятать код в try/finally и руками вызывать close(). Юзинг как раз и предназначен для того, чтоб об этом не беспокоиться, он сам разворачивается в try/finally, в котором поток и закроется.
    Ответ написан
    Комментировать
  • Насколько пригоден ASP.NET Core для стартового проекта?

    @kttotto
    пофиг на чем писать
    На днях сдаем достаточно крупный проект на asp.net core, который не только на тестах, но и уже в бою отработал. Причем это не первый сданный проект на core. Все замечательно работает. Каких то особых проблем, что это именно core, не возникало.
    Ответ написан
    3 комментария
  • Библиотека сериализации JSON, поддерживающая наследование?

    @kttotto
    пофиг на чем писать
    Пользуюсь newtonsoft
    Удобная, нареканий не было.
    Ответ написан
    Комментировать
  • Почему EF не хочет сохранять сущность?

    @kttotto Автор вопроса
    пофиг на чем писать
    Вопрос решен. Действительно создавалось два контекста. Только ошибка была не в ninject, а в моей реализации DataManger. Получалось, что сущность была в одном контексте, а внешний ключ указывал на сущность в другом контексте. Вот оно и не хотело сохраняться.

    Всем спасибо за соучастие)
    Ответ написан
    Комментировать
  • Есть ли такой реализованный список на C#?

    @kttotto Автор вопроса
    пофиг на чем писать
    Всем спасибо, реализовал руками на следующий день. Не закрывал вопрос, что может кто-то все-таки даст готовый вариант. И да, многопоточность там имеет значение, и скорость реагирования тоже.
    Ответ написан
    Комментировать
  • Как в EF настроить одну сущность с двумя внешними ссылками на другую сущность?

    @kttotto Автор вопроса
    пофиг на чем писать
    Ответ найден. Решилось таким способом
    [InverseProperty("OwnerStage")]
    public virtual ICollection<Motion> Motions { get; set; }
    Ответ написан
    Комментировать
  • Linq.Dynamic и DataTable?

    @kttotto
    пофиг на чем писать
    На стадии формирования запроса у Вас не существует объекта T2. Есть разница меду Enumerable и Queryable. Тип Enumerable - LINQ будет выполнять как конвеер, по цепочке выполняя каждое следующее расширение. А Queryable он возьмет все цепочки сразу и будет пытаться сформировать один SQL запрос. Поэтому мне не совсем понятно Ваше преобразование .AsEnumerable().AsQueryable() потому, что я так понимаю, что DT изначально возвращает Queryable.

    Вообщем, сделайте вот это "new (@0 as T2) " где то раньше Вашего join.
    Ответ написан
    Комментировать
  • Почему может не работать бандл MVC 5?

    @kttotto Автор вопроса
    пофиг на чем писать
    Вопрос снимается. После того, как выяснилось, что у коллег ветка работает нормально, полазил по нескольким своим веткам, пытаясь понять где именно глюкануло, и тут оно волшебным образом заработало. Что именно было не так, осталось загадкой, видимо глюк студии. Жалко убитого дня на поиск непонятно чего.
    Ответ написан
    Комментировать
  • C# консольное приложение, сохранить состояние перед закрытием как?

    @kttotto
    пофиг на чем писать
    Я бы добавил Setting файл (ссылку на работу с файлом параметров Вам постом выше оставили), в который добавил бы необходимые параметры для запуска приложения. При начале работы приложения брал бы данные от туда. Когда эти параметры будут меняться в процессе работы, их сохранять в этом файле. И каким бы образом приложение ни закрылось, текущее состояние будет сохранено в сеттинге.
    Ответ написан
    Комментировать