diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md
index 52d61549..2adf293f 100644
--- a/.github/copilot-instructions.md
+++ b/.github/copilot-instructions.md
@@ -1,15 +1,70 @@
- .
- .
- , , .
- ( ) , .
- .
- .
- .
- .
- snake_case.
- PascalCase.
- _PascalCase __PascalCase .
- , , .
- , .
- var.
- , .
\ No newline at end of file
+# Правила для GitHub Copilot
+
+- Всегда отвечай, используя русский язык
+- Всегда пиши комментарии в коде на русском языке
+
+## Комментарии
+- Короткие пояснительные комментарии располагай в конце той же строки, что и код // кратко по делу
+- Старайся избегать тривиальных комментариев
+
+## XML‑документация
+- Документируй классы, структуры, делегаты, перечисления и их члены только XML‑комментариями
+- Одинарное предложение пиши в одной строке внутри тега и без точки в конце
+- Каждый тег XML‑комментария располагай на отдельной строке
+- Порядок тегов: `` → `` → `` → `` → `` → ``
+- Для сложных публичных метдов генерируй блок с простым примером использования кода внутри тега ``
+
+Примеры:
+- `Краткое описание сущности`
+- `Описание параметра`
+- `Описание возвращаемого значения`
+
+## Синтаксис и минимализм
+- При генерации кода используй современные конструкции языка, совместимые с целевыми платформами проекта
+- Стремись минимизировать количество фигурных скобок за счёт expression‑bodied членов и switch‑выражений
+- Не убирай фигурные скобки в многострочных конструкциях ради читаемости
+- Всегда старайся минимизировать размер кода, если не запрошено иное
+
+Разрешённые современные приёмы (когда поддерживается целевой платформой):
+- file‑scoped namespace
+- expression‑bodied члены
+- switch‑выражения и pattern matching
+- target‑typed `new`
+- collection expressions и инициализаторы коллекций
+- `using var` и `await using`
+- операторы `??`, `??=`, `is not`, `with`
+- упрощение nullable-присвоения `target?.Property = 15;` вместо `if(target is not null) target.Property = 15;`
+
+## Именование
+- Локальные переменные: `snake_case`
+- Параметры методов: `PascalCase`
+- Поля экземпляров: `_PascalCase`
+- Статические поля: `__PascalCase`
+- Константы: `PascalCase`
+- Публичные типы и члены API: `PascalCase`
+- Предпочитай английский язык при именовании переменных, методов, классов и прочих сущностей
+
+## Инициализация и объявления
+- При инициализации массивов, списков и словарей используй выражения инициализации массивов/коллекций
+- При объявлении переменных предпочитай использовать ключевое слово `var` (кроме случаев, когда явный тип заметно повышает понятность)
+
+## Форматирование
+- Короткие системные комментарии пиши компактно в одну строку
+- Удаляй неиспользуемые `using`, сортируй и группируй директивы `using`
+- Разделяй логические блоки пустыми строками по мере необходимости, избегай лишних переносов
+
+## Практики .NET
+- Включай `#nullable enable` там, где это поддерживается
+- Используй guard‑выражения, например `ArgumentNullException.ThrowIfNull(x)`
+- Предпочитай Try‑паттерны для контроля потока вместо исключений
+- При генерации метода добавляй в его начале блок проверки входных параметров. Отделяй этот блок пустой строкой от остального тела метода
+- При генерации публичных свойств у моделей-представления MVVM (классов, реализующих INotifyPropertyChanged) используй следующий формат (в одну строку):
+```csharp
+/// Описание свойства
+public string PropertyName { get; set => Set(ref field, value); }
+```
+- Для простых лаконичных методов используй expression‑bodied синтаксис, записанный в одну строку.
+
+## Совместимость целей
+- В рабочем пространстве используются целевые платформы: `.NET Standard 2.0` и `.NET 10`
+- Применяй современные возможности языка и платформы только если они доступны для соответствующей целевой платформы проекта
\ No newline at end of file
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 4cba0666..a9e56cbc 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -29,7 +29,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
- dotnet-version: 9.0.x
+ dotnet-version: 10.0.x
- name: Cache NuGet
uses: actions/cache@v4
@@ -64,7 +64,7 @@ jobs:
steps:
- name: Get artifact
- uses: actions/download-artifact@v4.1.8
+ uses: actions/download-artifact@v5
id: download
with:
name: Release
@@ -80,7 +80,7 @@ jobs:
steps:
- name: Get artifact
- uses: actions/download-artifact@v4.1.8
+ uses: actions/download-artifact@v5
id: download
with:
name: Release
diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml
index b220cd9e..96924649 100644
--- a/.github/workflows/testing.yml
+++ b/.github/workflows/testing.yml
@@ -29,7 +29,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
- dotnet-version: 9.0.x
+ dotnet-version: 10.0.x
- name: Building
run: |
diff --git a/.gitignore b/.gitignore
index 0e6c75bf..f4e1700b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-## Ignore Visual Studio temporary files, build results, and
+## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
@@ -338,4 +338,7 @@ ASALocalRun/
# BeatPulse healthcheck temp database
healthchecksdb
+
/MathCore/MathCore.xml
+
+/.test_results
diff --git a/MathCore.sln.DotSettings b/MathCore.sln.DotSettings
index f1f56644..ecaf4549 100644
--- a/MathCore.sln.DotSettings
+++ b/MathCore.sln.DotSettings
@@ -33,6 +33,7 @@
PSO
QR
RND
+ RU
SHA
MD5
SVD
@@ -79,6 +80,7 @@
True
True
True
+ True
True
True
True
diff --git a/MathCore/Extensions/ArrayExtensions.cs b/MathCore/Extensions/ArrayExtensions.cs
index 6981a1cb..280d808d 100644
--- a/MathCore/Extensions/ArrayExtensions.cs
+++ b/MathCore/Extensions/ArrayExtensions.cs
@@ -1,5 +1,6 @@
#nullable enable
using System.Globalization;
+using System.Runtime.CompilerServices;
using System.Text;
using MathCore;
@@ -44,15 +45,20 @@ public static T[] Fill(this T[] array, T value, int index, int count)
return array;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string ToBase64(this byte[] bytes) => Convert.ToBase64String(bytes);
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string ToBase64(this byte[] bytes, int offset, int length) => Convert.ToBase64String(bytes, offset, length);
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string ToBase64(this byte[] bytes, Base64FormattingOptions options) => Convert.ToBase64String(bytes, options);
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static string ToBase64(this byte[] bytes, int offset, int length, Base64FormattingOptions options) =>
Convert.ToBase64String(bytes, offset, length, options);
public static int BinarySearch(this T[] array, T value) => Array.BinarySearch(array, value);
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int[] InitializeRange(this int[] array, int StartValue = 0, int Step = 1)
{
for (var i = 0; i < array.Length; i++)
@@ -60,6 +66,7 @@ public static int[] InitializeRange(this int[] array, int StartValue = 0, int St
return array;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static double[] InitializeRange(this double[] array, double StartValue = 0, double Step = 1)
{
for (var i = 0; i < array.Length; i++)
@@ -67,6 +74,7 @@ public static double[] InitializeRange(this double[] array, double StartValue =
return array;
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Complex[] InitializeRange(this Complex[] array, Complex StartValue, Complex Step)
{
for (var i = 0; i < array.Length; i++)
@@ -104,6 +112,7 @@ public static IEnumerable Shuffle(this T[] items, Random? rnd = null)
/// Число строк (первое измерение)
/// Число столбцов (второе измерение)
/// Тип элементов массива
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Deconstruct(this T[,] array, out int N, out int M)
{
N = array.GetLength(0);
@@ -116,6 +125,7 @@ public static void Deconstruct(this T[,] array, out int N, out int M)
/// Число столбцов (второе измерение)
/// Глубина (третье измерение)
/// Тип элементов массива
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Deconstruct(this T[,,] array, out int N, out int M, out int K)
{
N = array.GetLength(0);
@@ -213,6 +223,7 @@ public static IEnumerable EnumerateElementsByCols(this T[,] array)
/// Искомый элемент
/// Тип элементов массива
/// Истина, если элемент найден
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool Exist(this T[] array, T value) => Array.IndexOf(array, value, 0, array.Length) >= 0;
/// Проверка на отсутствие элемента в массиве
@@ -220,6 +231,7 @@ public static IEnumerable EnumerateElementsByCols(this T[,] array)
/// Искомый элемент
/// Тип элементов массива
/// Истина, если элемент в массиве отсутствует
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool NotExist(this T[] array, T value) => Array.IndexOf(array, value, 0, array.Length) < 0;
/// Разделить входной массив на подмассивы указанным методом
@@ -436,6 +448,7 @@ public static int GetComplexHashCode(this T[] Objects)
///Тип элементов массива
///Массив из объединенных элементов
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TArray[] Concatenate(this TArray[] A, params TArray[] B)
{
var result = new TArray[A.Length + B.Length];
@@ -449,6 +462,7 @@ public static TArray[] Concatenate(this TArray[] A, params TArray[] B)
/// Исходный массив
/// Присоединяемые массивы
/// Массив, содержащий все элементы объединяемых массивов
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TArray[] Concatenate(this TArray[] A, params TArray[][] B)
{
var result = new TArray[A.Length + B.Sum(l => l.Length)];
@@ -501,6 +515,7 @@ public static TOut[] ConvertTo(this TIn[] In, Converter co
///Выполняемой действие
///Тип элементов массива
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Foreach(
this TArray[] array,
Action action)
@@ -512,6 +527,7 @@ public static void Foreach(
///Обработчик исключения
///Тип элементов массива
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Foreach(
this TArray[] array,
Action action,
@@ -552,6 +568,7 @@ Func ErrorHandler
///Тип элементов массива области значения
///Массив значений функции
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TOut[] Function(this TIn[] array, Func f) => array.Select(f).ToArray();
/// Получить массив, индексы элементов которого имеют обратный порядок
@@ -559,6 +576,7 @@ Func ErrorHandler
/// Переворачиваемый массив
/// Перевёрнутый массив
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TArray[] GetReversed(this TArray[] array)
{
var len = array.Length;
@@ -578,6 +596,7 @@ public static TArray[] GetReversed(this TArray[] array)
/// начиная с указанного положения и указанной длины
///
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TArray[] GetSubArray(this TArray[] array, int Length, int Start = 0)
{
var result = new TArray[Length];
@@ -594,6 +613,7 @@ public static TArray[] GetSubArray(this TArray[] array, int Length, int
///
/// Инициализированный массив
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TArray[] Initialize(
this TArray[] array,
Func Initializer
@@ -610,6 +630,7 @@ Func Initializer
/// Значение, размещаемое во всех элементах массива
/// Инициализированный массив
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static TArray[] Initialize(
this TArray[] array,
TArray value
@@ -996,6 +1017,7 @@ public static void Inverse(this TArray[] array)
/// Значения, Которые требуется внести с
/// Тип ячеек массива
[DST]
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void SetValues(
this TArray[] array,
int StartIndex,
@@ -2609,7 +2631,7 @@ public static Complex[] ResamplingLagrange(this Complex[] array, int NewLength)
}
[NotImplemented]
- public static double[] ResamplingLinear(this double[] array, int NewLength)
+ private static double[] ResamplingLinear(this double[] array, int NewLength)
{
var old_length = array.Length;
diff --git a/MathCore/Extensions/AsyncAwait/AsyncExtensions.cs b/MathCore/Extensions/AsyncAwait/AsyncExtensions.cs
index 398e1a5d..b6b1b63c 100644
--- a/MathCore/Extensions/AsyncAwait/AsyncExtensions.cs
+++ b/MathCore/Extensions/AsyncAwait/AsyncExtensions.cs
@@ -8,6 +8,10 @@ namespace System.Threading.Tasks;
public static class AsyncExtensions
{
+ /// Асинхронно обрабатывает элементы, получаемые от Producer, с помощью Consumer
+ /// Источник данных
+ /// Функция получения элемента и признака завершения
+ /// Функция обработки элемента
public static async Task Process(
[DisallowNull] this TSource source,
Func> Producer,
@@ -26,6 +30,11 @@ public static async Task Process(
} while (reading != null);
}
+ /// Асинхронно обрабатывает элементы с дополнительным параметром, получаемые от Producer, с помощью Consumer
+ /// Источник данных
+ /// Дополнительный параметр
+ /// Функция получения элемента и признака завершения
+ /// Функция обработки элемента
public static async Task Process(
[DisallowNull] this TSource source,
TP p,
@@ -45,6 +54,12 @@ public static async Task Process(
} while (reading != null);
}
+ /// Асинхронно обрабатывает элементы с двумя дополнительными параметрами, получаемые от Producer, с помощью Consumer
+ /// Источник данных
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Функция получения элемента и признака завершения
+ /// Функция обработки элемента
public static async Task Process(
[DisallowNull] this TSource source,
TP1 p1,
@@ -65,6 +80,13 @@ public static async Task Process(
} while (reading != null);
}
+ /// Асинхронно обрабатывает элементы с тремя дополнительными параметрами, получаемые от Producer, с помощью Consumer
+ /// Источник данных
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Третий дополнительный параметр
+ /// Функция получения элемента и признака завершения
+ /// Функция обработки элемента
public static async Task Process(
[DisallowNull] this TSource source,
TP1 p1,
@@ -88,6 +110,10 @@ public static async Task Process(
/* ------------------------------------------------------------------------------------ */
+ /// Выполняет действие асинхронно
+ /// Объект для передачи в действие
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, Action action, CancellationToken Cancel = default)
{
if (action is null) throw new ArgumentNullException(nameof(action));
@@ -100,6 +126,10 @@ public static Task Async(this T obj, Action action, CancellationToken Canc
}, new object[] { action, obj }, Cancel);
}
+ /// Выполняет действие асинхронно с поддержкой отмены
+ /// Объект для передачи в действие
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, Action action, CancellationToken Cancel = default) => action is null
? throw new ArgumentNullException(nameof(action))
: Task.Factory.StartNew(
@@ -113,6 +143,11 @@ public static Task Async(this T obj, Action action, Can
new object?[] { action, obj, Cancel },
Cancel);
+ /// Выполняет действие асинхронно с дополнительным параметром
+ /// Объект для передачи в действие
+ /// Дополнительный параметр
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP p, Action action, CancellationToken Cancel = default) => action is null
? throw new ArgumentNullException(nameof(action))
: Task.Factory.StartNew(
@@ -124,6 +159,11 @@ public static Task Async(this T obj, TP p, Action action, Cancella
method(arg, pp1);
}, new object?[] { action, obj, p }, Cancel);
+ /// Выполняет действие асинхронно с дополнительным параметром и поддержкой отмены
+ /// Объект для передачи в действие
+ /// Дополнительный параметр
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP p, Action action, CancellationToken Cancel = default) => action is null
? throw new ArgumentNullException(nameof(action))
: Task.Factory.StartNew(
@@ -136,6 +176,12 @@ public static Task Async(this T obj, TP p, ActionВыполняет действие асинхронно с двумя дополнительными параметрами
+ /// Объект для передачи в действие
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP1 p1, TP2 p2, Action action, CancellationToken Cancel = default) => action is null
? throw new ArgumentNullException(nameof(action))
: Task.Factory.StartNew(
@@ -148,6 +194,12 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, ActionВыполняет действие асинхронно с двумя дополнительными параметрами и поддержкой отмены
+ /// Объект для передачи в действие
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP1 p1, TP2 p2, Action action, CancellationToken Cancel = default) => action is null
? throw new ArgumentNullException(nameof(action))
: Task.Factory.StartNew(
@@ -161,6 +213,13 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, ActionВыполняет действие асинхронно с тремя дополнительными параметрами
+ /// Объект для передачи в действие
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Третий дополнительный параметр
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, Action action, CancellationToken Cancel = default) => action is null
? throw new ArgumentNullException(nameof(action))
: Task.Factory.StartNew(
@@ -176,6 +235,13 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
new object?[] { action, obj, p1, p2, p3 },
Cancel);
+ /// Выполняет действие асинхронно с тремя дополнительными параметрами и поддержкой отмены
+ /// Объект для передачи в действие
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Третий дополнительный параметр
+ /// Действие для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, Action action, CancellationToken Cancel = default) => action is null
? throw new ArgumentNullException(nameof(action))
: Task.Factory.StartNew(
@@ -192,6 +258,10 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
new object?[] { action, obj, p1, p2, p3, Cancel },
Cancel);
+ /// Выполняет функцию асинхронно и возвращает результат
+ /// Объект для передачи в функцию
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(this T obj, Func func, CancellationToken Cancel = default) => func is null
? throw new ArgumentNullException(nameof(func))
: Task.Factory.StartNew(
@@ -204,6 +274,10 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
new object?[] { func, obj },
Cancel);
+ /// Выполняет функцию асинхронно с поддержкой отмены и возвращает результат
+ /// Объект для передачи в функцию
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(this T obj, Func func, CancellationToken Cancel = default) => func is null
? throw new ArgumentNullException(nameof(func))
: Task.Factory.StartNew(
@@ -215,6 +289,11 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
return method(arg, c);
}, new object?[] { func, obj, Cancel }, Cancel);
+ /// Выполняет функцию асинхронно с дополнительным параметром и возвращает результат
+ /// Объект для передачи в функцию
+ /// Дополнительный параметр
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP p, Func func, CancellationToken Cancel = default) => func is null
? throw new ArgumentNullException(nameof(func))
: Task.Factory.StartNew(
@@ -228,6 +307,11 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
new object?[] { func, obj, p },
Cancel);
+ /// Выполняет функцию асинхронно с дополнительным параметром и поддержкой отмены, возвращает результат
+ /// Объект для передачи в функцию
+ /// Дополнительный параметр
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP p, Func func, CancellationToken Cancel = default) => func is null
? throw new ArgumentNullException(nameof(func))
: Task.Factory.StartNew(
@@ -240,6 +324,12 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
return method(arg, pp1, c);
}, new object?[] { func, obj, p, Cancel }, Cancel);
+ /// Выполняет функцию асинхронно с двумя дополнительными параметрами и возвращает результат
+ /// Объект для передачи в функцию
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP1 p1, TP2 p2, Func func, CancellationToken Cancel = default) => func is null
? throw new ArgumentNullException(nameof(func))
: Task.Factory.StartNew(
@@ -252,6 +342,12 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
return method(arg, pp1, pp2);
}, new object?[] { func, obj, p1, p2 }, Cancel);
+ /// Выполняет функцию асинхронно с двумя дополнительными параметрами и поддержкой отмены, возвращает результат
+ /// Объект для передачи в функцию
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(this T obj, TP1 p1, TP2 p2, Func func, CancellationToken Cancel = default) => func is null
? throw new ArgumentNullException(nameof(func))
: Task.Factory.StartNew(
@@ -265,6 +361,13 @@ public static Task Async(this T obj, TP1 p1, TP2 p2, TP3 p3, A
return method(arg, pp1, pp2, c);
}, new object[] { func, obj, p1, p2, Cancel }, Cancel);
+ /// Выполняет функцию асинхронно с тремя дополнительными параметрами и возвращает результат
+ /// Объект для передачи в функцию
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Третий дополнительный параметр
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(
this T obj,
TP1 p1,
@@ -287,6 +390,13 @@ func is null
new object?[] { func, obj, p1, p2, p3 },
Cancel);
+ /// Выполняет функцию асинхронно с тремя дополнительными параметрами и поддержкой отмены, возвращает результат
+ /// Объект для передачи в функцию
+ /// Первый дополнительный параметр
+ /// Второй дополнительный параметр
+ /// Третий дополнительный параметр
+ /// Функция для выполнения
+ /// Токен отмены
public static Task Async(
this T obj,
TP1 p1,
diff --git a/MathCore/Extensions/DateTimeExtensions.cs b/MathCore/Extensions/DateTimeExtensions.cs
index 33643766..b0e12362 100644
--- a/MathCore/Extensions/DateTimeExtensions.cs
+++ b/MathCore/Extensions/DateTimeExtensions.cs
@@ -4,8 +4,6 @@
using System.Runtime.InteropServices;
-using MathCore.Extensions;
-
namespace System;
/// Класс методов-расширений для даты-времени
@@ -22,8 +20,8 @@ public static class DateTimeExtensions
/// Смещение в массиве байт
public static void ToByteArray(this DateTime Time, byte[] Data, int Offset = 0)
{
- if(Offset < 0) throw new ArgumentOutOfRangeException(nameof(Offset), Offset, "Смещение в массиве не может быть меньше нуля");
- if(Data.Length - Offset < 8) throw new InvalidOperationException("Процесс копирования данных выходит за пределы массива");
+ if (Offset < 0) throw new ArgumentOutOfRangeException(nameof(Offset), Offset, "Смещение в массиве не может быть меньше нуля");
+ if (Data.Length - Offset < 8) throw new InvalidOperationException("Процесс копирования данных выходит за пределы массива");
#if NET8_0_OR_GREATER
MemoryMarshal.Cast(new(ref Time)).CopyTo(Data.AsSpan(Offset));
@@ -48,4 +46,45 @@ public static DateTime FromBytArray(byte[] Data, int Offset = 0)
return DateTime.FromBinary(BitConverter.ToInt64(Data, Offset));
#endif
}
-}
\ No newline at end of file
+
+ extension(DateTime)
+ {
+ public static DateTime NowMSK => TimeZoneInfo.ConvertTime(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
+ public static DateTime NowUTC => DateTime.UtcNow;
+ }
+
+ public static int GetCount(this DateTime FromTime, DateTime ToTime, DayOfWeek Day)
+ {
+ if (FromTime > ToTime) return 0;
+
+ var count = 0;
+ for (var dt = FromTime; dt <= ToTime; dt = dt.AddDays(1))
+ if (dt.DayOfWeek == Day)
+ count++;
+ return count;
+ }
+
+ public static int GetCount(this DateTimeOffset FromTime, DateTimeOffset ToTime, DayOfWeek Day)
+ {
+ if (FromTime > ToTime) return 0;
+
+ var count = 0;
+ for (var dt = FromTime; dt <= ToTime; dt = dt.AddDays(1))
+ if (dt.DayOfWeek == Day)
+ count++;
+ return count;
+ }
+
+
+#if NET8_0_OR_GREATER
+ public static int GetCount(this DateOnly FromDate, DateOnly ToDate, DayOfWeek Day)
+ {
+ if (FromDate > ToDate) return 0;
+ var count = 0;
+ for (var dt = FromDate; dt <= ToDate; dt = dt.AddDays(1))
+ if (dt.DayOfWeek == Day)
+ count++;
+ return count;
+ }
+#endif
+}
diff --git a/MathCore/Extensions/DateTimeOffsetExtensions.cs b/MathCore/Extensions/DateTimeOffsetExtensions.cs
new file mode 100644
index 00000000..7225d60c
--- /dev/null
+++ b/MathCore/Extensions/DateTimeOffsetExtensions.cs
@@ -0,0 +1,25 @@
+#nullable enable
+
+// ReSharper disable once CheckNamespace
+
+namespace System;
+
+public static class DateTimeOffsetExtensions
+{
+ extension(DateTimeOffset)
+ {
+ public static DateTimeOffset NowMSK => TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Russian Standard Time"));
+ public static DateTimeOffset NowUTC => DateTimeOffset.UtcNow;
+ }
+
+ public static int GetCount(this DateTimeOffset FromTime, DateTimeOffset ToTime, DayOfWeek Day)
+ {
+ if (FromTime > ToTime) return 0;
+
+ var count = 0;
+ for (var dt = FromTime; dt <= ToTime; dt = dt.AddDays(1))
+ if (dt.DayOfWeek == Day)
+ count++;
+ return count;
+ }
+}
\ No newline at end of file
diff --git a/MathCore/Extensions/EnumExtensions.cs b/MathCore/Extensions/EnumExtensions.cs
index b1d81f50..c29d0212 100644
--- a/MathCore/Extensions/EnumExtensions.cs
+++ b/MathCore/Extensions/EnumExtensions.cs
@@ -20,8 +20,8 @@ public static class EnumExtensions
public static TAttribute[]? GetValueAttribute(this Enum value) where TAttribute : Attribute
{
var attribute_type = typeof(TAttribute);
- var value_type = value.GetType();
- var field = value_type.GetField(value.ToString());
+ var value_type = value.GetType();
+ var field = value_type.GetField(value.ToString());
return (TAttribute[]?)field.GetCustomAttributes(attribute_type, false);
}
@@ -43,6 +43,7 @@ private static TValue[] GetAttributeValues(this Enum value,
? string.Join(Environment.NewLine, descriptions)
: string.Empty;
+ /// Возвращает коллекцию описаний, полученных из атрибутов для значения перечисления
public static IEnumerable GetDescriptions(this Enum value) => value.GetAttributeValues(a => a.Description);
/// Получить описание поля - значение атрибута
diff --git a/MathCore/Extensions/EventHandlerExtentions.cs b/MathCore/Extensions/EventHandlerExtentions.cs
index def59e6c..d7c08231 100644
--- a/MathCore/Extensions/EventHandlerExtentions.cs
+++ b/MathCore/Extensions/EventHandlerExtentions.cs
@@ -78,8 +78,7 @@ public static void Start(
object Sender,
params string[] PropertyName)
{
- if (PropertyName is null) throw new ArgumentNullException(nameof(PropertyName));
- if (Handler is null || PropertyName.Length == 0) return;
+ if (Handler is null || PropertyName.NotNull().Length == 0) return;
var args = PropertyName.ToArray(name => new PropertyChangedEventArgs(name));
foreach (var d in Handler.GetInvocationList())
switch (d.Target)
@@ -176,9 +175,9 @@ Handler is null
/// Аргументы события
[DST]
public static void FastStart(
- this EventHandler? Handler,
+ this EventHandler? Handler,
object? Sender,
- TEventArgs e)
+ TEventArgs e)
where TEventArgs : EventArgs
=> Handler?.Invoke(Sender, e);
@@ -239,8 +238,8 @@ Handler is null
/// Массив результатов обработки события
[DST]
public static TResult?[] Start(
- this EventHandler? Handler,
- TSender? Sender,
+ this EventHandler? Handler,
+ TSender? Sender,
TArgs Args) =>
Handler is null
? []
diff --git a/MathCore/Extensions/ExceptionEx.cs b/MathCore/Extensions/ExceptionEx.cs
index 7f1b72b6..dcd59ddd 100644
--- a/MathCore/Extensions/ExceptionEx.cs
+++ b/MathCore/Extensions/ExceptionEx.cs
@@ -1,11 +1,18 @@
namespace MathCore.Extensions;
+/// Статический класс расширения для работы с исключениями
public static class ExceptionEx
{
+ /// Добавляет пару ключ-значение в коллекцию Data исключения
+ /// Тип исключения
+ /// Исключение
+ /// Ключ данных
+ /// Значение данных
+ /// Исключение с добавленными данными
public static TException WithData(this TException exception, object Key, object Value)
- where TException : Exception
+ where TException : Exception
{
- exception.Data[Key] = Value;
- return exception;
+ exception.Data[Key] = Value; // Добавление данных в исключение
+ return exception; // Возврат модифицированного исключения
}
}
diff --git a/MathCore/Extensions/IEnumerableDoubleExtensions.cs b/MathCore/Extensions/IEnumerableDoubleExtensions.cs
index bad78013..97470dc0 100644
--- a/MathCore/Extensions/IEnumerableDoubleExtensions.cs
+++ b/MathCore/Extensions/IEnumerableDoubleExtensions.cs
@@ -1,6 +1,4 @@
#nullable enable
-using System.Collections;
-
using MathCore.Values;
// ReSharper disable UnusedMember.Global
@@ -18,12 +16,15 @@ namespace System.Linq;
public static partial class IEnumerableExtensions
{
+ /// Вычисляет среднее значение и дисперсию последовательности
+ /// Последовательность чисел
+ /// Среднее значение и дисперсия
public static (double Average, double Dispersion) AverageAndDispersion(this IEnumerable values)
{
var avg = 0d;
var d = 0d;
- foreach(var x in values)
+ foreach (var x in values)
{
avg += x;
d += x * x;
@@ -32,6 +33,9 @@ public static (double Average, double Dispersion) AverageAndDispersion(this IEnu
return (avg, d - avg * avg);
}
+ /// Вычисляет среднее значение и стандартное отклонение последовательности
+ /// Последовательность чисел
+ /// Среднее значение и стандартное отклонение
public static (double Average, double Sigma) AverageAndSigma(this IEnumerable values)
{
var (avg, d) = values.AverageAndDispersion();
@@ -72,7 +76,7 @@ public static IEnumerable AverageWindow(this IEnumerable samples
/// При < 1
public static IEnumerable AverageMedian(this IEnumerable samples, int WindowLength)
{
- if(samples is null) throw new ArgumentNullException(nameof(samples));
+ if (samples is null) throw new ArgumentNullException(nameof(samples));
switch (WindowLength)
{
case < 1: throw new ArgumentOutOfRangeException(nameof(WindowLength), WindowLength, "Длина окна должна быть больше 0");
@@ -114,7 +118,7 @@ public static IEnumerable AverageMedian(this IEnumerable samples
while (j < i && buffer[j] <= x)
j++;
- if (j == i)
+ if (j == i)
buffer[i] = x;
else
{
@@ -129,8 +133,8 @@ public static IEnumerable AverageMedian(this IEnumerable samples
buffer[j + 1] = tmp;
}
- yield return i % 2 == 1
- ? (buffer[i / 2] + buffer[i / 2 + 1]) / 2
+ yield return i % 2 == 1
+ ? (buffer[i / 2] + buffer[i / 2 + 1]) / 2
: buffer[i / 2];
if (!element.MoveNext())
@@ -182,6 +186,9 @@ public static IEnumerable AverageMedian(this IEnumerable samples
}
}
+ /// Вычисляет квартили и медиану последовательности
+ /// Последовательность чисел
+ /// Квартиль Q1, медиана, квартиль Q3
public static (double Q1, double Median, double Q3) GetQ1Q3(this IEnumerable samples)
{
var buffer = samples.ToArray();
diff --git a/MathCore/Extensions/IEnumerableExtensions.cs b/MathCore/Extensions/IEnumerableExtensions.cs
index c1b4e885..5a11a767 100644
--- a/MathCore/Extensions/IEnumerableExtensions.cs
+++ b/MathCore/Extensions/IEnumerableExtensions.cs
@@ -4,6 +4,7 @@
using System.Linq.Reactive;
using System.Text;
using System.Text.RegularExpressions;
+
using MathCore;
using MathCore.Annotations;
using MathCore.Values;
@@ -24,11 +25,17 @@ namespace System.Linq;
[PublicAPI]
public static partial class IEnumerableExtensions
{
+ /// Преобразует перечисление элементов в строку с форматированием
+ /// Тип элементов перечисления
+ /// Перечисление элементов
+ /// Функция форматирования элемента
+ /// Строка-разделитель элементов
+ /// Строка, представляющая перечисление элементов
public static string ToArrayFormattedString(this IEnumerable items, Func? formatter = null, string? separator = ", ")
{
var result = new StringBuilder().Append('[');
- if(formatter is null)
+ if (formatter is null)
{
if (separator is { Length: > 0 })
foreach (var item in items)
@@ -53,6 +60,9 @@ public static string ToArrayFormattedString(this IEnumerable items, FuncОбъединяет строки перечисления в одну строку
+ /// Перечисление строк
+ /// Строка, полученная объединением всех строк перечисления
public static string Sum(this IEnumerable strings)
{
var result = new StringBuilder();
@@ -68,7 +78,7 @@ public static string Sum(this IEnumerable strings)
/// Истина если число элементов последовательности больше указанного
public static bool CountGreater(this IEnumerable items, int Count)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (count-- < 0)
@@ -77,7 +87,6 @@ public static bool CountGreater(this IEnumerable items, int Count)
return count < 0;
}
-
/// Последовательность содержит число элементов больше указанного количества
/// Тип элементов последовательности
/// Проверяемая последовательность элементов
@@ -86,7 +95,7 @@ public static bool CountGreater(this IEnumerable items, int Count)
/// Истина если число элементов последовательности больше указанного
public static bool CountGreater(this IEnumerable items, int Count, Func Selector)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (Selector(enumerator.Current) && count-- < 0)
@@ -102,7 +111,7 @@ public static bool CountGreater(this IEnumerable items, int Count, FuncИстина если число элементов последовательности больше, либо равно указанному количеству
public static bool CountGreaterOrEqual(this IEnumerable items, int Count)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (count-- < 0)
@@ -119,7 +128,7 @@ public static bool CountGreaterOrEqual(this IEnumerable items, int Count)
/// Истина если число элементов последовательности больше, либо равно указанному количеству
public static bool CountGreaterOrEqual(this IEnumerable items, int Count, Func Selector)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (Selector(enumerator.Current) && count-- < 0)
@@ -135,7 +144,7 @@ public static bool CountGreaterOrEqual(this IEnumerable items, int Count,
/// Истина если число элементов последовательности меньше указанного
public static bool CountLess(this IEnumerable items, int Count)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (count-- < 0)
@@ -152,7 +161,7 @@ public static bool CountLess(this IEnumerable items, int Count)
/// Истина если число элементов последовательности меньше указанного
public static bool CountLess(this IEnumerable items, int Count, Func Selector)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (Selector(enumerator.Current) && count-- < 0)
@@ -168,7 +177,7 @@ public static bool CountLess(this IEnumerable items, int Count, FuncИстина если число элементов последовательности меньше, либо равно указанному количеству
public static bool CountLessOrEqual(this IEnumerable items, int Count)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (count-- < 0)
@@ -185,7 +194,7 @@ public static bool CountLessOrEqual(this IEnumerable items, int Count)
/// Истина если число элементов последовательности меньше, либо равно указанному количеству
public static bool CountLessOrEqual(this IEnumerable items, int Count, Func Selector)
{
- var count = Count;
+ var count = Count;
using var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
if (Selector(enumerator.Current) && count-- < 0)
@@ -198,8 +207,14 @@ public static bool CountLessOrEqual(this IEnumerable items, int Count, Fun
/// Тип элемента последовательности
/// Последовательность элементов, для которой надо создать хеш-таблицу
/// Новая хеш-таблица, созданная из указанной последовательности элементов
- public static HashSet GetHashSet(this IEnumerable items) => [..items];
+ public static HashSet GetHashSet(this IEnumerable items) => [.. items];
+ /// Преобразовать последовательность в хеш-таблицу
+ /// Тип элемента последовательности
+ /// Последовательность элементов, для которой надо создать хеш-таблицу
+ /// Функция сравнения элементов
+ /// Функция вычисления хеш-кода элемента
+ /// Новая хеш-таблица, созданная из указанной последовательности элементов
public static HashSet GetHashSet(this IEnumerable items, Func Comparer, Func Hasher)
{
var set = new HashSet(Comparer.Create(Hasher));
@@ -229,18 +244,18 @@ public static double Dispersion(this IEnumerable enumerable)
double sum;
double sum2;
- long count;
+ long count;
switch (enumerable)
{
case List list:
{
if (list.Count == 0) return double.NaN;
- sum = 0d;
+ sum = 0d;
sum2 = 0d;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -252,11 +267,11 @@ public static double Dispersion(this IEnumerable enumerable)
{
if (list.Count == 0) return double.NaN;
- sum = 0d;
+ sum = 0d;
sum2 = 0d;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -269,13 +284,13 @@ public static double Dispersion(this IEnumerable enumerable)
using var enumerator = enumerable.GetEnumerator();
if (!enumerator.MoveNext()) return double.NaN;
- sum = enumerator.Current;
- sum2 = sum * sum;
+ sum = enumerator.Current;
+ sum2 = sum * sum;
count = 1;
while (enumerator.MoveNext())
{
var x = enumerator.Current;
- sum += x;
+ sum += x;
sum2 += x * x;
count++;
}
@@ -301,11 +316,11 @@ public static double Dispersion(this IEnumerable enumerable)
{
if (list.Length == 0) return double.NaN;
- sum = 0;
+ sum = 0;
sum2 = 0;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -317,11 +332,11 @@ public static double Dispersion(this IEnumerable enumerable)
{
if (list.Count == 0) return double.NaN;
- sum = 0;
+ sum = 0;
sum2 = 0;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -333,11 +348,11 @@ public static double Dispersion(this IEnumerable enumerable)
{
if (list.Count == 0) return double.NaN;
- sum = 0;
+ sum = 0;
sum2 = 0;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -350,13 +365,13 @@ public static double Dispersion(this IEnumerable enumerable)
using var enumerator = enumerable.GetEnumerator();
if (!enumerator.MoveNext()) return double.NaN;
- sum = enumerator.Current;
- sum2 = sum * sum;
+ sum = enumerator.Current;
+ sum2 = sum * sum;
count = 1;
while (enumerator.MoveNext())
{
var x = enumerator.Current;
- sum += x;
+ sum += x;
sum2 += x * x;
count++;
}
@@ -382,11 +397,11 @@ public static double Dispersion(this IEnumerable enumerable)
{
if (list.Length == 0) return double.NaN;
- sum = 0;
+ sum = 0;
sum2 = 0;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -398,11 +413,11 @@ public static double Dispersion(this IEnumerable enumerable)
{
if (list.Count == 0) return double.NaN;
- sum = 0;
+ sum = 0;
sum2 = 0;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -414,11 +429,11 @@ public static double Dispersion(this IEnumerable enumerable)
{
if (list.Count == 0) return double.NaN;
- sum = 0;
+ sum = 0;
sum2 = 0;
foreach (var x in list)
{
- sum += x;
+ sum += x;
sum2 += x * x;
}
@@ -431,13 +446,13 @@ public static double Dispersion(this IEnumerable enumerable)
using var enumerator = enumerable.GetEnumerator();
if (!enumerator.MoveNext()) return double.NaN;
- sum = enumerator.Current;
- sum2 = sum * sum;
+ sum = enumerator.Current;
+ sum2 = sum * sum;
count = 1;
while (enumerator.MoveNext())
{
var x = enumerator.Current;
- sum += x;
+ sum += x;
sum2 += x * x;
count++;
}
@@ -458,18 +473,18 @@ public static double Dispersion(this IEnumerable enumerable, Func(this IEnumerable enumerable, Func(this IEnumerable enumerable, Func(this IEnumerable enumerable, Func InsertAfter(this IEnumerable? collection, par
{
switch (enumerable)
{
- case null: return DefaultValue;
- case T[] { Length : 0 }: return DefaultValue;
- case List { Count : 0 }: return DefaultValue;
+ case null: return DefaultValue;
+ case T[] { Length: 0 }: return DefaultValue;
+ case List { Count: 0 }: return DefaultValue;
case IList { Count: 0 }: return DefaultValue;
case T[] list:
@@ -605,9 +620,9 @@ public static IEnumerable InsertAfter(this IEnumerable? collection, par
{
switch (enumerable)
{
- case null: return DefaultValue;
- case T[] { Length : 0 }: return DefaultValue;
- case List { Count : 0 }: return DefaultValue;
+ case null: return DefaultValue;
+ case T[] { Length: 0 }: return DefaultValue;
+ case List { Count: 0 }: return DefaultValue;
case IList { Count: 0 }: return DefaultValue;
case T[] list:
@@ -653,9 +668,9 @@ public static IEnumerable InsertAfter(this IEnumerable? collection, par
{
switch (enumerable)
{
- case null: return DefaultValue;
- case T[] { Length : 0 }: return DefaultValue;
- case List { Count : 0 }: return DefaultValue;
+ case null: return DefaultValue;
+ case T[] { Length: 0 }: return DefaultValue;
+ case List { Count: 0 }: return DefaultValue;
case IList { Count: 0 }: return DefaultValue;
case T[] list:
@@ -736,13 +751,13 @@ public static IEnumerable SelectMany(this TSo
if (BlockSize <= 0)
throw new ArgumentOutOfRangeException(nameof(BlockSize), "Размер блока должен быть положительным значением");
- using var e = enumerable.GetEnumerator();
- var block = new T?[BlockSize];
+ using var e = enumerable.GetEnumerator();
+ var block = new T?[BlockSize];
while (e.MoveNext())
{
block[0] = e.Current;
- var i = 1;
+ var i = 1;
for (; i < block.Length && e.MoveNext(); i++) block[i] = e.Current;
if (i == block.Length)
@@ -846,7 +861,7 @@ public static int FirstIndexOf(this IEnumerable enumerable, in T? item)
/// Индекс последнего вхождения элемента в перечисление, либо -1 в случае, если он в ней отсутствует
public static int LastIndexOf(this IEnumerable enumerable, in T? item)
{
- var i = 0;
+ var i = 0;
var index = -1;
switch (enumerable)
{
@@ -1495,7 +1510,7 @@ public static IEnumerable SelectWithLastValue
{
if (first)
{
- last = item;
+ last = item;
first = false;
continue;
}
@@ -1582,10 +1597,10 @@ public static IEnumerable AtLast(this IEnumerable? collection, Action : IEnumerable, IObservable
public EnumerableHistory([MinValue(0)] int HistoryLength)
{
_HistoryLength = HistoryLength;
- _Queue = new(HistoryLength);
+ _Queue = new(HistoryLength);
}
/// Удаление лишних элементов из истории
@@ -1792,7 +1807,7 @@ out T? Max
case T[] list:
foreach (var value in list)
{
- var f = selector(value);
+ var f = selector(value);
if (min.AddValue(f)) Min = value;
if (max.AddValue(f)) Max = value;
}
@@ -1802,7 +1817,7 @@ out T? Max
case List list:
foreach (var value in list)
{
- var f = selector(value);
+ var f = selector(value);
if (min.AddValue(f)) Min = value;
if (max.AddValue(f)) Max = value;
}
@@ -1812,7 +1827,7 @@ out T? Max
case IList list:
foreach (var value in list)
{
- var f = selector(value);
+ var f = selector(value);
if (min.AddValue(f)) Min = value;
if (max.AddValue(f)) Max = value;
}
@@ -1821,7 +1836,7 @@ out T? Max
default:
foreach (var value in collection)
{
- var f = selector(value);
+ var f = selector(value);
if (min.AddValue(f)) Min = value;
if (max.AddValue(f)) Max = value;
}
@@ -1903,8 +1918,8 @@ out int MaxIndex
{
var min = new MinValue();
var max = new MaxValue();
- Min = default;
- Max = default;
+ Min = default;
+ Max = default;
MinIndex = -1;
MaxIndex = -1;
switch (collection)
@@ -1915,15 +1930,15 @@ out int MaxIndex
for (var i = 0; i < count; i++)
{
var item = list[i];
- var f = selector(item);
+ var f = selector(item);
if (min.AddValue(f))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(f))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
}
@@ -1936,15 +1951,15 @@ out int MaxIndex
for (var i = 0; i < count; i++)
{
var item = list[i];
- var f = selector(item);
+ var f = selector(item);
if (min.AddValue(f))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(f))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
}
@@ -1957,15 +1972,15 @@ out int MaxIndex
for (var i = 0; i < count; i++)
{
var item = list[i];
- var f = selector(item);
+ var f = selector(item);
if (min.AddValue(f))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(f))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
}
@@ -1980,12 +1995,12 @@ out int MaxIndex
var f = selector(item);
if (min.AddValue(f))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(f))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
i++;
@@ -2012,8 +2027,8 @@ out int MaxIndex
{
var min = new MinValue();
var max = new MaxValue();
- Min = double.NaN;
- Max = double.NaN;
+ Min = double.NaN;
+ Max = double.NaN;
MinIndex = -1;
MaxIndex = -1;
switch (collection)
@@ -2026,12 +2041,12 @@ out int MaxIndex
var item = list[i];
if (min.AddValue(item))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(item))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
}
@@ -2046,12 +2061,12 @@ out int MaxIndex
var item = list[i];
if (min.AddValue(item))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(item))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
}
@@ -2066,12 +2081,12 @@ out int MaxIndex
var item = list[i];
if (min.AddValue(item))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(item))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
}
@@ -2085,12 +2100,12 @@ out int MaxIndex
{
if (min.AddValue(item))
{
- Min = item;
+ Min = item;
MinIndex = i;
}
if (max.AddValue(item))
{
- Max = item;
+ Max = item;
MaxIndex = i;
}
i++;
@@ -2107,7 +2122,7 @@ out int MaxIndex
/// Максимальный элемент последовательности
public static T? GetMax(this IEnumerable collection, Func selector)
{
- var max = new MaxValue();
+ var max = new MaxValue();
var result = default(T);
switch (collection)
{
@@ -2143,7 +2158,7 @@ out int MaxIndex
/// Максимальный элемент последовательности
public static double GetMax(this IEnumerable collection)
{
- var max = new MaxValue();
+ var max = new MaxValue();
var result = double.NaN;
switch (collection)
{
@@ -2178,9 +2193,9 @@ public static double GetMax(this IEnumerable collection)
/// Максимальный элемент последовательности
public static T? GetMax(this IEnumerable collection, Func selector, out int index)
{
- var max = new MaxValue();
+ var max = new MaxValue();
var result = default(T);
- var i = 0;
+ var i = 0;
index = -1;
switch (collection)
{
@@ -2190,7 +2205,7 @@ public static double GetMax(this IEnumerable collection)
var item = list[i];
if (max.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2202,7 +2217,7 @@ public static double GetMax(this IEnumerable collection)
var item = list[i];
if (max.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2214,7 +2229,7 @@ public static double GetMax(this IEnumerable collection)
var item = list[i];
if (max.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2225,7 +2240,7 @@ public static double GetMax(this IEnumerable collection)
{
if (max.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
i++;
@@ -2241,9 +2256,9 @@ public static double GetMax(this IEnumerable collection)
/// Максимальный элемент последовательности
public static double GetMax(this IEnumerable collection, out int index)
{
- var max = new MaxValue();
+ var max = new MaxValue();
var result = double.NaN;
- var i = 0;
+ var i = 0;
index = -1;
switch (collection)
{
@@ -2253,7 +2268,7 @@ public static double GetMax(this IEnumerable collection, out int index)
var item = list[i];
if (max.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2265,7 +2280,7 @@ public static double GetMax(this IEnumerable collection, out int index)
var item = list[i];
if (max.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2277,7 +2292,7 @@ public static double GetMax(this IEnumerable collection, out int index)
var item = list[i];
if (max.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2288,7 +2303,7 @@ public static double GetMax(this IEnumerable collection, out int index)
{
if (max.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
i++;
@@ -2306,7 +2321,7 @@ public static double GetMax(this IEnumerable collection, out int index)
/// Минимальный элемент последовательности
public static T? GetMin(this IEnumerable collection, Func selector)
{
- var min = new MinValue();
+ var min = new MinValue();
var result = default(T);
switch (collection)
{
@@ -2340,7 +2355,7 @@ public static double GetMax(this IEnumerable collection, out int index)
/// Минимальный элемент последовательности
public static double GetMin(this IEnumerable collection)
{
- var min = new MinValue();
+ var min = new MinValue();
var result = double.NaN;
switch (collection)
{
@@ -2375,9 +2390,9 @@ public static double GetMin(this IEnumerable collection)
/// Минимальный элемент последовательности
public static T? GetMin(this IEnumerable collection, Func selector, out int index)
{
- var min = new MinValue();
+ var min = new MinValue();
var result = default(T);
- var i = 0;
+ var i = 0;
index = -1;
switch (collection)
{
@@ -2387,7 +2402,7 @@ public static double GetMin(this IEnumerable collection)
var item = list[i];
if (min.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2399,7 +2414,7 @@ public static double GetMin(this IEnumerable collection)
var item = list[i];
if (min.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2411,7 +2426,7 @@ public static double GetMin(this IEnumerable collection)
var item = list[i];
if (min.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2422,7 +2437,7 @@ public static double GetMin(this IEnumerable collection)
{
if (min.AddValue(selector(item)))
{
- index = i;
+ index = i;
result = item;
}
i++;
@@ -2438,9 +2453,9 @@ public static double GetMin(this IEnumerable collection)
/// Минимальный элемент последовательности
public static double GetMin(this IEnumerable collection, out int index)
{
- var min = new MinValue();
+ var min = new MinValue();
var result = double.NaN;
- var i = 0;
+ var i = 0;
index = -1;
switch (collection)
{
@@ -2450,7 +2465,7 @@ public static double GetMin(this IEnumerable collection, out int index)
var item = list[i];
if (min.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2462,7 +2477,7 @@ public static double GetMin(this IEnumerable collection, out int index)
var item = list[i];
if (min.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2474,7 +2489,7 @@ public static double GetMin(this IEnumerable collection, out int index)
var item = list[i];
if (min.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
}
@@ -2485,7 +2500,7 @@ public static double GetMin(this IEnumerable collection, out int index)
{
if (min.AddValue(item))
{
- index = i;
+ index = i;
result = item;
}
i++;
@@ -3066,10 +3081,10 @@ public static IEnumerable Intersection(this IEnumerable A, IEnumerable<
/// Истина, если последовательности равны с точностью до элементов
public static bool ItemEquals(this IEnumerable A, IEnumerable B)
{
- using var a = A.GetEnumerator();
- using var b = B.GetEnumerator();
- var next_a = a.MoveNext();
- var next_b = b.MoveNext();
+ using var a = A.GetEnumerator();
+ using var b = B.GetEnumerator();
+ var next_a = a.MoveNext();
+ var next_b = b.MoveNext();
while (next_a && next_b)
{
if (a.Current is null && b.Current != null) return false;
@@ -3088,8 +3103,8 @@ public static bool ItemEquals(this IEnumerable A, IEnumerable B)
public static IEnumerable NotIntersection(this IEnumerable A, IEnumerable B)
{
var b_list = B.ToListFast();
- var b = b_list.GetHashSet();
- var a = new HashSet();
+ var b = b_list.GetHashSet();
+ var a = new HashSet();
foreach (var a_item in A)
{
@@ -3128,12 +3143,12 @@ out T[] NotIntersection
var a = A.ToListFast();
var b = B.ToListFast();
- var missing_in_a_from_b_list = new List(a.Count + b.Count);
- var missing_in_b_from_a_list = new List(a.Count + b.Count);
+ var missing_in_a_from_b_list = new List(a.Count + b.Count);
+ var missing_in_b_from_a_list = new List(a.Count + b.Count);
var existing_in_a_from_b_list = new List(a.Count + b.Count);
var existing_in_b_from_a_list = new List(a.Count + b.Count);
- var intersection_list = new List(a.Count + b.Count);
- var not_intersection_list = new List(a.Count + b.Count);
+ var intersection_list = new List(a.Count + b.Count);
+ var not_intersection_list = new List(a.Count + b.Count);
var b_existing_in_a = new bool[b.Count];
foreach (var a_item in a)
@@ -3178,10 +3193,10 @@ out T[] NotIntersection
ExistingInAFromB = [.. existing_in_a_from_b_list];
ExistingInBFromA = [.. existing_in_b_from_a_list];
- MissingInAFromB = [.. missing_in_a_from_b_list];
- MissingInBFromA = [.. missing_in_b_from_a_list];
- Intersection = [.. intersection_list];
- NotIntersection = [.. not_intersection_list];
+ MissingInAFromB = [.. missing_in_a_from_b_list];
+ MissingInBFromA = [.. missing_in_b_from_a_list];
+ Intersection = [.. intersection_list];
+ NotIntersection = [.. not_intersection_list];
}
/// Преобразовать последовательность в строку с указанной строкой-разделителем
@@ -3221,7 +3236,7 @@ public static (T Min, T Max) GetMinMax(this IEnumerable Items, IComparer(this IEnumerable Items, Func