• Как вернуть коллекцию для IEnumerable метода расширения?

    ayazer
    @ayazer
    Sr. Software Engineer
    public static IEnumerable<int> ExtensionMethod(this IEnumerable<int> list, int percentline)
            {
                try
                {
                    if (list.Count() <= 100 && list.Count() >= 1)
                    {
                        IEnumerable<int> count = list.OrderByDescending(sort => sort).Take((int)(list.Count() * percentline / 100.0f));
                        Console.WriteLine("Перечень элементов: \n" + string.Join(", ", count));
                    }
                    else
                    {
                        throw new ArgumentException();
                    }
                }
                catch (ArgumentException)
                {
                    Console.Write("ОШИБКА!!!\n");
                }
                return list;
            }


    ну и соотв далее

    var list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
                list
                    .ExtensionMethod(10)
                    .ExtensionMethod(25);
    Ответ написан
    3 комментария
  • Как найти частичные совпадения строки запроса в БД для полнотекстового поиска PostgreSQL?

    ayazer
    @ayazer
    Sr. Software Engineer
    Т.е. сделать свой препарсер, который будет отдавать потом запрос в нормальный парсер, который обрежет словоформы.


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

    Дальше это нужно ранжировать. У нас OR, и я не очень понимаю, как будут распределяться веса

    если тут нужно МНОГО специфических настроек - лучше сразу смотреть в сторону того-же солра. В постгресе все-же поддержка полнотекстового поиска постолько-поскольку. Для многих задач ее хватает, но я в свое время страдал т.к. постоянно натыкался на стену "а так сделать нельзя". Но в целом хоть как-то постгрес ранжирует +есть возможность ручками подправить веса для ключевых частей. Т.е. для примера

    select json_flat_content , ts_rank_cd(json_flat_tsv, 'jzvmw | julva | qxqvh | name | value') r
    from my_fulltext_index i
    where
    	i.json_flat_tsv @@ to_tsquery('simple', 'jzvmw | julva | qxqvh | name | value')
    order by r desc


    вернет

    [{"name": "qtmlx", "value": "jzvmw  vajwq julva  ipsmwtbhki  lhgzr"}, {"name": "fslto", "value": "viykw"}]	0.6
    [{"name": "lhnhq", "value": "sxgxh!!daxrh guxux!!kfgtirmgig!!ivqwz"}, {"name": "qxqvh", "value": "qbeli"}]	0.5
    [{"name": "cepja", "value": "mrfma"}, {"name": "gwjqa", "value": "csxaf"}]	0.4
    [{"name": "val", "value": "TNhmT<KxERm"}]	0.2


    ну и да, для запроса "мультфильм | Норштейн | Ежик <-> тумане" может понадобится ручками указать меньший вес для "мультфильм" и больший для "Норштейн". И заодно подумать что делать если в поиске из-за очепятки будет "орНштейн"

    + стоит обратить внимание что постгрес (по крайней мере версии 9.5 и 10.? с которыми я работал) плохо работал с нграмами. а точнее - для этого нужно было ставить доп. плагины и потом все это собирать в кучу. т.е. по"сло:*" найти "слово" можно, но по "ово" найти "слово" - уже нет.

    + возможно нужна будет работа с очепятками

    + я не помню умеет ли постгрес работать с синонимами. Это может быть тоже важно

    в целом как для быстрого и сердитого прототипирования - полнотекстовый поиск в постгресе удобно использовать. Но если нужен серьезный полнотекстовый поиск - лучше смотреть на инструменты которые на это заточены
    Ответ написан
    1 комментарий
  • Почему не работает приведение интерфейса в тип?

    ayazer
    @ayazer
    Sr. Software Engineer
    https://github.com/MassTransit/MassTransit/blob/5e...

    вот это не тот Fault про который вы думаете. Где-то в недрах GreenPipes есть еще один класс Fault. Так что никакий магии не случилось -

    using MassTransit;
    using System;
    
    namespace GreenPipes.DynamicInternal.MassTransit
    {
        public class MyFault<T> : Fault<T>
        {
            public T Message => throw new NotImplementedException();
    
            public Guid FaultId => throw new NotImplementedException();
    
            public Guid? FaultedMessageId => throw new NotImplementedException();
    
            public DateTime Timestamp => throw new NotImplementedException();
    
            public ExceptionInfo[] Exceptions => throw new NotImplementedException();
    
            public HostInfo Host => throw new NotImplementedException();
    
            public string[] FaultMessageTypes => throw new NotImplementedException();
        }
    
        public class Fault: MyFault<object>
        {
    
        }
    
    
        public class Program
        {
            static void Main(string[] args)
            {
                var fault = new Fault();
    
                string typename = fault.GetType().FullName; //GreenPipes.DynamicInternal.MassTransit.Fault
    
            }
        }
    }
    Ответ написан
    Комментировать
  • Как на C# делать андроид игры (НЕ unity)?

    ayazer
    @ayazer
    Sr. Software Engineer
    если C# и НЕ юнити - абсолютно точно возможно используя моногейм, и скорее всего возможно используя FNA
    Ответ написан
    Комментировать
  • Как прочитать размер файла по FTP?

    ayazer
    @ayazer
    Sr. Software Engineer
    550 Requested action not taken. File unavailable (e.g., file not found, no access). (тык)

    есть SIZE, но это не часть фтп протокола, потому не все сервера это поддерживают (хотя в этом случае должен был быть другой код ошибки). может быть ваш фтп клиент пытается отправить MLSD/LIST чтоб получить информацию про все файлы, и потом выдрать размер нужного. И если у пользователя нет на это прав - 550 смотрится правдоподобно. т.е. если вы случайно не передаете разные filename - это НЕ проблема вашего кода

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

    ну и если очень хочется именно эту библиотеку, но она не умеет в дебаг - вайршарк в помощь. в нем даже готовый фильтр для фтп есть, только помните что данные и команды отправляются по разным портам
    Ответ написан
    4 комментария
  • Как объявить двумерный массив?

    ayazer
    @ayazer
    Sr. Software Engineer
    если вам нужен квадратный массив то

    byte[,] iter_num = new byte[16, 32];
    iter_num[1,2] = 1;


    если нужен массив массивов то тогда уже
    byte[][] iter_num = new byte[16][];
    
    for (var i=0; i<iter_num.GetLength(0); i++)
    {
         iter_num[i] = new byte[32];
    }
    iter_num[1][2] = 1;
    Ответ написан
    Комментировать
  • Как получить изменения с гх?

    ayazer
    @ayazer
    Sr. Software Engineer
    https://git-scm.com/docs/git-pull

    только origin указать не как вашу форку, а как оригинальный репозиторий
    Ответ написан
    2 комментария
  • Hе получается преобразовать символы в byte, как сделать так чтобы это работало?

    ayazer
    @ayazer
    Sr. Software Engineer
    var str = "test12!#@<смайлик>";
    
    var utf16bytes = Encoding.Unicode.GetBytes(str);
    var utf16reversed = Encoding.Unicode.GetString(utf16bytes); #test12!#@<смайлик>


    вы что-то где-то путаете, проверяйте свой хендлер и то, как и в какой кодировке вы данные отправляете. та-же разница в BE/LE между машинами может к веселым багам приводить. Ну и в целом - так как делаете вы - делать нельзя. Если у вас на 256 СИМВОЛ попадет "<смайлик>" (т.е. суррогат, который состоит с 2ух реальных символов), но у вас возникнет ошибка при декодинге. Потому как минимум - нужно использовать енкодер со состоянием (var enc = Encoding.Unicode.GetEncoder(); ...). Ну или реализовать это самому через проверку char.IsLowSurrogate/char.IsHighSurrogate.

    UPD: даже у тостера оказывается проблема с суррогатами, вместо <смайлик> должен был быть U+1F60A ( https://www.compart.com/en/unicode/U+1F60A)
    Ответ написан
    Комментировать
  • Как обратиться к аргументу метода в классе?

    ayazer
    @ayazer
    Sr. Software Engineer
    def add(self, product, how_much):
      ...
      total_price = product.price * how_much
      ...
    Ответ написан
    1 комментарий
  • Почему Thread работает так?

    ayazer
    @ayazer
    Sr. Software Engineer
    потому что когда отработает Console.WriteLine то i уже станет 2.

    for (int i = 0; i < 2; i++)
    {
        var index = i;
        var thread = new Thread(() =>
        {
            Console.WriteLine("main index: " + index);
    
        });
        thread.Start();
    }
    
    //main index: 1
    //main index: 0
    Ответ написан
    Комментировать
  • Как сформировать массив, длина которого будет равна количеству элементов, удовлетворяющих условию?

    ayazer
    @ayazer
    Sr. Software Engineer
    все же проще

    var min = 10;
    var max = 45;
    
    var array = new int[]
    {
        12, -1, 50, -23, 43
    };
    var avg = array.Average(); //16.2
    
    var newArray = array.Where(c => c > min && c < max && c > 0).ToArray(); // [12, 43]
    var newAvg = newArray.Average(); //27.5
    Ответ написан
    Комментировать
  • Как отражается изменения словаря на присваиваемые?

    ayazer
    @ayazer
    Sr. Software Engineer
    https://docs.microsoft.com/en-us/dotnet/csharp/lan...

    как я понимаю если я буду менять значения в Dictionary1 то они будут меняться и в 2 и 3 словарях?

    да, так как все будут ссылатся на один и тот-же объект

    но если я буду менять значения в 2 и 3 словарях они не будут затрагивать друг друга?

    будут, т.к. они будут ссылатся на один и тот-же объект

    то есть меняя значения в 2 словаре это никак не отразится на 3 словарь, я правильно понимаю?

    нет

    А то просто во недавно столкнулся с такой проблемой что присвоил один словарь другому Dictionary2 = Dictionary1 потом 1й очистил и 2й автоматом тоже оказался очищенным


    это один и тот-же словарь. просто на него ссылаются две переменные.

    те
    private Dictionary<string, ClassTest> Dictionary1  // переменная Dictionary1 типа Dictionary<> 
        = new Dictionary<string, ClassTest>(); //которая ссылается на объект Dictionary [id=1]
    private Dictionary<string, ClassTest> Dictionary2 // переменная Dictionary2 типа Dictionary<> 
        = new Dictionary<string, ClassTest>(); //которая ссылается на объект Dictionary [id=2]
    private Dictionary<string, ClassTest> Dictionary3 // переменная Dictionary3 типа Dictionary<> 
        = new Dictionary<string, ClassTest>(); //которая ссылается на объект Dictionary [id=3]
    
    //Dictionary1 -заполняем данными
    Dictionary2 = Dictionary1; //переменная Dictionary2 теперь ссылается туда-же, куда и переменная Dictionary1, 
    // т.е на Dictionary [id=1]
    
    Dictionary3 = Dictionary1; //переменная Dictionary3 теперь ссылается туда-же, куда и переменная Dictionary1, 
    // т.е на Dictionary [id=1]
    
    // a объекты Dictionary [id=2] и Dictionary [id=3] будут собраны сборщиком мусора, т.к. они больше не нужны


    UPD:

    а как мне сделать 2 словаря по типу 1го, то есть у меня есть 1й словарь шаблон, я хочу чтобы 2й и 3й словари изначально так же и выглядели (имели все те же данные), но далее данные в них менялись независимо друг от друга?


    ну например как-то так:
    var dict1 = new Dictionary<int, int>()
    {
        [1] = 2,
    };
    
    var dict2 = new Dictionary<int, int>(dict1);
    
    dict1.Add(2, 3);
    dict2.Add(2, 1);
    
    
    var log = new Action<Dictionary<int,int>>((dict) =>
    {
        Console.WriteLine(string.Join(", ", dict.Select(c => $"{c.Key}={c.Value}")));
    });
    
    log(dict1);  //1=2, 2=3
    log(dict2);  //1=2, 2=1
    Ответ написан
  • Как в C# сравнивать кортежи?

    ayazer
    @ayazer
    Sr. Software Engineer
    https://docs.microsoft.com/en-us/dotnet/csharp/fun...

    var user = ("Bob", 37);
    
    var str = user switch {
      ("Tom", 36) => "name: Tom, age: 36",
      ("Bob", 37) => "name: Bob, age: 37",
      _ => "Undefined"
    }
    
    Console.Writeline(str);
    Ответ написан
    1 комментарий
  • Как в Dictionary обратиться к элементу по индексу?

    ayazer
    @ayazer
    Sr. Software Engineer
    Словарь не гарантирует сохранение порядка, потому если он важен - можно использовать специальный класс
    https://docs.microsoft.com/en-us/dotnet/api/system...

    var dict = new OrderedDictionary();
    dict.Add("test1", 1);
    dict.Add("test2", 2);
    dict.Add("test3", 3);
    
    var first = dict["test1"];
    var second = dict[1];
    
    Console.WriteLine(first); #1
    Console.WriteLine(second); #2
    Ответ написан
    Комментировать
  • Зачем кодировать jwt токен в base64?

    ayazer
    @ayazer
    Sr. Software Engineer
    https://datatracker.ietf.org/doc/html/rfc2616#sect...

    в хттп хедерах не может вдруг оказатся джсон, это нарушение протокола
    Ответ написан
    Комментировать
  • Правильно ли я понял для чего нужны UpCast и DownCast?

    ayazer
    @ayazer
    Sr. Software Engineer
    наследник может уметь делать что-то еще. Т.е. даункасты - когда нужно добатся до методов которые не описаны в контракте (те наследник умеет делать что-то, что не умеет делать родитель). Апкасты - когда нам наоборот нужно абстрагироватся от ненужных деталей

    Например:
    public interface IClass {
      void DoSomething();
    }
    
    public class Class1: IClass {
      public void DoSomething() { ... }
    }
    
    public class Class2: Class1{
      public void DoSomethingFaster() { ... }
    }


    в этом примере оба класса могут делать полезную работу, но Class2 может сделать ее быстрее (но это не покрывает все случаи, потому просто использовать Class2 вместо Class1 не выйдет).

    и дальше у нас может быть что-то такое:

    ...
    
    public void InvokeWorker(IClass worker){
    
      if (worker is Class2 class2Worker){
        class2Worker.DoSomethingFaster()
      }
      else {
         worker.DoSomething();
      }
    }


    не то чтоб это было хорошим дизайном, но иногда бывает. в этом случае мы всегда сделаем работу хоть как-то, но в определенных случаях - мы можем сделать даункаст чтоб получить доступ к методам наследника (и сделать работу быстрее)
    Ответ написан
    1 комментарий
  • Switch expression как правильно его использовать?

    ayazer
    @ayazer
    Sr. Software Engineer
    public static string SwitchExpression(object arg) => arg switch
    {
    	String str => "is string",
    	Int32 int32 => "is int32",
    	// ....
    	_ => "is unexpected type"
    };
    Ответ написан
    Комментировать
  • Зачем нужен StringBuilder? В каких случаях нужно использовать StringBuilder? Что мы выиграем используя StringBuilder?

    ayazer
    @ayazer
    Sr. Software Engineer
    смотрите лучше на пример когда у вас 1000 строк по 1мб.

    1000 строк по 1мб = 1Гб выделения памяти при загрузке, и еще (1+1000)/2 * 1000 ~ 500 Гб выделения памяти чтоб хранить промежуточные результаты (2мб сумма первых двух, 3мб сумма первых 3ех, 4мб сумма первых 4...)

    в случае со стрингбилдером у вас будет 1Гб выделения памяти памяти при загрузке + еще 1гб чтоб со всего этого собрать одну мега строку
    Ответ написан
    Комментировать
  • Хочу сделать свой язык программирования на C#. Какие библиотеки есть для этого?

    ayazer
    @ayazer
    Sr. Software Engineer
    antlr, gplex/gppg (аналог lex/yacc) и еще наверно с десяток менее известных.
    Ответ написан
    Комментировать