Ответы пользователя по тегу C#
  • Где ошибка в коде?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Назовем натуральное число палиндромом, если его запись читается одинаково
    сначала и с конца (например: 4884, 393,1)
    про 393,1 не понятно
    Где ошибка в коде?
    ошибки и в коде, ошибки в ходе мыслей
    1 - зачем ввод заранее известного параметра? (100)
    2 - зачем сравнивать с b мало того что вы его не меняете, вы его еще и всегда обнуляете!!!кажется написано в процессе своих оптимизаций.. сорян
    3 - пример на подумать (еще утоптано)
    using System;
    using System.Linq;
    
    namespace palindrome
    {
        class Program
        {
            static void Main(string[] args)
            {
                int p = 0;
                string q = default, r = default;
                for (int i = 1; i < 100; i++)
                    if ((q = (i * i).ToString()) == (r = new string(q.Reverse().ToArray())))
                        Console.WriteLine($"palindrome {++p} q={q} == r={r}"); ;
                Console.WriteLine($"total: {p}");
            }
        }
    }
    Ответ написан
  • Стоит ли использовать здесь перечисления?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    программирование интересная штука - работает? не трогай!
    Мне кажется, что вместо классов здесь должны быть интерфейсы?
    в тексте вопроса
    Стоит ли использовать здесь перечисления?
    вы уж определитесь в хотелках:
    - перечисления?
    - интерфейсы?
    - и то и другое?
    .. а зачем? (с) из хорошего анекдота
    а мораль простая - если понимаете зачем? выпиливайте, тестируйте, пользуйтесь!

    ps со стороны, все это невозможно оценить без детально расписанных сценариев использования
    Ответ написан
    Комментировать
  • Хорошая книга по C# с практикой и на понятном языке?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    сначала мне бы хорошо изучить шарп
    (вроде с этого и начинал, но потерялось, восстанавливаю) это лучшая отправная точка
    и на понятном языке
    это явно главная проблема..
    приведу любимую (на протяжении уже десятков лет) цитату:
    язык, как средство общения, становится коммуникабельным, лишь тогда, когда собеседники опираются на сходный жизненный опыт
    (с) Элан Уотс, "Путь Дзэн"
    и обязательно с ... интерактивом
    ну блин.. интерактив и книги??? это не совместимо..
    интерактив это сайты ... и/или опять игры смыслов? (ваши непонятки?).. ,бывает интерактив в продвинутых IDE, для поддерживаемых языков
    Ответ написан
  • Почему нельзя вызывать методы объекта через свойство делегата Target?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    можно
    using System;
    
    namespace SomeNonStatic
    {
        class Program
        {
            delegate void someDelegate();
            static void Main(string[] args)
            {
                var so = new SomeClass();
                someDelegate sd = so.SomeNonStaticMethod;
    
                Console.WriteLine($"someDelegate.Target == someObject => {sd.Target == so}");
    
                (sd.Target as SomeClass).SomeMethod(); // а вот так почему-то нельзя
            }
        }
    
        internal class SomeClass
        {
            internal void SomeNonStaticMethod() => Console.WriteLine("it's SomeNonStaticMethod");
            internal void SomeMethod() => Console.WriteLine("it's SomeMethod");
        }
    }
    а еще лучше так
    using System;
    
    namespace SomeNonStatic
    {
        class Program
        {
            delegate void someDelegate();
            static void Main(string[] args)
            {
                var so = new SomeClass();
                someDelegate sd = so.SomeNonStaticMethod;
    
                Console.WriteLine($"someDelegate.Target == someObject => {sd.Target == so}");
    
                if(sd.Target.GetType() is SomeClass)
                    (sd.Target as SomeClass).SomeMethod(); // а вот так почему-то нельзя
            }
        }
    
        internal class SomeClass
        {
            internal void SomeNonStaticMethod() => Console.WriteLine("it's SomeNonStaticMethod");
            internal void SomeMethod() => Console.WriteLine("it's SomeMethod");
        }
    }
    Ответ написан
    Комментировать
  • Где допущена ошибка при проверки c Split('-')?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    уточните условия. а то даже приведенный код дает другой выхлоп
    слегка модифицируем
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace parse_xxxx_000
    {
        static class Program
        {
    
            static void Main(string[] args)
            {
                "zit-101".parse().print();
                "101-zit".parse().print();
                "zit101".parse().print();
                "101zit".parse().print();
            }
    
            static void print(this object o) => Console.WriteLine(o.ToString());
    
            static (string, bool) parse(this string s)
            {
                bool valid = true; //полагаем, что индекс является группой
                var parts = s.Split('-'); //разделяем на части по тире
                if (parts.Length == 2) //если получили две части
                {
                    //разбор первой части
                    string p1 = parts[0];
                    if (p1.Length == 3 || (p1.Length == 4 && Char.IsLetter(p1[3]))) //трехсимвольная часть, либо 4-символьная
                    {
                        //должно быть 3 больших буквы
                        for (int i = 0; i < 3; i++)
                        {
                            if (!Char.IsLetter(p1[i]))
                            {
                                valid = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        valid = false;
                    }
                    //если первая часть подходит, проверяем вторую
                    if (valid)
                    {
                        string p2 = parts[1];
                        if (p2.Length == 3) //трехсимвольная часть
                        {
                            //должно быть 3 цифры
                            for (int i = 0; i < 3; i++)
                            {
                                if (!Char.IsDigit(p2[i]))
                                {
                                    valid = false;
                                    break;
                                }
                            }
                            //проверка первой цифыр 1..5
                            if (valid)
                            {
                                int a = int.Parse(p2[0].ToString());
                                if (a < 1 || a > 5)
                                {
                                    valid = false;
                                }
                            }
    
                        }
                    }
                }
                return (s, valid);
            }
        }
    }
    и получим
    octVl3r.png

    .. попробую свернуть.. с конца..
    //проверка первой цифыр 1..5
    if (valid)
            valid = (p2[0] >= '1') && (p2[0] <= '5');
    //должно быть 3 цифры
    valid = p2.All(c => Char.IsDigit(c));
    //если первая часть подходит, проверяем вторую
    //если первая часть подходит, проверяем вторую
                    if (valid)
                    {
                        //трехсимвольная часть
                        //должно быть 3 цифры
                        //проверка первой цифыр 1..5
                        string p2 = parts[1];
                        valid = p2.Length == 3 && p2.All(c => Char.IsDigit(c)) && ((p2[0] >= '1') && (p2[0] <= '5'));
                    }

    .. упростим логику. ту внимательно смотри как
    было
    static (string, bool) parse(this string s)
            {
                bool valid = true; //полагаем, что индекс является группой
                var parts = s.Split('-'); //разделяем на части по тире
                if (parts.Length == 2) //если получили две части
                {
                    //разбор первой части
                    string p1 = parts[0];
                    if (p1.Length == 3 || (p1.Length == 4 && Char.IsLetter(p1[3]))) //трехсимвольная часть, либо 4-символьная
                    {
                        //должно быть 3 больших буквы
                        for (int i = 0; i < 3; i++)
                        {
                            if (!Char.IsLetter(p1[i]))
                            {
                                valid = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        valid = false;
                    }
                    //если первая часть подходит, проверяем вторую
                    if (valid)
                    {
                        //трехсимвольная часть
                        //должно быть 3 цифры
                        //проверка первой цифыр 1..5
                        string p2 = parts[1];
                        valid = p2.Length == 3 && p2.All(c => Char.IsDigit(c)) && ((p2[0] >= '1') && (p2[0] <= '5'));
                    }
                }
                return (s, valid);
            }
    и как лучше (упс, исправлена поспешность )))
    static (string, bool) parse(this string s)
            {
                bool valid = true; //полагаем, что индекс является группой
                var parts = s.Split('-'); //разделяем на части по тире
                if (parts.Length == 2) //если получили две части
                {
                    //разбор первой части
                    string p1 = parts[0];
                    if (p1.Length == 3 || (p1.Length == 4 && Char.IsLetter(p1[3]))) //трехсимвольная часть, либо 4-символьная
                    {
                        //должно быть 3 больших буквы
                        for (int i = 0; i < 3; i++)
                        {
                            if (!Char.IsLetter(p1[i]))
                            {
                                valid = false;
                                break;
                            }
                        }
                    }
                    else
                        valid = false;
                    //если первая часть подходит, проверяем вторую
                    valid &=
                        //должно быть 3 цифры
                        parts[1].Length == 3 &&
                        parts[1].All(c => Char.IsDigit(c)) &&
                        //проверка первой цифыр 1..5
                        ((parts[1][0] >= '1') && (parts[1][0] <= '5'));
                }
                return (s, valid);
            }
    ...применяем туже логику и
    static (string, bool) parse(this string s)
            {
                bool valid = true; //полагаем, что индекс является группой
                var parts = s.Split('-'); //разделяем на части по тире
                if (parts.Length == 2) //если получили две части
                {
                    //разбор первой части
                    valid &=
                        //должно быть 3 больших буквы .. на самом деле ты и не проверял большие
                        //трехсимвольная часть, либо 4-символьная
                        (parts[0].Length == 3 || parts[0].Length == 4) &&
                        parts[0].All(c => Char.IsLetter(c));
                    //если первая часть подходит, проверяем вторую
                    valid &=
                        //должно быть 3 цифры
                        parts[1].Length == 3 &&
                        parts[1].All(c => Char.IsDigit(c)) &&
                        //проверка первой цифыр 1..5
                        ((parts[1][0] >= '1') && (parts[1][0] <= '5'));
                }
                return (s, valid);
            }
    ...и еще разок
    static (string, bool) parse(this string s)
            {
                bool valid = true; //полагаем, что индекс является группой
                var parts = s.Split('-'); //разделяем на части по тире
                if (parts.Length == 2) //если получили две части
                {
                    valid &=
                        //разбор первой части
                        //должно быть 3 больших буквы .. на самом деле ты и не проверял большие
                        //трехсимвольная часть, либо 4-символьная
                        (parts[0].Length == 3 || parts[0].Length == 4) &&
                        parts[0].All(c => Char.IsLetter(c)) &&
                        //если первая часть подходит, проверяем вторую
                        //должно быть 3 цифры
                        parts[1].Length == 3 &&
                        parts[1].All(c => Char.IsDigit(c)) &&
                        //проверка первой цифыр 1..5
                        ((parts[1][0] >= '1') && (parts[1][0] <= '5'));
                }
                return (s, valid);
            }

    ну вот где то теперь, можно заметить, что не стоит сразу предполагать успех..
    продолжить?
    убираем предположения
    static (string, bool) parse(this string s)
            {
                var parts = s.Split('-'); //разделяем на части по тире
                return (s,
                    //если получили две части
                    parts.Length == 2 &&
                    //разбор первой части
                    //должно быть 3 больших буквы .. на самом деле ты и не проверял большие
                    //трехсимвольная часть, либо 4-символьная
                    (parts[0].Length == 3 || parts[0].Length == 4) &&
                    parts[0].All(c => Char.IsLetter(c)) &&
                    //если первая часть подходит, проверяем вторую
                    //должно быть 3 цифры
                    parts[1].Length == 3 &&
                    parts[1].All(c => Char.IsDigit(c)) &&
                    //проверка первой цифыр 1..5
                    ((parts[1][0] >= '1') && (parts[1][0] <= '5')));
            }
    и сразу поменялся результат
    VcOviP6.png


    все. тут уже должно быть понятно

    забавно, но мы умудрились исчерпать размер ответа. но можно и так https://dotnetfiddle.net/Bdge92
    а без каментов и пустых строк выглядит компактно 7ugOOhy.png
    Ответ написан
    Комментировать
  • Как обновить datatable?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    https://docs.microsoft.com/en-us/dotnet/api/system...

    в отличии от примера, вам не надо создавать новую строку. просто меняете значения полей
    .. или всей строки
    Ответ написан
    Комментировать
  • Как сделать что бы текст в label который находится в tabControl, можно было пролистывать только вниз, а по горизонтали нельзя?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    надо смотреть не на tabControl, в нем явно либо TextBox, либо RichTextBox
    у обоих есть свойство вроде ScrollBars
    при этом, вам надо помнить, что горизонтальный скрол появляется при наличии длинных строк
    вы готовы их игнорировать? или включить WordWrap? в культурных редакторах, такой режим как то обозначается. но в базовых контролах таких фишек нет. пользователь посто не поймет - это новая строка? или продолжение длинной строки?

    ps
    текст в label
    а у label скролов вообще не бывает
    Ответ написан
  • Как офлайн хранить данные из БД в приложении Win Forms?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    в exe ни как. если только сохранять в отдельный файл - json, csv, xml.. на самом деле много вариантов, хоть свой формат запилить
    или в легковесную встраиваемую БД

    ps популярные варианты - SQLite, MS SQLCE, LiteDB.. на самом деле много вариантов
    pps даже Access - прикол в том что первичен уже давно не сам Access, а движок. он встроен в любую винду по дефолту. очень много поколений
    ppps
    а как "скопировать" эти самые "куски" из общей базы архива - я не знаю.
    таки смотрите сюда (если конечно у вас MS SQL, о чем можно предположить по разнообразным отрывкам)
    https://docs.microsoft.com/en-us/sql/integration-s...
    https://docs.microsoft.com/ru-ru/sql/integration-s...
    а еще оч даже на ура можно использовать LINQpad для этих же целей
    Ответ написан
  • Как решить задачу с массивом?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    - найти индекс элемента с наибольшим значением гугли C# поиск максимального в массиве
    - найденный индекс увеличить на единицу
    - в цикле от этого индекса, до конца массива, все элементы увеличить на единицу
    Ответ написан
  • Можно ли получить доступ к загружаемым ресурсам сайта через c#?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    ответ однозначный - можно
    но как - это может сильно отличаться для разных браузеров (хотя с доминантой движка хромиум наверное не очень):
    - изучить структуру профиля (upd и конечно определять папку профиля)
    - назначение папок
    - назначение файлов
    - научиться читать базы sqlite

    .. ну в общем то и все

    ps не факт что все. наверняка еще json читать пригодится.. ну еще может распаковку там из zip или других форматов, тоже вероятно
    pps а еще возможно потребуется научиться различать сигнатуры графических файлов. они в кешах могут не иметь адекватных расширений
    ppps а если на ходу то Selenium видимо
    Ответ написан
  • Как узнать, что асинхронный метод выполнил свою работу?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    вопрос довольно интересный. вы можете загружать синхронно, но придется дольше ждать
    загружать асинхронно очень логично. но тогда вам надо изучать доки на api
    вы часом не вот это используете?
    https://developers.google.com/api-client-library/d...

    если да, то логика примерно такая
    https://developers.google.com/api-client-library/d...
    по IDownloadProgress.Status вы узнаете когда будет 100%, но надо читать доки, возможно есть калбэк сообщающий конкретно о завершении

    если другой api, все равно - у вас в коде, для видеопотока, указан progressHandler, сделайте такой же и для аудио. когда оба отловят 100%, тогда время и объединять..
    .. еще точнее можно начинать. хотя может оказаться что какие то тайм ауты потребуются, если дисковая система не очень быстрая + загрузка в tmp, а потом копирование в целевую папку. об этом тоже надо искать инфу в доках на api. но когда отловите окончания загрузок, тайм ауты при необходимости, можно и экспериментально подбирать
    .. или там изучить подписку на файловые события https://docs.microsoft.com/ru-ru/dotnet/api/system...
    Ответ написан
    Комментировать
  • Как сократить условие?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    суммируя идеи (и еще кортежи докинем..)
    // подправил для наглядности
    using System;
    using System.Linq;
    
    namespace SiO2
    {
        class Program
        {
            static void Main(string[] args)
            {
                var name = "SiO2 (полиморф.)";
                var curTemp = 846.15;
                var (h, s, a, b, c) = (-1f, -1f, -1f, -1f, -1f);
    
                var names = new string[]
                {
                    "SiO2 (β-кварц)",
                    "SiO2 (α-кварц)",
                    "SiO2 (α-тридимит)",
                    "SiO2 (β-кристобалит)",
                    "SiO2(к) кварц",
                    "SiO2(к) тридимит",
                    "SiO2(к) кристобалит",
                    "SiO2 (полиморф.)"
                };
    
                var values = new (float, float, float, float, float)[]
                {
                    (-217.75F, 10.00F, 11.22F,   8.2F, -2.70F),
                    (-217.60F,  0.00F, 14.41F,  1.94F,  0.00F),
                    (-216.50F, 10.40F, 13.64F,  2.64F,  0.00F),
                    (-215.95F, 10.19F,  4.28F, 21.06F,  0.00F)
                };
    
                if (names.Contains(name))
                {
                    if (curTemp <= 846.15)
                        (h, s, a, b, c) = values[0];
                    else if (curTemp >= 846.15)
                        (h, s, a, b, c) = values[1];
                    else if (curTemp >= 1143.15)
                        (h, s, a, b, c) = values[2];
                    else if (curTemp >= 1743.15)
                        (h, s, a, b, c) = values[3];
                }
    
                Console.WriteLine(h);
                Console.WriteLine(s);
                Console.WriteLine(a);
                Console.WriteLine(b);
                Console.WriteLine(c);
            }
        }
    }

    при этом глядя на численные величины, у меня сомнение, что возможно их можно и к функциям привести. но это уже вам надо смотреть по условиям задачи
    Ответ написан
    Комментировать
  • Как определить разницу во времени в миллисекундах между двумя слайдами анимации в среде C#?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Выдает ошибку "Имя х не существует в данном контексте"
    правильно
    if (k == 7)
    {
            pictureBox1.Image = Resources._7;
            var x = DateTime.Now.ToString("ss:fff" );
    }
    // после этой фигурной скобки x уже не существует
    ps на подумать в чем разница
    var x = "";
    if (k == 7)
    {
            pictureBox1.Image = Resources._7;
            x = DateTime.Now.ToString("ss:fff" );
    }

    pps верно, еще про строки - для строк есть + но это склейка строк. в C# нет динамического преобразования типов (хотя бывает приведение типов по умолчанию, но далеко не всегда)
    вот полезная статья о то как можно замерять время на C# https://habr.com/ru/post/226279/
    Ответ написан
  • Как создать метод для родительского класса?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Как создать метод для родительского класса?
    дословно - ни как. в потомке вы можете добавлять методы и/или переопределять. но создать из потомка метод для родителя невозможно
    Ответ написан
    Комментировать
  • Как разделить полученные запросом данные по разным формам?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Как разделить полученные запросом данные по разным формам?
    а не надо делить
    надо делать адекватные запросы под каждую форму

    ps но для оптимизации можно использовать временные таблицы или view
    но это когда хорошо разберетесь

    pps
    вы можете сделать какой то запрос к БД, и получить набор данных в памяти. Array/List/IEnumerable/Dictionary
    и делить уже этот набор. upd допустим средствами LINQ

    хотя это просто альтернатива временным таблицам или view. в любом случае вам все таки надо понять что и в какой момент времени происходит. а для этого надо двигаться от простых схем данных/логики/предсталения, к более сложным, чуть помедленнее
    Ответ написан
    7 комментариев
  • Как сделать кнопку "назад" в winforms C#?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    1 - сделать кнопку
    2 - выпилить дизайн
    3 - заточить код клика
    .. а вы как хотели?
    Ответ написан
  • Опенсорс софта который превращает телефон в кардиограф, где найти?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    пару лет назад натыкался на такое приложение в плей стор
    но это не повод ждать решения в
    Опенсорс
    тем более именно на C#. тема ни в одном месте не похожа на простую. даже если бы что то и было, для Android логичнее ожидать Java
    Ответ написан
    Комментировать
  • Что лучше: обработать исключение или не вызывать его?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    практикуйте замеры времени исполнения.. и вопросы отпадут

    ps для async схем все может сильно меняться
    Ответ написан
    Комментировать
  • Как удалить всё, кроме букв?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    для разнообразия https://ideone.com/h7RtVy
    Ответ написан
    Комментировать
  • Как получить код завершения программы?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    помедитировать 1
    using System;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static int Main(string[] args)
            {
                  // по фиг что
                  returnt <что то int>;
            }
        }
    }
    Ответ написан