Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият.
Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание.
Използваме бисквитки и за измерване на маркетинговите ни усилия.
Благодаря за изчерпателния отговор!
Не разбрах какво имаш предвид с това, че чрез ref може да се промени поведението в случая ако предположим, че Action-a е метод? До колко разбрах проблема е, че се заделя нова памет при ToList().
Action<T1,..T16> е предефиниран generic делегат, който обвива void метод със или без параметри зависи от това как е деклариран. Общо взето си го представи като pointer към метод. В стария .NET Framework не можеше да се подава ref в Action-и, в .NET Core, до колкото се разрових в нета, е същото.
ref keyword-а ще окаже, че параметъра ще бъде подаден по референция, а не по стойност. Тогава това, което искаш да направиш в твоя код ще сработи, защото всяка операция върху параметъра, в сигнатурата на метода, ще се отрази и на аргумента.
Проблема в дадения код е, че работиш с extension методите на LINQ върху IEnumerable<T>. Когато извикаш .Select() върху колекция се прави проекция на всички елементи в нея, но тя не се материализира докато не се извика: .ToArray(), ToDictionary(), ToList(), FirstOrDefault(), Any() и т.н или не се обходи във Foreach цикъл. В момента в който я материализираш към лист примерно, вече се прави нов обект и съответно се заделя нова памет за него.
В случая твоето решение, или това което искаш да направиш с LINQ, не е най-оптималното. Дори и да си изкараш нормален метод и да подаваш колекцията по референция, ти пак ще връщаш нова колекция с извършените операции при всяка команда, което изобщо не е добре от към performance. Заделянето на нова памет е скъпа операция в C#, връщането всеки път на нова колекция за елементарни аритметични операции не е най-разумното решение, най-малкото защото отдолу седи Garbage Collector-а на CLR-а и ще трябва той да оптимизира паметта вместо теб, което ще се отрази на performance-а в някакъв по-сериозен случай. Най-добре е да си обходиш колекцията с нормален For цикъл и да си извършваш операциите в него. Така не заделяш нова памет и не се занимаваш с глупости а и ще е по-бързо ако го Benchmark-неш със System.Diagnostics.Stopwatch или някаква 3rd party библиотека.
Благодаря!