LinQ:C# 在使用一些过滤器复制时对数组进行排序

LinQ: C# sort an array while copying with some filters

我有这样的情况,我必须获取数组的非零值,对它们进行排序并找到值的中值。我做了如下,

var array2 = (from t in array1 where t.array2 != 0 select t.array2).ToArray();
Array.Sort(array2);
var Median = array2.Length % 2 == 0 ? new List<double>() { ((array2[array2.Length / 2 - 1]) + (array2[array2.Length / 2])) / 2 } : new List<double>() { array2[array2.Length / 2] };

目前一切顺利。但我正在考虑将前两行合并为一行,例如使用 orderby 方法复制非零值。为此,我尝试过,

var array2 = (from t in ipedsTableValue where t.array2 != 0 select t.array2).ToArray(t); // Not worked

另外建议我是否有任何超级方法可以在 C# 中计算数组的中位数,因为该行看起来也很大,恐怕不容易阅读。

我参考了 SO 资源:Add a Median Method to a List 虽然它工作正常,但我正在考虑一些简单高效的代码,代码数量较少。 任何建议都会有所帮助!

您可以使用 linq 和条件运算符。

var filterd = array1
    .Where(x => x.array2 != 0)
    .Select(x => x.array2)
    .OrderBy(x => x)
    .ToArray();

var length = filterd.Length;

var median = length % 2 == 0
    ? (filterd[length / 2 - 1] + filterd[length / 2]) / 2.0
    : filterd[length / 2];

应该是这样的

var median = array2.Take((array2.Length%2 == 0) ? ((array2.Length/2) + 1) : ((array2.Length + 1)/2))
                    .Reverse()
                    .Take((array2.Length%2 == 0) ? 2 : 1)
                    .Sum(x => x);

数组复制和排序操作:

var filteredArray = array1.Where(x => x != 0.0).OrderBy(x => x).ToArray();

计算中位数

double midpoint = (filteredArray.Count() - 1) / 2.0;
double median = (filteredArray[(int)(midpoint)] + filteredArray[(int)(midpoint + 0.5)]) / 2.0;

这样试试

var array2= (from t in array1 where t.array2!= 0 select t.array2).OrderBy(t => t).ToArray();