Полезные Расширения для IEnumerable. Окончание
Начало
4. Мода
Мода – число, которое чаще всего встречается в наборе:
public static IEnumerable<T>Использование:
Mode<T>(this IEnumerable<T> source)
{
ArgumentNullException.ThrowIfNull(source);
var groups = source.GroupBy(x => x);
var maxCount = groups.Max(g => g.Count());
return groups
.Where(g => g.Count() == maxCount)
.Select(g => g.Key);
}
var mode = new[] { 1, 1, 1, 1, 5, 6, 7, 8, 9 }
.Mode(); // 1
Если два или более чисел встречаются одинаковое количество раз, мы получим несколько значений в результате. 5. Среднеквадратичное отклонение
Это мера того, насколько разбросаны числа:
public static doubleИспользование:
StandardDeviation<T>(
this IEnumerable<T> source)
where T : IConvertible
{
ArgumentNullException.ThrowIfNull(source);
var values = source
.Select(x => x.ToDouble(
CultureInfo.InvariantCulture))
.ToList();
var count = values.Count;
if (count == 0)
throw new InvalidOperationException(
"Исходная коллекция пуста.");
var avg = values.Average();
var sum = values.Sum(d => Math.Pow(d - avg, 2));
return Math.Sqrt(sum / count);
}
var stdDev = new[] { 1, 1, 1, 1, 5, 6, 7, 8, 9 }
.StandardDeviation(); // 3.1622776601683795
6. ПеремешиваниеЭтот метод перемешивает элементы в последовательности, используя алгоритм перемешивания Фишера-Йейтса:
public static IEnumerable<T>Использование:
Shuffle<T>(this IEnumerable<T> source)
{
ArgumentNullException.ThrowIfNull(source);
var arr = source.ToArray();
var random = Random.Shared;
for (var i = arr.Length - 1; i > 0; i--)
{
var idx = random.Next(i + 1);
(arr[i], arr[idx]) = (arr[idx], arr[i]);
}
return arr;
}
var numbers = Enumerable.Range(0, 5);Источник: https://steven-giesel.com/blogPost/1b8eaaef-01a3-4799-9a96-f0d37197d175
var random = numbers.Shuffle();
// 4, 0, 1, 3, 2