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

标签 c# arrays linq sorting median

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

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

如果有任何 super 方法可以在 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];

关于c# - LinQ:C# 在使用一些过滤器复制时对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40125847/

相关文章:

c# - 您可以在选择项目之前在 linq 查询中设置属性吗?

java - 编程寻找数字 n1 的最小排列,但应大于另一个给定数字 n2;如果不可能,则打印 "Invalid"

javascript - 遍历表并在 js/jquery 中创建一个数组

c# - 另一个 LINQ Pivot 问题——将 SQL 脚本转换为 LINQ

c# - Linq:将 memberExpression 类型转换为不可空

c# - 加载异步 WP8.1 : Partial result

c# - 将图像从 Android 发送到 C# webservice

c# - 如何将谓词定义为函数参数

c - 既不是参数也不是指针

c# - 常见的 Linq/标准查询运算符错误/错误步骤?