我有两个float类型的向量(为了简化这里,我使用了vector的3个项目的长度):
float[] a = new float[] { 10.0f, 20.0f, 30.0f };
float[] b = new float[] { 5.0f, 10.0f, 20.0f };
我需要以成对的方式从a中减去b并保留两个向量(结果和剩余数量)。结果对应于a-b,剩余数量对应于不能从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的数量,然后才能减去剩下的数量应该是b不能从a中减去的余数,例如,想象下面的场景:
示例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'但是如何实现这个?
答案 0 :(得分: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的索引重载。