Ответы пользователя по тегу C#
  • Как я могу сохранить список comboBox1, после закрытия программы?

    twobomb
    @twobomb
    private const string FILE = "C:\\savedata.txt";
            public Form1()
            {
                InitializeComponent();
                comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
                if (File.Exists(FILE)){
                    IFormatter f = new BinaryFormatter();
                    var fs = new FileStream(FILE, FileMode.Open, FileAccess.ReadWrite);
                    var data = (List<string>) f.Deserialize(fs);
                    comboBox1.Items.AddRange(data.ToArray());
                    fs.Close();
                }
            }
            protected override void OnClosing(CancelEventArgs e)
            {
                IFormatter f = new BinaryFormatter();
                var data = comboBox1.Items.Cast<string>().ToList();
                var fs = new FileStream(FILE, FileMode.Create, FileAccess.ReadWrite);
                f.Serialize(fs, data);
                fs.Close();
            }
    Ответ написан
    6 комментариев
  • Почему методы без await исполняются последовательно?

    twobomb
    @twobomb
    Ну если при отправке http запроса вы используете какой-то его асинхронный метод, то да поток не блокируется, потому-что тот метод выполняется на другом потоке, а если вы в своей асинхронной функции будете использовать синхронные методы работы с http запросом, то и поток ваш будет блокироваться при их использовании.

    Вообще как мне кажется эти async,await добавлены больше для удобства и простого отлавливания исключений возникающих в методах выполняющихся на других потоках.
    Если раньше мне нужно было писать что-то типа такого:
    private void Button_Click(object sender, RoutedEventArgs e){
                var t =  new Task(() =>{
                        //дейтсвия выполняющиеся в другом потоке
                        Thread.Sleep(1000);
                });
                t.ContinueWith(new Action<Task>((task) =>{//вызываем по завершению работы таски
                    Dispatcher.Invoke(new Action(() =>{//вызываем в основном потоке, потому-что обращения к gui элементам может быть только через него
                        try{
                            if (t.IsFaulted)//если у нас возникло исключение в нашей первой таске вызываем его здесь что уловить его тут и обработать
                                throw t.Exception;
                            textblock.Text = "my text";
                        }
                        catch (Exception exception){
                            Console.WriteLine(exception);
                        }
                    }));
                }));
                t.Start();
            }


    То сейчас достаточно так:
    private async void Button_Click(object sender, RoutedEventArgs e){
                try{
                    await Task.Run(() =>{
                        //дейтсвия выполняющиеся в другом потоке
                        Thread.Sleep(1000);
                    });
                    textblock.Text = "my text";//и мы волшебно продолжаем выполнение в главном потоке
                }
                catch (Exception exception){//будет вызван даже если возникнет исключение в таске
                    Console.WriteLine(exception);
                }
            }


    Ну если вам нужно выполнить сразу несколько методов асинхронно и ждать их выполнение через await можно сделать так
    List<Task> tasks = new List<Task>();
    tasks.Add(Task.Run(() =>{
    	Thread.Sleep(1000);
    	Console.WriteLine("1");
    }));
    tasks.Add(Task.Run(() =>{
    	Thread.Sleep(1000);
    	Console.WriteLine("2");
    }));
    tasks.Add(Task.Run(() =>{
    	Thread.Sleep(1000);
    	Console.WriteLine("3");
    }));
    await Task.WhenAll(tasks.ToArray());
    Console.WriteLine("continue");
    Ответ написан
    Комментировать
  • Как проверить имеет ли сторее приложение фокус?

    twobomb
    @twobomb
    [DllImport("user32.dll")]
            private static extern IntPtr GetForegroundWindow();

    IntPtr HWND = GetForegroundWindow();
    string appname = Process.GetProcesses().First(p => p.MainWindowHandle == HWND).ProcessName;
    Ответ написан
    1 комментарий
  • Как из строки сделать array?

    twobomb
    @twobomb
    foreach (var i in JArray.Parse(reader.ReadToEnd())){
                    Console.WriteLine(i["DateCreate"]);
    ....
                }
    Ответ написан
    Комментировать
  • Как передать в текст кода переменную при динамической компиляции?

    twobomb
    @twobomb
    string code = File.ReadAllText(@"MyCompil.cs");
                code =code.Replace("hello", "Hi!");

    Ну или в args передавать непосредственно при запуске приложения параметрами...
    Ответ написан
    3 комментария
  • Как централизованно обрабатывать исключения в WPF?

    twobomb
    @twobomb
    А причём тут InnerException? e.Exception и является экземпляром класса вашего кастомного исключения.
    private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)   {
                if (e.Exception is WpfLocalizedException ex){
                      //ex.dicts //ваш объект к которому нужно обратится...
                }
              }
        }

    Ну я надеюсь WpfLocalizedException наследуется от Exception
    Ответ написан
    Комментировать
  • Как скачать видео частями?

    twobomb
    @twobomb
    youtube-dl — библиотека для скачивания видео с YouTube
    Вот нашёл обертку под C#
    YoutubeDLSharp

    var res = await ytdl.RunVideoPlaylistDownload(
        "https://www.youtube.com/playlist?list=PLPfak9ofGSn9sWgKrHrXrxQXXxwhCblaT",
        start: 52, end: 76
    );
    Ответ написан
    Комментировать
  • WPF Datepicker, как реализовать запрет на выбор одной даты больше 7 раз?

    twobomb
    @twobomb
    Ну вы бы хоть код какой-нибудь приложили, ну можно например так.

    XAML
    <DataGrid ItemsSource="{Binding GridItems}" AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <DatePicker SelectedDate="{Binding Date, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></DatePicker>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                 </DataGrid.Columns>
            </DataGrid>

    Сам класс элементов грида
    public class MyItem{
            public string Name { get; set; } = "myname";
    
            public Func<DateTime?, bool> DateChecker = null;
            public DateTime? _Date;
            public DateTime? Date        {
                get => _Date;
                set {
                    if (DateChecker != null && DateChecker.Invoke(value)){//При попытке установить дату вызваем метод который проверить сколько в коллекции у нас  уже таких дат
                        _Date = value;//Устанавливает дату если метод DateChecker вернул true
                    }
                }
            }
        }

    Ну и типа тут должна быть модель допустим, ну для примера сделаем всё в классе окна
    public partial class MainWindow : Window
        {
            public ObservableCollection<MyItem> GridItems { get; set; }= new ObservableCollection<MyItem>(){};//Коллекция элементов
    
            public bool DateCheckerMethod(DateTime? dt){//Метод который будет вызываться при попытке изменить дату
                if (dt != null && GridItems.Count(item => item.Date != null && item.Date.Value.CompareTo(dt.Value) == 0) >= 7){
                    MessageBox.Show("Максимум 7 дат");
                    return false;
                }
                return true;
            }
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
                GridItems.CollectionChanged += (sender, args) => {//При добавлении в колелекцию нового элемента, присваиваем метод обработки  дат
                    foreach (var myItem in args.NewItems.Cast<MyItem>())
                        myItem.DateChecker = DateCheckerMethod;
                };
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});   
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date});
                GridItems.Add(new MyItem() { _Date = DateTime.Now.Date.AddDays(1)});
            }
        }
    Ответ написан
  • Почему не работает System.Text.Encoding? Ошибается на 1 символ?

    twobomb
    @twobomb
    Ну потому-что ваш генератор тупо генерирует рандомные числа от 0 до FFFF, а в UTF16 там есть определенные правила. Почитайте например в вики

    Я не вникал ну вики говорит что там есть диапазон для суррогатных пар тоесть символы которые кодируются двумя 16битными словами, тоесть 4 байтами. Крч как вариант или тупо добавить проверку в генератор чтобы если рандомное число входит в диапазон исключений D80016..DFFF16 то пропускать и генерировать другое. Или замарачиваться с этими парами, ну это будет сложнее.

    Принцип кодирования
    В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от 0 до FFFF16). При этом можно кодировать символы Unicode в диапазонах 000016..D7FF16 и E00016..FFFF16. Исключенный отсюда диапазон D80016..DFFF16 используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16-битными словами.

    Символы Unicode до FFFF16 включительно (исключая диапазон для суррогатов) записываются как есть 16-битным словом.

    Символы же в диапазоне 1000016..10FFFF16 (больше 16 бит) кодируются по следующей схеме:

    Из кода символа вычитается 1000016. В результате получится значение от нуля до FFFFF16, которое помещается в разрядную сетку 20 бит.
    Старшие 10 бит (число в диапазоне 000016..03FF16) суммируются с D80016, и результат идёт в ведущее (первое) слово, которое входит в диапазон D80016..DBFF16.
    Младшие 10 бит (тоже число в диапазоне 000016..03FF16) суммируются с DC0016, и результат идёт в последующее (второе) слово, которое входит в диапазон DC0016..DFFF16.
    Ответ написан
    Комментировать
  • Почему json не парсится?

    twobomb
    @twobomb
    dynamic d = JObject.Parse(json);
    print(d.metadata.title);
    Ответ написан
  • Вопрос про изучение C# – оптимальная методика?

    twobomb
    @twobomb
    Да нормально, это. Я начал знакомство с программированием с языка C++, потом появилась необходимость коё-что сделать на VBA(visual basic for application), выучил его, потом на веб потянуло, выучил js,html, потом полез в бекенд php пришлось осознать что такое бд, поработал с mysql, postgres. Потом решил создать онлайн игру полез в node js, там познакомился с mongodb. Потом столкнулся с Java, за пару недель выучил java и новомодную оболочку javafx. Потом была необходимость разбираться с ассемблерами, masm, fasm, написал загрузчик, упорол флешку, сложно, забил. Потом узнал про C#, полез туда win forms, wpf, опять в геймдев потянуло , полез в Unity параллельно занимался моделированием для игры, познавал себя в блендере, до этого на 3д максе работал. Где-то среди всего этого еще затерялся action script 3 (это язык для флеша, пусть земля ему будет пухом), на котором я тоже делал игруху на бокс2д, чтобы карты для неё можно было создавать через tiled map editor. И это всё малый список из того что я попробовал в первые годы входа в среду программирования, там еще кучи фреймворков было опробовано на разных языках.
    Ну и естественно бывало когда я обучался сразу в 3х+ разных языках. На самом деле самое сложное это определится чего ты хочешь, чем конкретно тебе нравится заниматься, особенно если нравится всё. Поэтому ваше 'я учу C#, а может быть мне хтмл поковырять' выглядит смешно.
    Ответ написан
    Комментировать
  • Отдать значения в поток и вернуть результат выполнения?

    twobomb
    @twobomb
    Никак, просто обращайтесь из одного потока к другому напрямую или через Invoke. Если напрямую и боитесь что доступ может производится в один момент из двух потоков, используйте lock перед записью.
    Для отмены реализуйте механизм CancellationToken
    Ответ написан
    Комментировать
  • Как сделать конвертацию байтов?

    twobomb
    @twobomb
    function myfunc($text){
    	$text = utf8_encode($text);
    
    	$buffer = [];
    	foreach(mb_str_split($text) as $v)
    		$buffer[] = ord($v);
    
    	for ($i = count($buffer)-2; $i >= 0; $i--)
    		$buffer[$i] ^= $buffer[$i+1];
    
    	$buffer[count($buffer) - 1] ^= $buffer[0];
    
    	return implode(array_map("dec2hexbyte", $buffer));
    }
    
    function dec2hexbyte($number){
    	$hexval = dechex($number);
    	if(mb_strlen($hexval) == 1)
    		$hexval = "0".$hexval;
        return mb_strtoupper($hexval);
    }
    
    
    $text = "my text";
    echo myfunc($text);
    Ответ написан
    Комментировать
  • Почему не работает код в C#?

    twobomb
    @twobomb
    Ну потому-что у битмапа нет таких методов. Это методы Graphics. Используйте
    Graphics g = Graphics.FromImage(gBitmap);
    g.Clear(Color.White);

    и т.д.
    Ответ написан
  • Можно ли удалить повторяющиеся элементы из маcсива написав меньше кода чем я?

    twobomb
    @twobomb
    int[] array = { 1, 2, 33, 44, 44, 44, 44, 33, 22, 15 };
                array = array.Distinct().ToArray();
    Ответ написан
    Комментировать
  • Как посчитать количество в группе?

    twobomb
    @twobomb
    var list =
                    table.GroupBy(g => new { g.Rating })
                    .Select(f => new int[] { f.Key.Rating, table.Count(f1 => f1.Rating.Equals(f.Key.Rating)) })
                    .ToList();
                foreach (var l in list)
                    Console.WriteLine("Рейинг {0} - количество {1}",l[0],l[1]);
    Ответ написан
  • Как округлить число в C#?

    twobomb
    @twobomb
    Округлить десятки 625/10=62,5 округляем раундом, далее умножаем на 10 = 620
    Округлить сотки 625/100=6,25 округляем раундом, далее умножаем на 100 = 600
    И т.д.
    Ответ написан
    Комментировать
  • Как заполнить матрицу натуральными числами в следующем порядке на C#?

    twobomb
    @twobomb
    static void Main(string[] args)
            {
                Console.WriteLine("Введите n:");
                int n = Int32.Parse(Console.ReadLine());
    
    
                //Строим матрицу
                int[,] mx = new int[n,n];
                bool invert = true;
                for (int i = 0, c = 1; i < n; i++) {
                    for (int j = 0; j < n; j++,c++) {
                        int inx = invert ?  n - j - 1: j;
                        mx[inx, i] = c;
                    }
                    invert = !invert;
                }
    
                //Выводим
                int maxWidth = (n * n).ToString().Length;
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < n; i++) {
                    for (int  j = 0;  j < n; j++) 
                        sb.Append(mx[i, j]).Append(' ', maxWidth - mx[i, j].ToString().Length+1);
                    sb.AppendLine();
                }
                Console.WriteLine(sb);
    
                Console.ReadKey();
    
            }

    618d6cb9c368b225095390.png
    Ответ написан