Percentile是一种扩展方法,调用顺序如下:
public static double Percentile(this IEnumerable<double> data, int p)
因此,您可以使用 Linq 将您的二维数组转换为适当的序列以传递给Percentile
.
但是,results.GetLength(2)
会抛出异常,因为 的维度参数GetLength()
是从零开始的。你可能的意思是results.GetLength(1)
。假设这就是你的意思,你可以这样做:
var query = Enumerable.Range(0, results.GetLength(1))
.Select(iCol => Enumerable.Range(0, results.GetLength(0))
.Select(iRow => results[iRow, iCol])
.Percentile(90));
你可以让 Linq 为你列出清单,
var myList= query.ToList();
或将其添加到预先存在的列表中:
myList.AddRange(query);
更新
要过滤NaN
值,请使用double.IsNaN
:
var query = Enumerable.Range(0, results.GetLength(1))
.Select(iCol => Enumerable.Range(0, results.GetLength(0))
.Select(iRow => results[iRow, iCol])
.Where(d => !double.IsNaN(d))
.Percentile(90));
更新
如果提取几个数组扩展:
public static class ArrayExtensions
{
public static IEnumerable<IEnumerable<T>> Columns<T>(this T[,] array)
{
if (array == null)
throw new ArgumentNullException();
return Enumerable.Range(0, array.GetLength(1))
.Select(iCol => Enumerable.Range(0, array.GetLength(0))
.Select(iRow => array[iRow, iCol]));
}
public static IEnumerable<IEnumerable<T>> Rows<T>(this T[,] array)
{
if (array == null)
throw new ArgumentNullException();
return Enumerable.Range(0, array.GetLength(0))
.Select(iRow => Enumerable.Range(0, array.GetLength(1))
.Select(iCol => array[iRow, iCol]));
}
}
他们的查询变为:
var query = results.Columns().Select(col => col.Where(d => !double.IsNaN(d)).Percentile(90));
这似乎更清楚。