ArrayStatistics
确实需要数组,因为它针对这种特殊情况进行了优化(这就是它被称为 ArrayStatistics 的原因)。同样,StreamingStatistics
针对 IEnumerable 序列流进行了优化,无需将数据保存在内存中。与所有类型的输入一起工作的通用类是Statistics
类。
您是否验证过在您的用例中仅使用 LINQ 和 StreamingStatistics 不够快?为仅包含 50 个条目的列表计算这些统计数据几乎是不可测量的,除非说你在一个循环中这样做了一百万次。
使用 Math.NET Numerics v3.0.0-alpha7 的示例,使用列表中的元组来模拟您的自定义类型:
using MathNet.Numerics.Statistics;
var data = new List<Tuple<string, double>>
{
Tuple.Create("A", 1.0),
Tuple.Create("B", 2.0),
Tuple.Create("C", 1.5)
};
// using the normal extension methods within `Statistics`
var stdDev1 = data.Select(x => x.Item2).StandardDeviation();
var mean1 = data.Select(x => x.Item2).Mean();
// single pass variant (unfortunately there's no single pass MeanStdDev yet):
var meanVar2 = data.Select(x => x.Item2).MeanVariance();
var mean2 = meanVar2.Item1;
var stdDev2 = Math.Sqrt(meanVar2.Item2);
// directly using the `StreamingStatistics` class:
StreamingStatistics.MeanVariance(data.Select(x => x.Item2));