public static class IEnumerableExtensions
{
public static double StdDev(this IEnumerable list, Func values)
{
// ref: https://stackoverflow.com/questions/2253874/linq-equivalent-for-standard-deviation
var mean = 0.0;
var sum = 0.0;
var stdDev = 0.0;
var n = 0;
foreach (var value in list.Select(values))
{
if (value is null)
continue;
n++;
var delta = value.Value - mean;
mean += delta / n;
sum += delta * (value.Value - mean);
}
if (1 < n)
stdDev = Math.Sqrt(sum / (n - 1));
return stdDev;
}
}
У меня сложилось впечатление, что это будет так просто:
public static class IEnumerableExtensions2
{
extension(IEnumerable list) // Bang! (1)
{
public double StdDev(Func values)
{
// ref: https://stackoverflow.com/questions/2253874/linq-equivalent-for-standard-deviation
var mean = 0.0;
var sum = 0.0;
var stdDev = 0.0;
var n = 0;
foreach (var value in list.Select(values)) // Bang! (2)
{
if (value is null)
continue;
n++;
var delta = value.Value - mean;
mean += delta / n;
sum += delta * (value.Value - mean);
}
if (1 < n)
stdDev = Math.Sqrt(sum / (n - 1));
return stdDev;
}
}
}
Но я получаю ошибки:
Не удалось найти тип или имя пространства имен «T» (вам не хватает директивы using или ссылки на сборку?)
'IEnumerable' не содержит определения для 'Select' и лучшей перегрузки метода расширения 'ImmutableArrayExtensions.Select(ImmutableArray, Func)" требуется получатель типа "System.Collections.Immutable.ImmutableArray"
Мне хотелось бы знать, как включить дженерики в блоки расширения.
Я пытаюсь переписать одно из моих расширений в новом синтаксисе блоков. Это расширение IEnumerable: [code]public static class IEnumerableExtensions { public static double StdDev(this IEnumerable list, Func values) { // ref: https://stackoverflow.com/questions/2253874/linq-equivalent-for-standard-deviation var mean = 0.0; var sum = 0.0; var stdDev = 0.0; var n = 0;
foreach (var value in list.Select(values)) { if (value is null) continue;
n++; var delta = value.Value - mean; mean += delta / n; sum += delta * (value.Value - mean); }
if (1 < n) stdDev = Math.Sqrt(sum / (n - 1));
return stdDev; } } [/code] У меня сложилось впечатление, что это будет так просто: [code]public static class IEnumerableExtensions2 { extension(IEnumerable list) // Bang! (1) { public double StdDev(Func values) { // ref: https://stackoverflow.com/questions/2253874/linq-equivalent-for-standard-deviation var mean = 0.0; var sum = 0.0; var stdDev = 0.0; var n = 0;
foreach (var value in list.Select(values)) // Bang! (2) { if (value is null) continue;
n++; var delta = value.Value - mean; mean += delta / n; sum += delta * (value.Value - mean); }
if (1 < n) stdDev = Math.Sqrt(sum / (n - 1));
return stdDev; } } } [/code] Но я получаю ошибки: [list] [*]Не удалось найти тип или имя пространства имен «T» (вам не хватает директивы using или ссылки на сборку?) [*]'IEnumerable' не содержит определения для 'Select' и лучшей перегрузки метода расширения 'ImmutableArrayExtensions.Select(ImmutableArray, Func)" требуется получатель типа "System.Collections.Immutable.ImmutableArray" [/list] Мне хотелось бы знать, как включить дженерики в блоки расширения.