Ответы пользователя по тегу C#
  • Как работать с Newtonsoft.JsonConvert.PopulateObject()?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    К сожалению, PopulateObject в случае списка может только добавлять новые элементы. Можете попробовать реализовать свой Populate, в принципе для этого можно использовать JsonTextReader

    Либо же откажитесь от Populate, сделайте DTO-класс с теми же полями, но nullable, и делайте маппинг руками.

    Что-то типа такого:
    [Serializable]
    public class LevelsConfigDto
    {
        [JsonProperty("version")] public int? Version { get; set; }
        [JsonProperty("levelParams")] public List<LevelParam>? LevelParams { get; set; }
    }
    
    public static void MepLevelsConfig(LevelsConfig target, LevelsConfigDto source)
    {
        if (source.Version != null)
        {
            target.Version = source.Version;
        }
    
        if (source.LevelParam != null)
        {
            var count = Math.Min(target.LevelParam.Count, source.LevelParam.Count);
    
            for (int i = 0; i < count; i++)
            {
                target.LevelParam[i].Steps = source.LevelParam[i].Steps;
                target.LevelParam[i].Complexity = source.LevelParam[i].Complexity;
            }
    
            if (source.LevelParam.Count > target.LevelParam.Count)
            {
                for (int i = target.LevelParam.Count; i < source.LevelParam.Count; i++)
                {
                    target.LevelParam.Add(source.LevelParam[i]);
                }
            }
        }
    }
    Ответ написан
    Комментировать
  • Как докачать файл?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Первое, что пришло в голову.
    byte[] buffer1 = await webClient.DownloadDataTaskAsync(firstUrl);
    byte[] buffer2 = await webClient.DownloadDataTaskAsync(secondUrl);
    
    using (FileStream stream = new FileStream("file.data", FileMode.Create))
    {
        stream.Write(buffer1, 0, buffer1.Length);
        stream.Write(buffer2, 0, buffer2.Length);
    }


    Так же на просторах stackoverflow можно найти более производительные по памяти решения, когда через DownloadFileAsync уже два файла скачали, их обьединить:
    string[] urls = { /* URL адреса файлов */ };
    string[] filesNames = { /* имена файлов */ };
    
    // параллельно скачиваем файлы
    await Task.WhenAll(urls.Select((url, i) => webClient.DownloadFileTaskAsync(url, filesNames[i])));
    
    // открываем на запись первый файл
    using (Stream resultFileStream = File.OpenWrite(filesNames[0]))
    {
        // открываем на чтение второй файл
        using (Stream fileStream = File.OpenRead(filesNames[1]))
        {
            // копируем поток байтов из второго файла в первый
            fileStream.CopyTo(resultFileStream);
        }
    }
    
    // удаляем второй файл
    File.Delete(filesNames[1]);
    Ответ написан
    3 комментария
  • Объясните работу get и set в c#?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Конструкция свойств get-set генерирует скрытые (для синтаксиса) методы и поле
    Например,
    class Human
    {
        public string Name { get; set }
    }

    преобразуется на уровне компилятора в
    class Human
    {
        private string _name;
    
        public string GetName()
        {
            return this._name;
        }
    
        public void SetName(string value)
        {
            this._name = value;
        }
    }


    Но get и set можно переопределять, но тогда поле не генерируется и надо самому определить (или использовать существующее, в зависимости от логики)
    Например,
    class Human
    {
        private string _phone;
    
        public string Phone
        {
            get => "Human phone" + this._phone;
            set =>
            {
                this._phone = value;
                if (value[0] != '+') this._phone = "+" + this._phone;
            }
        }
    }

    Преобразуется в
    class Human
    {
        private string _phone;
    
        public string GetPhone()
        {
            return "Human phone: " + this._phone;
        }
    
        public void SetPhone(string value)
        {
            this._phone = value;
            if (value[0] != '+') this._phone = "+" + this._phone;
        }
    }


    Ну и обращения к свойствам в качестве полей заменяется на вызов метода
    var human = new Human();
    human.Name = "John";
    Console.WriteLine(human.Name);

    преобразуется в
    Human human = new Human();
    human.SetName("John");
    Console.WriteLine(human.GetName());


    А если не указать get или set, то соответственно не будет генерироваться метод на чтение или запись
    Ответ написан
    Комментировать
  • Как зациклить музыку, зашитую в ехе через Soundplayer?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Попробуйте всё же вынести плеер в поле класса
    partial class MyForm
    {
        private SoundPlayer Player = new SoundPlayer(Properties.Resources.SoundName);
    
        private void PlayAudio()
        {
            // Если нужно загружать именно по нажатию кнопки
            // this.Player = new SoundPlayer(Properties.Resources.SoundName);
    
            this.Player.PlayLooping();
        }
    }
    Ответ написан
  • Как сделать повтор запроса webrequest при ошибке (C#)?

    @hello_my_name_is_dany
    Backend Developer (Node.js, PHP, C#)
    Через рекурсию, как вариант

    async Task<string> SendRequestUntilSuccess(string url)
    {
        try	
        {
            HttpResponseMessage response = await client.GetAsync(url);
            response.EnsureSuccessStatusCode();
            return response.Content.ReadAsStringAsync();
        }
        catch(HttpRequestException e)
        {
            return SendRequestUntilSuccess(url);
        }
    }
    Ответ написан
    Комментировать