Ответы пользователя по тегу C#
  • Как вернуть коллекцию для 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 комментария
  • Почему не работает приведение интерфейса в тип?

    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;
    Ответ написан
    Комментировать
  • 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)
    Ответ написан
    Комментировать
  • Почему 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
    Ответ написан
    Комментировать
  • Правильно ли я понял для чего нужны 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) и еще наверно с десяток менее известных.
    Ответ написан
    Комментировать
  • Возможна ли переинициализация переменных в C#?

    ayazer
    @ayazer
    Sr. Software Engineer
    {
        var k = 0;
        {
            var k = 5;
        }
    }
    {
        {
            var k = 5;
        }
        var k = 0;
    }


    лучше посмотреть на вот этот пример. c точки зрения компилятора - это равнозначные ситуации
    т.к. во внутреней зоне видимости возникает ситуация что объявленно 2 переменных с одинаковым именем (я сейчас говорю с точки зрения парсинга исходного кода при построении ast). И неважно что переменная в верхней зоне видимости еще даже не инициализирована. Потенциально - да, это могло бы работать иначе, но (похоже что) было решено что преимущества от данного усложнения (разрешить во внутреннем контексте объявлять уже существующие переменные при условии что они еще не были инициализированы во всех внешних контекстах) себя не оправдывают. Кроме того, уж если очень нужно сделать что-то такое то (что достаточно редкая ситуация сама по себе) - это можно разрулить ручками, т.е.
    for (int a = 0; a < 3; a++)
    {
        Console.WriteLine(a);
    }
    
    {
        int a = 3;
    }
    Ответ написан
    4 комментария
  • Как настроить docker?

    ayazer
    @ayazer
    Sr. Software Engineer
    Как уже написал Василий Банников - вы собираете проект, не весь солюшен. Потому и падает - оно не может найти свои зависимости. Ниже - пример, обрезаный с рабочего решения:

    FROM mcr.microsoft.com/dotnet/sdk:5.0 AS builder
    COPY . .
    WORKDIR /src
    
    RUN dotnet restore "SolutionName.sln" && \
            dotnet build "SolutionName.sln" -c Release -o /src/build && \
            cd /path/to/proj && \
            dotnet publish "ProjectToPublish.csproj" -c Release -o /src/publish
    
    FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS final
    
    WORKDIR /app
    COPY --from=publish /src/publish .
    
    ENTRYPOINT ["dotnet", "ProjectName.dll"]


    вам по сути надо поправить
    RUN dotnet restore ./build/ShoppingCart.API.csproj
    RUN dotnet publish -c Release -o out


    Ну и да, судя по ошибке (описание которой я бы скопировал если бы вы вставляли текст, а не скриншоты) - у вас таки нет5. Потому и образы соотв. нужно использовать.
    Ответ написан
    1 комментарий
  • Как поменять аттрибуты папки через ftp с помощью c#?

    ayazer
    @ayazer
    Sr. Software Engineer
    сhmod - не стандартная фтп команда, потому ее поддержка зависит исключительно от желания разработчиков фтп сервера. судя по "метод не поддерживается" - у вас как-раз ситуация когда ее не реализовали.

    посмотреть список доступных комманд можно через help. Например, для файлзиллы:
    Command:	help
    Response:	214-The following commands are recognized:
    Response:	   ABOR   ADAT   ALLO   APPE   AUTH   CDUP   CLNT   CWD 
    Response:	   DELE   EPRT   EPSV   FEAT   HASH   HELP   LIST   MDTM
    Response:	   MFMT   MKD    MLSD   MLST   MODE   NLST   NOOP   NOP 
    Response:	   OPTS   PASS   PASV   PBSZ   PORT   PROT   PWD    QUIT
    Response:	   REST   RETR   RMD    RNFR   RNTO   SITE   SIZE   STOR
    Response:	   STRU   SYST   TYPE   USER   XCUP   XCWD   XMKD   XPWD
    Response:	   XRMD
    Response:	214 Have a nice day.


    Ну и в таком случае - никак вы не поменяете т.к. фтп сервер не умеет такое делать. Поиск других нугет пакетов с другими клиентами не поможет т.к. причина - то, как сам фтп сервер реализует протокол.

    UPD: судя по RFC1123 - ожидаемая комманда должна быть SITE CHMOD 777 FILENAME, остальные варианты - шаг в сторону от стандарта
    Ответ написан
    5 комментариев
  • Как передавать в аргумент методу другой метод?

    ayazer
    @ayazer
    Sr. Software Engineer
    class Class1
    {
        public void Do(Action fun)
        {
            fun();
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            var class1 = new Class1();
    
            class1.Do(SayHello);
    
        }
    
        static void SayHello()
        {
            Console.WriteLine("Hello");
        }
    
        
    }
    Ответ написан