I'm attempting to rewrite one of my extensions in the new block syntax. It's an extension on IEnumerable<T>:
public static class IEnumerableExtensions
{
public static double StdDev<T>(this IEnumerable<T> list, Func<T, double?> 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;
}
}
I was under the impression it would be as simple as:
public static class IEnumerableExtensions2
{
extension(IEnumerable<T> list) // Bang! (1)
{
public double StdDev<T>(Func<T, double?> 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;
}
}
}
But I receive the errors:
- The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
- 'IEnumerable' does not contain a definition for 'Select' and the best extension method overload 'ImmutableArrayExtensions.Select<T, double?>(ImmutableArray, Func<T, double?>)' requires a receiver of type 'System.Collections.Immutable.ImmutableArray'
I'd like to know how I can include generics in extension blocks.
extension<T>(IEnumerable<T> list). See extension member blog