readonly ref struct IntSpanAggregateHelper {
readonly ref readonly int _firstNumberRef;
readonly int _length;
public IntSpanAggregateHelper(ref int firstNumberRef, int length) {
_firstNumberRef = ref firstNumberRef;
_length = length;
}
public int Sum() {
var result = 0;
for (var i = 0; i < _length; ++i) {
ref var curNumRef = ref Unsafe.Add(ref Unsafe.AsRef(_firstNumberRef), i);
result += curNumRef;
}
return result;
}
public double Average() => (double) Sum() / _length;
}
static void Test() {
var intArray = new[] { 1, 2, 3, 4, 5 };
var aggHelper = new IntSpanAggregateHelper(ref intArray[0], intArray.Length);
Console.WriteLine($"Sum: {aggHelper.Sum()} | Average: {aggHelper.Average()}"); // Prints "Sum: 15 | Average: 3"
}
Code snippet taken from "Complete C# Quick Reference - C# 11".