• Как работает Linq в данном примере и как научиться понимать комплексные записи Linq?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    А не противоречит ли такая запись самой идее чистого кода?

    Противоречит. Это действительно очень сложно читать.
    Но давай пошагово разберём:
    1. str2.All Все символы из str2 удовлетворяют условию str1.Count(y=>y==x)>=str2.Count(y=>y==x)
    2. str1.Count(y=>y==x) >= - в str1 количество искомых символов больше либо равно
    3. str2.Count(y=>y==x) - количеству искомых символов в str2

    Тоесть этот код проверяет, что в str1 каждый символ продублирован больше раз, чем в str2.

    Кроме достаточно сложного выражения, тут пониманию мешают ещё и названия переменных, которые совершенно не отражают в себе то, что они содержат.

    Я бы этот код переписал так:
    // Эта функция считает, сколько раз каждый символ повторяется в строке
    static Dictionary<char, int> CountChars(IEnumerable<char> str) =>
      str
      .GroupBy(x => x)
      .ToDictionary(x => x.Key, x => x.Count());
    
    var str1CharCount = CountChars(str1);
    var str2CharCount = CountChars(str2);
    
    // Истинно, когда каждый символ из второй строки повторяется меньше или столько-же раз, как и в первой.
    return str2CharCount.All(x => x.Value <= str1CharCount[x.Key]);
    Ответ написан
    1 комментарий
  • Как работает оператор ' ~ ' в JS в данном случае?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Чтобы четко понимать картинку, освежите в памяти, что такое дополнительный код
    Ответ написан
    Комментировать
  • Как получить пути файлов и папок которые на данный момент использует процесс в C#?

    petermzg
    @petermzg
    Самый лучший программист
    Примерно так
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    internal static extern SafeProcessHandle OpenProcess(int access, bool inherit, int processId);
    
    using (var processHandler = SafeProcessHandle.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, processId))
    {
         if (!processHandler.IsInvalid)
         {
              int needed = 0;
              IntPtr[] hMods = new IntPtr[1024];
               var strBuilder = new StringBuilder(1024);
               var handle2 = new GCHandle();
               try
               {
                     if (!GetModuleFileNameEx(processHandler, IntPtr.Zero, strBuilder, (uint)(strBuilder.Capacity)))
                         return;
                     fnFileFound(strBuilder.ToString());
    
                     handle2 = GCHandle.Alloc(hMods, GCHandleType.Pinned);
                     var uiSize = (uint)(Marshal.SizeOf(typeof(IntPtr)) * (hMods.Length));
                     var flag = EnumProcessModulesEx(processHandler, handle2.AddrOfPinnedObject(), uiSize, ref needed, LIST_MODULES_ALL);
                      if (flag != 0)
                      {
                            var uiTotalNumberofModules = needed / (Marshal.SizeOf(typeof(IntPtr)));
                            for (var i = 0; i < uiTotalNumberofModules; i++)
                            {
                                  GetModuleFileNameEx(processHandler, hMods[i], strBuilder, (uint)(strBuilder.Capacity));
                                  fnFileFound(strBuilder.ToString());
                                  if (!Active)
                                      break;
                       }
                   }
              }
              finally
              {
                    if (handle2.IsAllocated)
                        handle2.Free();
               }
        }
    }
    Ответ написан
    1 комментарий
  • Как в C# подключить свою библиотеку dll при работе из консоли?

    @none7
    shared1.cs
    public class MyShared {
        public static string getHello() => "Hello, World";
    }
    prog.cs
    class MyProgram {
    	static void Main(string[] args) => System.Console.WriteLine(MyShared.getHello());
    }

    csc /t:library shared1.cs
    csc /t:exe /r:shared1.dll prog.cs
    Ответ написан
    Комментировать
  • Какой будет самый производительный алгоритм сортировки?

    GavriKos
    @GavriKos
    byte - т.е. целые, да еще и максимум 256? Проходим по массиву, считаем количество каждого числа. Т.е. заводим массив из 256 нулей, идем по вашему массиву, и инкрементим значение маленького массива, используя в качестве индекса значение из большого массива. Получим то что нужно без сортировки вообще.
    Потом просто вызываем формулу нужное количество раз для каждого элемента.

    Что то похожее в комментах предложил dollar, если я правильно понял.
    Ответ написан
    Комментировать
  • Можно ли избавиться от "слипания" байтов при WriteAsync из TcpClient.GetStream()?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Никак. TCP - это труба байт. Вы должны самостоятельно разделять поток байт на пакеты.
    Ответ написан
    Комментировать
  • Как остановить поток?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Останавливать поток нужно не убиванием его, а остановкой, желательно - изнутри. А чтобы это можно было сделать нужно передать внутрь токен останова. Сам останов ничего не делает, но он используется внутри тела потока для отмены или аварийного завершения. Этот токен передастся в Worker, в котором нужно будет проверять наличие останова с помощью cancellationToken.IsCancellationRequested. Если в воркере используется цикл, то проверять можно в каждой итерации.

    var formWait = new FormWait(cancellationToken => 
    {
        foreach(var item in _items)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }
            item.DoWork();
        }
    });


    wait.Stop = delegate ()
          {
            var source = _tokenSource;
            if (source != null)
            {
                source.Cancel();
                source.Dispose();
                _tokenSource = null;
            }
          };
          myThread.Start();
    
    В форме:
        public Action<CancellationToken> Worker { get; } // добавляем ссылку на токен останова
        public Action Stop { get; set; }
        private CancellationTokenSource _tokenSource;
        public FormWait(Action<CancellationToken> worker)
        {
          InitializeComponent();
          if (worker == null)
            throw new ArgumentNullException();
          Worker = worker;
        }
        protected override void OnLoad(EventArgs e)
        {
          base.OnLoad(e);
          _tokenSource?.Dispose();
          _tokenSource = new CancellationTokenSource();
          var cancellationToken =  = _tokenSource.Token;
          Task.Factory.StartNew(() => Worker(cancellationToken ))
              .ContinueWith(t => { this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          Console.WriteLine("Stop");
          Stop();
        }


    Возможно, хорошо сделать таск с возвращаемым результатом, например
    public Func<CancellationToken, bool> Worker { get; }
    
    Task.Factory.StartNew<bool>(() => Worker(cancellationToken))
    .ContinueWith(t => { if (t.Result) this.Close(); }, TaskScheduler.FromCurrentSynchronizationContext());
    Ответ написан
    Комментировать
  • C#. Как правильно получить список файлов из папки в нужном порядке?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    В Windows уже есть готовая функция, которая выполняет натуральное сравнение строк, лучше использовать её. Эта функция разбивает строку на числовые и строковые части и ищет эти части друг с другом, причём числовые части сравнивает как числа, а строковые - алфавитно.

    var testFiles = Directory.EnumerateFiles(solutionDirectory + @"\samples");
    
    var sortedTestFiles1 = testFiles.OrderBy(x => x, new NaturalComparer());
    // или
    var sortedTestFiles2 = testFiles.ToList();
    sortedTestFiles2.Sort(new NaturalComparer());
    
    /// <summary>
    /// Натуральное сравнение строк
    /// </summary>
    public class NaturalComparer : IComparer<string>
    {
        /// <summary>
        /// Вызов WinApi-функции для натурального сравнения строк
        /// </summary>
        [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
        private static extern int StrCmpLogicalW(string psz1, string psz2);
    
        /// <summary>
        /// Натуральное сравнение строк
        /// </summary>
        /// <param name="x">Первая строка</param>
        /// <param name="y">Вторая строка</param>
        /// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
        public static int Compare(string x, string y)
        {
            return StrCmpLogicalW(x, y);
        }
    
        /// <summary>
        /// Натуральное сравнение строк
        /// </summary>
        /// <param name="x">Первая строка</param>
        /// <param name="y">Вторая строка</param>
        /// <returns>Сравнивает две строки, возвращая -1, 0 или 1</returns>
        int IComparer<string>.Compare(string x, string y)
        {
            return StrCmpLogicalW(x, y);
        }
    }
    Ответ написан
    1 комментарий
  • Сколько времени займёт создание базы данных на C# и WPF без SQL?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Во-первых, зависит от задачи: "написать БД" можно минут за 5, а вот на написание многопользовательской реляционной СУБД могут уйти годы. Во-вторых, зависит от уровня профессионализма исполнителя: на что одному нужны минуты, для другого может быть вообще неподъёмным.
    Ответ написан
    Комментировать
  • Есть ли ассет для Unity для реализации осмотра предмета который ты подобрал или как эта механика называется?

    GavriKos
    @GavriKos Куратор тега Разработка игр
    Механика называется "инстанцировал нужный префаб в нужных координатах и кручу его за мышкой".
    Ответ написан
    Комментировать
  • Можно ли создать на С# распределённый реестр с функцией хеширования?

    martin74ua
    @martin74ua
    Linux administrator
    можно, делайте.
    Ответ написан
    Комментировать
  • Как организовать процесс при копировании?

    lam0x86
    @lam0x86
    Во-первых, производить длительные операции (больше 100 миллисекунд) в UI-потоке - плохой тон. Приложение будет подвисать, пока файл не скопируется. Чтобы этого избежать, все дисковые операции должны быть асинхронны (вместо async/await можно использовать FileStream.BeginRead/EndRead).
    Во-вторых, у вас слишком большой буфер. 2^19 - это 512 килобайт. Возможно, вы копируете файлы меньшего размера, поэтому всё копирование происходит в одну операцию чтения. Попробуйте буфер, скажем, в 16кб.
    Ответ написан
    1 комментарий
  • Visual studio c# - sql - что к чему?

    Griboks
    @Griboks Куратор тега C#
    Можете использовать простую сериализацию, если уж вы собираетесь устанавливать по базе каждому пользователю.

    p.s.
    Есть 3 разные штуки:
    -база данных (файл)
    -система управление базой данных (сервер)
    -язык управления базой данных (sql)
    Ответ написан
    3 комментария
  • Как пишут игры на канвасе?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Просто берёте и создаёте архитектуру вашего приложения (игры), читаете документацию канваса (или API фреймворка) и пишите.
    Графика - тайл-мэп.
    Объекты игры - классы.
    Ответ написан
    Комментировать
  • Как правильно прописать логику в *ngFor?

    mazhekin
    @mazhekin
    Frontend, Backend Web Developer
    <div *ngFor="let column of tableColumnsConfig | toIterable | trueOnlyBy : 'value'">
       {{column.name}}
    </div>

    и напишите два общих пайпа, может потом еще пригодятся, куда-нибудь в общий модуль типа shared.module.ts
    1) to-iterable.pipe.ts
    @Pipe({
      name: 'toIterable'
    })
    export class ToIterablePipe implements PipeTransform {
      transform(dict: Object) {
        return Object.keys(dict || {}).map(key => dict[key]);
      }
    }

    2) true-only-by.pipe.ts
    @Pipe({
      name: 'trueOnlyBy'
    })
    export class TrueOnlyByPipe implements PipeTransform {
      transform(arr: any[], propName: string): object {
        return arr.filter(item => !!item[propName]);
      }
    }
    Ответ написан
    Комментировать
  • Чем опытнее разработчик, тем меньше соблюдается принцип KISS?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Принцип KISS не означает что надо использовать самые примитивные инструменты.
    Он означает, что не надо переусложнять систему без нужды.
    Если так рассуждать, так и высшее образование не нужно: "Дед отличные бани строил, хотя вовсе был неграмотный. Я и без сопромата небоскреб построю!"
    Если вы пока ещё не понимаете назначение всех этих "лееров, провайдеров и репозиториев", это не значит, что они вообще никому не нужны.

    Для того, чтобы упростить управление системой, её надо усложнить.
    Этот принцип относится к любой области человеческой деятельности, от постройки ракет до управления государствами.
    Чем сложнее система, тем больше накладные расходы на ее управление. Хоумпейдж с котиками можно и нужно делать примитивными средствами. В большом проекте надо сразу закладываться на будущую расширяемость. То есть, заранее делить ответственность между "леерами".

    И кстати. Код, в котором "всё друг на друге завязано" - это очень плохой код. Собственно, предназначение всех этих "лееров, провайдеров и репозиториев" как раз в том, чтобы компоненты были как можно более независимы друг от друга.
    Ответ написан
    1 комментарий
  • Ищу сенсея

    Mithgol
    @Mithgol
    Не просите людей отвечать вам на личный адрес электронной почты

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

    Когда вы просите личного ответа, вы мешаете как процессу выработки решения, так и получению вознаграждения. Не делайте этого. Отвечать лично — это выбор отвечающего, и если он так и делает, то обычно потому, что считает вопрос слишком неудачно сформулированным или очевидным для того, чтобы быть интересным другим.

    Из этого правила есть одно небольшое исключение. Если вы предполагаете, что на свой вопрос получите множество подобных между собой ответов, не забудьте волшебные слова «отправьте ответ мне, а я резюмирую полученные ответы в статье для дискуссионной группы». Попытка уберечь дискуссионную группу или список рассылки от потока, по сути, идентичных сообщений — это очень любезно, но вы должны сдержать своё обещание и отправить итоговое резюме в дискуссионную группу или список рассылки.
    Вот почему вопросы о Node уместнее открыто задавать на Хабрахабре в разделе Q&A, нежели в ЛС. Что позволяет также проверить, не было ли в этом разделе прежде идентичных вопросов о том же. Открытый ответ обеспечит собою также и возможность мгновенно удовлетворить нужды тех других читателей, которые позднее непременно стали бы задавать себе аналогичные вопросы, кабы не поиск по Хабрахабру, позволяющий им найти ответ тотчас же.
    Ответ написан
    2 комментария