Задать вопрос
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Олег Остапчук, Foggy Finder, обещаю закончить ))
    мелкий рефакторинг.. но рекомендую найти отличия.. они такие, более шарповые что ли ))
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace Occurrences
    {
        static class Program
        {
            static int useSubString(this string source, string pattern)
            {
                int count = 0;
                while (true)
                {
                    var index = source.IndexOf(pattern);
                    if (index < 0)
                        return count;
                    source = source.Substring(index + pattern.Length);
                    count++;
                }
            }
    
            static int useRemove(this string source, string pattern)
            {
                int count = 0;
                while (true)
                {
                    var index = source.IndexOf(pattern);
                    if (index < 0)
                        return count;
                    source = source.Remove(index, pattern.Length);
                    count++;
                }
            }
    
            static int useSplit(this string source, string pattern)
                => source.Split(new string[] { pattern }, StringSplitOptions.None).Count() - 1;
    
            static int useRegexp(this string source, string pattern)
                => new Regex(pattern).Matches(source).Count;
    
            static void sample(string src = "тук - тук!", string ptn = "тук")
            {
                $"'{ptn}' found on '{src}' use 'useSubString'\t {useSubString(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useRemove'\t {useRemove(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useSplit'\t {useSplit(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useRegexp'\t {useRegexp(src, ptn)} times...".print();
            }
    
            static Random rnd = new Random();
            static string pattren = genPattern();
            static string genPattern()
            {
                var l = rnd.Next(10, 20);
                var sb = new StringBuilder();
                for (var i = 0; i < l; i++)
                    sb.Append((char)('A' + (char)rnd.Next(0, 26)));
                return sb.ToString();
            }
    
            static List<string> sources = new List<string>();
            static void fill(int n)
            {
                for (var i = 0; i < n; i++)
                {
                    var l = rnd.Next(10, 20);
                    var sb = new StringBuilder();
                    for (var j = 0; j < l; j++)
                        if (rnd.Next(0, 7) % 3 != 0)
                            sb.Append((char)('A' + (char)rnd.Next(0, 26)));
                        else
                            sb.Append(pattren);
                    sources.Add(sb.ToString());
                }
            }
    
            static void bench(int n = 1_000_000, bool check = true)
            {
                // массивы что бы убрать влияние динамического создания объектов
                var uss = new int[n];
                var urm = new int[n];
                var usp = new int[n];
                var urx = new int[n];
    
                var sw = new Stopwatch();
                sw.Start();
    
                fill(n);
                var tsf = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    uss[i] = sources[i].useSubString(pattren);
                var tss = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    urm[i] = sources[i].useRemove(pattren);
                var trm = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    usp[i] = sources[i].useSplit(pattren);
                var tsp = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    urx[i] = sources[i].useRegexp(pattren);
                var trx = sw.Elapsed;
                sw.Stop();
    
                // весь вывод выносим за пределы замера
                $"fill\t\t {tsf.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useSubString\t {tss.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useRemove\t {trm.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useSplit\t {tsp.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useRegexp\t {trx.ToString(@"hh\:mm\:ss\.fffff")}".print();
    
                // выод размерности массивов, или чек, что бы сборщик мусора не успел возбудиться ))
                if (check)
                    $"{chk(urm)} {chk(usp)} {chk(urx)}".print();
                else
                    $"{uss.Length} {urm.Length} {usp.Length} {urx.Length}".print();
    
                bool chk(int[] x)
                {
                    for (var i = 0; i < x.Length; i++)
                        if (uss[i] != x[i])
                            return false;
                    return true;
                }
            }
    
            static void Main(string[] args)
            {
                sample();
                bench();
            }
    
            static void print(this string s) => Console.WriteLine(s);
        }
    }
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Олег Остапчук, Foggy Finder,
    добавил чек, для очистки совести ))
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace Occurrences
    {
        static class Program
        {
            static int useSubString(this string source, string pattern)
            {
                int count = 0;
                int index;
                while (true)
                {
                    index = source.IndexOf(pattern);
                    if (index == -1)
                        return count;
                    source = source.Substring(index + pattern.Length);
                    count++;
                }
            }
    
            static int useRemove(this string source, string pattern)
            {
                int count = 0;
                int index;
                while (true)
                {
                    index = source.IndexOf(pattern);
                    if (index == -1)
                        return count;
                    source = source.Remove(index, pattern.Length);
                    count++;
                }
            }
    
            static int useSplit(this string source, string pattern)
                => source.Split(new string[] { pattern }, StringSplitOptions.None).Count() - 1;
    
            static int useRegexp(this string source, string pattern)
                => new Regex(pattern).Matches(source).Count;
    
            static void sample()
            {
                var src = "тук - тук!";
                var ptn = "тук";
                $"'{ptn}' found on '{src}' use 'useSubString'\t {useSubString(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useRemove'\t {useRemove(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useSplit'\t {useSplit(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useRegexp'\t {useRegexp(src, ptn)} times...".print();
            }
    
            static Random rnd = new Random();
            static string pattren = genPattern();
            static string genPattern()
            {
                var l = rnd.Next(10, 20);
                var sb = new StringBuilder();
                for (var i = 0; i < l; i++)
                    sb.Append((char)('A' + (char)rnd.Next(0, 26)));
                return sb.ToString();
            }
    
            static List<string> sources = new List<string>();
            static void fill(int n)
            {
                for (var i = 0; i < n; i++)
                {
                    var l = rnd.Next(10, 20);
                    var sb = new StringBuilder();
                    for (var j = 0; j < l; j++)
                        if (rnd.Next(0, 7) % 3 != 0)
                            sb.Append((char)('A' + (char)rnd.Next(0, 26)));
                        else
                            sb.Append(pattren);
                    sources.Add(sb.ToString());
                }
            }
    
            static void bench(int n, bool check = true)
            {
                // массивы что бы убрать влияние динамического создания объектов
                var uss = new int[n];
                var urm = new int[n];
                var usp = new int[n];
                var urx = new int[n];
    
                var sw = new Stopwatch();
                sw.Start();
    
                fill(n);
                var tsf = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    uss[i] = sources[i].useSubString(pattren);
                var tss = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    urm[i] = sources[i].useRemove(pattren);
                var trm = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    usp[i] = sources[i].useSplit(pattren);
                var tsp = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    urx[i] = sources[i].useRegexp(pattren);
                var trx = sw.Elapsed;
                sw.Stop();
    
                // весь вывод выносим за пределы замера
                //Console.WriteLine(tsf.ToString(@"dddd\.hh\:mm\:ss\.fffffff"));
                $"fill\t {tsf.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useSubString\t {tss.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useRemove\t {trm.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useSplit\t {tsp.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useRegexp\t {trx.ToString(@"hh\:mm\:ss\.fffff")}".print();
    
                // выод размерности массивов, или чек, что бы сборщик мусора не успел возбудиться ))
                if (check)
                    $"{chk(urm)} {chk(usp)} {chk(urx)}".print();
                else
                    $"{uss.Length} {urm.Length} {usp.Length} {urx.Length}".print();
    
                bool chk(int[] x)
                {
                    for (var i = 0; i < x.Length; i++)
                        if (uss[i] != x[i])
                            return false;
                    return true;
                }
            }
    
            static void Main(string[] args)
            {
                sample();
                var n = 1_000_000;
                bench(n);
            }
    
            static void print(this string s) => Console.WriteLine(s);
        }
    }
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Олег Остапчук, Foggy Finder,
    обещанный бенчмарк
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace Occurrences
    {
        static class Program
        {
            static int useSubString(this string source, string pattern)
            {
                int count = 0;
                int index;
                while (true)
                {
                    index = source.IndexOf(pattern);
                    if (index == -1)
                        return count;
                    source = source.Substring(index + pattern.Length);
                    count++;
                }
            }
    
            static int useRemove(this string source, string pattern)
            {
                int count = 0;
                int index;
                while (true)
                {
                    index = source.IndexOf(pattern);
                    if (index == -1)
                        return count;
                    source = source.Remove(index, pattern.Length);
                    count++;
                }
            }
    
            static int useSplit(this string source, string pattern)
                => source.Split(new string[] { pattern }, StringSplitOptions.None).Count() - 1;
    
            static int useRegexp(this string source, string pattern)
                => new Regex(pattern).Matches(source).Count;
    
            static void sample()
            {
                var src = "тук - тук!";
                var ptn = "тук";
                $"'{ptn}' found on '{src}' use 'useSubString'\t {useSubString(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useRemove'\t {useRemove(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useSplit'\t {useSplit(src, ptn)} times...".print();
                $"'{ptn}' found on '{src}' use 'useRegexp'\t {useRegexp(src, ptn)} times...".print();
            }
    
            static Random rnd = new Random();
            static string pattren = genPattern();
            static string genPattern()
            {
                var l = rnd.Next(10, 20);
                var sb = new StringBuilder();
                for (var i = 0; i < l; i++)
                    sb.Append((char)('A' + (char)rnd.Next(0, 26)));
                return sb.ToString();
            }
    
            static List<string> sources = new List<string>();
            static void fill(int n)
            {
                for (var i = 0; i < n; i++)
                {
                    var l = rnd.Next(10, 20);
                    var sb = new StringBuilder();
                    for (var j = 0; j < l; j++)
                        if (rnd.Next(0, 7) % 3 != 0)
                            sb.Append((char)('A' + (char)rnd.Next(0, 26)));
                        else
                            sb.Append(pattren);
                    sources.Add(sb.ToString());
                }
            }
    
            static void bench(int n)
            {
                // массивы что бы убрать влияние динамического создания объектов
                var uss = new int[n];
                var urm = new int[n];
                var usp = new int[n];
                var urx = new int[n];
    
                var sw = new Stopwatch();
                sw.Start();
    
                fill(n);
                var tsf = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    uss[i] = sources[i].useSubString(pattren);
                var tss = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    urm[i] = sources[i].useRemove(pattren);
                var trm = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    usp[i] = sources[i].useSplit(pattren);
                var tsp = sw.Elapsed;
                sw.Reset();
                sw.Start();
    
                for (var i = 0; i < n; i++)
                    urx[i] = sources[i].useRegexp(pattren);
                var trx = sw.Elapsed;
                sw.Stop();
    
                // весь вывод выносим за пределы замера
                $"fill\t {tsf.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useSubString\t {tss.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useRemove\t {trm.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useSplit\t {tsp.ToString(@"hh\:mm\:ss\.fffff")}".print();
                $"useRegexp\t {trx.ToString(@"hh\:mm\:ss\.fffff")}".print();
                // вывод размерности массивов, что бы сборщик мусора не успел возбудиться ))
                $"{uss.Length} {urm.Length} {usp.Length} {urx.Length}".print();
            }
    
            static void Main(string[] args)
            {
                sample();
                var n = 1_000_000;
                bench(n);
            }
    
            static void print(this string s) => Console.WriteLine(s);
        }
    }
    .. и сюрпрайз
    0o4ALXo.png

    регекс ожидаемо проиграл, но и не сказать что бы фатально.. ))
    сабстриг, так же ожидаемо выиграл у ремува...
    но вот что сплит всех уделает "как бог черепаху" искренне не ожидал ))
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Foggy Finder, а вот по F# я пока только "слюнки пускал".. беру ваши репы в копилку ))
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Foggy Finder, не, не пляшет ((.. письмо с джита было, да, я кликнул по ссылке, но.. "не алле"
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Foggy Finder, у вас вход на https://freedom.zulipchat.com/ по акку джита, косячит.. мне так кажется ))
  • Как поднять windows, если единственное что у меня есть это бекап системного раздела?

    mindtester
    @mindtester Куратор тега Windows
    Виктор, не совсем офтоп. это критика вашего ответа. я довольно агрессивно обращаюсь со своими системами, говоря проще - переустанавливаю не редко. это первое

    второе - уже лет 5 как заигрываю с линуксом (и пару лет как перестал материться и плеваться )).. а линукс предпочитает mbr (хотя и gpt/efi давно уже умеет)

    третье - я не нуждаюсь в дисках большого объема. у меня даже двутеров нет. а вот мультибуты обожаю (это когда систему с выделенного ссд, можно поднять и на физике и в виртуалке)

    подитог - инсталятор вин10, даже самый свежий, выбирает gpt/efi, только когда это в биосе доступно (я же не сказал возможность выбора, я сказал запрет)
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Foggy Finder, если не путаю, дотнет 5 обещан осенью 2020 ... а МС за такие сроки, иногда выкидывает фортели (хотя я то только за, можно сказать в предвкушении).. ))
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Foggy Finder, и правда )).. а это точно не корка? десктопный фреймворк тоже открыли? ))

    на глазок, скорее Substring.. если не буду сильно занят ближайшие пару часов - сделаю тест ))
  • Как в xamarin работать с USB custom HID?

    mindtester
    @mindtester Куратор тега C#
    Drottarutarnum, возвращаемся на исходные:
    - гугл
    - ищите решения под java/android (вы не подтвердили явно, но по ходу все таки андрод? ксамарин же не просто так)
    - вчитывайтесь, используйте переводчики
    - ищите нужные словосочетания
    - адаптируйте запрос под xamarin/mono/unity (да да, 99% что если вдруг найдется решение, то его можно будет адаптировать)
  • Как в xamarin работать с USB custom HID?

    mindtester
    @mindtester Куратор тега C#
    Drottarutarnum, не забыли что со свободным английским было бы проще? ;))
  • Определить кол-во вхождений строки в строку - почему не работает?

    mindtester
    @mindtester Куратор тега C#
    Кроме того вместо метода Remove можно использовать метод Substring. Здесь большой разницы в использовании между ними нет, то лично мне кажется что название Substring лучше отражает суть происходящего. Но тут уже дело вкуса.
    согласен что лучше отражает. мало того, это обычно приоритет в современном корпоративе - читаемость (а значит сопровождаемость кода)

    .. но если кому то не лень - можно было бы забенчить варианты:
    - с Remove
    - с Substring
    - с регулярками
    - со сплитом

    (последние два - см мой ответ)

    .. на лимоне, или десяти, входных значений ))
    меньше вряд ли будет разница достойная внимания

    .. при этом, лично я бы сделал ставку именно на Substring, если аккуратно выписать сам метод ))
    .. а аутсайдером по скорости, скорее ожидал бы увидеть регулярки
  • Как поднять windows, если единственное что у меня есть это бекап системного раздела?

    mindtester
    @mindtester Куратор тега Windows
    Я использую этот способ для того, чтобы заставить Win10 работать на MBR (штатно она его не любит и требует GPT).
    чушь. без проблем ставится на mbr. достаточно в биосе вырубить UEFI, достаточно на момент установки
  • Как в xamarin работать с USB custom HID?

    mindtester
    @mindtester Куратор тега C#
    Drottarutarnum, ну значит гибчее надо ))
    какая ОСь? не андроид случайно? может сначала под него покопать?
    глядишь всплывут нужные фразы, которые потом снова с ксамарином совместно запрашивать

    .. учитывая, что других реакций нет. случай явно не частый. а в гугле, мы часто упираемся в то, что не совсем верно задаем вопрос
  • Уехал в Москву, но не тяну по сложности, стоит ли возвращаться домой?

    mindtester
    @mindtester
    БЕЙСЯ ЛО ПОСЛЕДНЕЙ КАПЛИ КРОВИ!!! ... (я 11 лет в Мск профраерился.. ни о чем не жалею )))
  • Как в xamarin работать с USB custom HID?

    mindtester
    @mindtester Куратор тега C#
    насилуйте гугл
  • Зачем передавать User Agent в загловок запроса при работе с VK API?

    mindtester
    @mindtester Куратор тега C#
    JOBEJlUR, ))

    гуглите "противодействие ботам" ;)) это расширит эрудицию. пример поиска довольно качественных материалов на русском языке https://duckduckgo.com/?q=%D0%BF%D1%80%D0%BE%D1%82...

    фишка в site:habr.com это поиск по хабру )) .. (что собственно и гарантирует русскоязычность и качество материала).. кстати, синтаксис целевого указания поиска по сайту по ходу универсальный. именно в таком варианте, его точно поймут и гугл, и яндекс, и дак-дак, и многие другие (хотя мало кто еще чем то пользуется ;).. но далеко не все сайты, используют реально серьезные методы противодействия. возможно не обязательно пытаться охватить все сразу ))

    если сайт не особо обороняется от ботов - может хватить и безголовых браузеров (но это "кодинг в слепую", то есть требуется квалификация, ну или перенос уже хорошо отработанных сценариев)

    тут пролетала ссылка на форк CEF# (или самого CEF и дотнет обертка?).. я даже где то себе отложил.. но не найду ((

    а вообще, под C#, идеальный выбор CEF# .. но придется вкуриваться ;))).. кстати, "безголовый" режим там и так есть "из коробки" ))
  • Почему у компьютера двойное имя?

    mindtester
    @mindtester Куратор тега Windows
    1 - а у вас там вообще sql server есть?
    2 - если хотите детальное расследование (не даром, но и не дорого) - вэлкам в личку