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();
我有这样的情况,我必须获取数组的非零值,对它们进行排序并找到值的中值。我做了如下,
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();