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

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

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    как интерфейс. а в чем проблемы?
    Ответ написан
  • Исключение это и есть ошибка?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    Исключение это и есть ошибка?
    запланированная возможности ошибки (обычно высоко вероятной)
    ps предполагая вероятную ошибку, мы даем инструмент ее обработки.. (я думаю, что изобретатели Exception думали именно так
    pps по опыту кодинга && рефакторинга, думаю, это классный инструмент.. но не для новичков
    Ответ написан
    Комментировать
  • Перегрузка методов - это не более, чем синтаксический сахар?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    это точно не сахар, а чистой воды полиформизм ООП
    ваш вопрос скорее в плоскости стоит ли использовать полиформизм?
    можно нагуглить море инфы к примеру сразу на русском https://habr.com/ru/post/37576/
    ps чем пользуюсь сам, чуть ли не ежедневно
    static void print(this string s, string pfx = "", string sfx = "") => Console.WriteLine(pfx + s + sfx);
    static void print(this IEnumerable<string> sa, string pfx = "", string sfx = "") => sa.ToList().ForEach(s => s.print(pfx, sfx));
    pps ну или упрощенно
    static void print(this string s) => Console.WriteLine(s);
    static void print(this IEnumerable<string> sa) => sa.ToList().ForEach(s => s.print());
    ppps очень удобно
    using System;
    using System.Diagnostics;
    using System.Linq;
    
    namespace ff.links
    {
        static partial class Program
        {
            static void Main(string[] args)
            {
                var sw = new Stopwatch();
                sw.Start();
                "let's begin...".print();
    
                var finds = fromTypical().scan();
                "find targets is ".print(pfx, finds.Count().ToString());
                //finds.print();
                var bro = finds.Where(b => b.Contains(ffBinary));
                "find browsers is ".print(pfx, bro.Count().ToString());
                bro.print(pfx);
                var cfg = finds.Where(b => b.Contains(fflConfig));
                "find configs is ".print(pfx, cfg.Count().ToString());
                cfg.print(pfx);
                var profiles = finds.Where(b => b.Contains(ffProfileSign));
                "find profiles is ".print(pfx, profiles.Count().ToString());
                //profiles.print();
    
                profiles.buildLinks(bro.First());
                //profiles.prefsApplay();
    
                //links2start();
                sw.Stop();
                var ts = sw.Elapsed;
                $"RunTime {ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{ts.Milliseconds:000}".print();
    //#if DEBUG
    //            "press any key to continue...".print();
    //            Console.ReadKey();
    //#endif
            }
            const string pfx = "  ::> ";
        }
    }
    Ответ написан
    6 комментариев
  • Статические методы вызываются быстрее?

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

    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 комментариев