2

我正在开发一个使用大量 X、Y 空间信息的应用程序。

给定两个平行数组,一个代表 X 值,另一个代表 Y 值,有没有办法从两个数组中选择一个子集? 通过使用 x 值数组中的起始值和终止值来确定子集。

这是两个并行数组的示例。

double[] xs = new double[] { 
    0.0, 0.04, 0.08, 0.12, 0.16,
    0.2, 0.24, 0.28, 0.32, 0.36,
    0.4, 0.44, 0.48, 0.52, 0.56,
    0.6, 0.64, 0.68, 0.72, 0.76,
    0.8, 0.84, 0.88, 0.92
};
double[] ys = new double[] {
    0.0152, 0.1434, 0.1647, 0.3800,
    0.7880, 0.0488, 1.0060, 0.2710,
    0.0363, 0.4321, 0.5573, 0.2192,
    0.6341, 0.5181, 0.9546, 0.8275,
    0.5567, 0.9870, 0.8895, 0.3423,
    0.6061, 0.1507, 0.7841, 0.6512
};

假设我想要 x 值和 y 值的子集,其中 x 大于或等于 0.1 且小于或等于 0.2。这样一个子集的结果应该是两个并行数组:

double[] x_subset = new double[] {
    0.12, 0.16, 0.2
};
double[] y_subset = new double[] {
    0.3800, 0.7880, 0.0488
};

x 和 y 数组将始终具有相同数量的元素。

我尝试过使用 Zip,但这不起作用。除了使用普通的旧循环之外,我想不出其他任何东西。不过,我是 LINQ 的新手。

4

2 回答 2

7

可能是这样的:

var zipped = xs.Zip(ys, (x, y) => new { x, y })
               .Where(coord => coord.x > 0.1 && coord.x <= 0.2);

通过使用 4.0 版本中可用的Enumerable.Zip

于 2012-07-12T21:03:53.287 回答
0

您可以使用 LINQ 查询来选择匹配的元素。

x_subset = xs.Where(x => x >= .1 && x <= .2).ToArray();
y_subset = ys.Where(y => y >= .1 && y <= .2).ToArray();

(您也可以使用 a Func<double, bool> f = (a) => a >= .1 && a <= .2))并将其作为参数传递给 .Where)

于 2012-07-12T21:03:36.637 回答