Архив рубрики: C#

LINQ: Добавляем возможность группировки следующих подряд элементов

Всем нам знаком стандартный LINQ-метод GroupBy(). Он позволяет на основе некоего селектора разложить элементы в последовательности по группам. К сожалению, мы не можем в селекторе указать такое нетривиальное условие, как нахождение элементов рядом. А именно это мне и нужно было. Поиск по StackOverflow не дал каких-либо приемлемых решений, и я, скрепя душой, сел изобретать свой велосипед. Ниже представляю код метода аналогичного GroupBy() с одним отличием: группировка происходит только для рядом стоящих элементов.

К примеру, есть последовательность:
1 1 1 2 2 2 2 1 1 1 1 4 4 4 4 2 2 2

После группировки хотим получить следующие группы (в каждой строке по группе):
1 1 1
2 2 2 2
1 1 1 1
4 4 4 4
2 2 2

Читать далее

Задание useLegacyV2RuntimeActivationPolicy во время выполнения

Проблема загрузки сборок скомпилированных под устаревший CLR давно известна. Старые библиотеки отказываются работать в CLR 4 и выше, если принудительно не задать в app.config разрешение на выполнение этих сборок в новом райнтайме:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

Без этой настройки получим исключение FileLoadException:
Сборка для смешанного режима построена на основе версии “v2.0.50727” среды выполнения и не может быть загружена в среде выполнения 4.0 без дополнительных конфигурационных данных.

Что же делать, если нет желания или возможности таскать с собой app.config?
К счастью, можно задать параметр useLegacyV2RuntimeActivationPolicy во время выполнения.

Читать далее

Генерация случайного простого числа

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

Пришлось написать небольшой класс для генерации. Всё что делает – генерирует случайное число и сдвигает его в большую сторону до ближайшего простого. Работает, относительно, шустро, генерирует UInt32, но это не принципиально. Самой затратной операцией оказалось, как ни странно, деление с остатком. 🙂

public class PrimeNumberGenerator
{
    private readonly Random _random = new Random();

    public uint Generate()
    {
        var numberBytes = new byte[4];
        _random.NextBytes(numberBytes);
        uint number = BitConverter.ToUInt32(numberBytes, 0);

        while (!IsPrime(number))
        {
            unchecked
            {
                number++;
            }
        }
        return number;
    }

    private static bool IsPrime(uint number)
    {
        if ((number & 1) == 0) return (number == 2);

        var limit = (uint)Math.Sqrt(number);
        for (uint i = 3; i <= limit; i += 2)
        {
            if ((number % i) == 0) return false;
        }
        return true;
    }
}

Использование:

var generator = new PrimeNumberGenerator();
uint prime = generator.Generate();

CLR via C#

CLR via C#Давеча закончил читать прекрасную книгу по .NET/C# от тов. Рихтера – “CLR via C#”.
Книга – отличный экскурс в глубины шарпа и CLR. Стоит заметить, Рихтер увлекается копанием в дебрях, любит экономить на спичках и расписывать как это делает. Отсюда и толщина книженции, из которой не напрягаясь можно половину выкинуть. Тем не менее, книга отличная и читать стоит.

Ниже идет список заметок, которые сделал во время чтения.

Читать далее