1

我有两个浮点类型的向量(为了简化,我使用了向量的 3 项长度):

float[] a = new float[] { 10.0f, 20.0f, 30.0f };
float[] b = new float[] { 5.0f, 10.0f, 20.0f };

我需要以成对的方式从 a 中减去 b 并保留两个向量(结果和剩余数量)。结果对应于 ab,剩余数量对应于不能从 a 中减去的数量(参见示例 2):

示例 1:

  a   |  b  | Result | Remaining quantity (quantity that cannot be substracted from a)
                                          (b remainder)
------------------------------------------------
10.0f   5.0f   5.0f      0f
20.0f  10.0f  10.0f      0f
30.0f  20.0f  10.0f      0f

在上面的例子中,剩余数量总是 0,因为 b 的数量总是小于或等于 a 的数量,但是如果 b 中的任何数量大于 a 中的数量,最多只能减去 a 的数量,然后再减去剩余的数量应该是无法从 a 中减去的 b 余数,例如,想象以下场景:

示例 2:

float[] a = new float[] { 10.0f, 5.0f, 30.0f };
float[] b = new float[] { 5.0f, 10.0f, 20.0f };

  a   |  b  | Result | Remaining (quantity that cannot be substracted from a)
                                 (b remainder)
--------------------------------
10.0f   5.0f   5.0f     0f
 5.0f  10.0f   0.0f     5f
30.0f  20.0f  10.0f     0f

操作后我需要在两个向量中获得结果和剩余。如何使用 LINQ 和 Zip 之类的功能有效地完成它?

提前致谢!

编辑:我正在尝试执行以下操作:

                float[] remainder  = new float[<same lenght of a or b>];
                Result= a
                    .Zip(b, (x, y) =>
                        {
                            remainder[i] = 0;
                            if (y > x)
                            {
                                remainder[i] = y - x;
                                return 0;
                            }
                            else
                            {
                                return x- y;
                            }
                        }).ToArray();

我现在的问题是知道如何获取当前迭代的索引,在我的例子中,这个'i'被使用但是如何实现呢?

4

1 回答 1

1

这就是你可以做到的方式。

Result = a.Zip(b, (x, y) => new { x, y }).Select((a,i) =>
                    {
                        remainder[i] = 0;
                        if (a.y > a.x)
                        {
                            remainder[i] = a.y - a.x;
                            return 0;
                        }
                        else
                        {
                            return a.x- a.y;
                        }
                    }).ToArray();

它使用IEnumerable.Select的索引重载。

于 2013-06-19T08:13:10.957 回答