2013-06-19 54 views
1

我已经float类型两个向量(这里简化,我使用的3项矢量的长度):LINQ:结合矢量

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

我需要在成对的方式从一个。减去B和保持两个向量(结果和剩余数量)。结果相应于AB和剩余量对应于不能从一个中减去该量(参见实施例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不可能减少的余数例如,想象下面的情况:

例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 

操作后,我需要在两个向量中获得Result和Remaining。怎么可以有效地使用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(); 

我现在的问题是要知道如何得到当前迭代的索引,在我的情况下,这个“我”被使用,但如何做到这一点?

+0

是的,'Zip'是要走的路。 –

+0

你知道如何得到当前迭代索引在zip中吗? – user1624552

+0

您可以Zip,然后选择[this](http://msdn.microsoft.com/zh-cn/library/bb534869.aspx)。 –

回答

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