您可能正在实现诸如大数乘法或向量的其他线性组合之类的东西。您需要您描述为内联委托的方法的原因很可能是因为在计算期间存储结果的位置不同,也因为嵌套的 for 循环是硬编码的。因此,我建议修改您的代码,如下所示:
public void Update(int destinationIndex, int[][] arrays, int[] indices) {
var product=1;
for(var i=indices.Length; i-->0; )
if(destinationIndex!=i)
product*=arrays[i][indices[i]];
arrays[destinationIndex][indices[destinationIndex]]+=product;
}
public void PerformUpdate(
int destinationIndex, int[] counts, int[][] arrays, Action<int, int>[] actions,
List<int> indices=null, int level=0
) {
if(level==counts.Length)
Update(destinationIndex, arrays, (indices??new List<int>()).ToArray());
else
for(int count=counts[level], i=0; i<count; i++) {
if(null!=actions&&level<actions.Length)
actions[level](i, count); // do something according to nesting level
(indices=indices??new List<int>()).Add(i);
PerformUpdate(destinationIndex, counts, arrays, actions, indices, 1+level);
indices.RemoveAt(indices.Count-1);
}
}
此代码以递归方式实现。int[][] array
只要您要定义 and 的计算,而不是定义 and 中的方法名称,就可以将operator *
替换为operator +
通用MutiplyScalar
数组AddScalar
。
因此,我们不会使用委托Update
来控制目的地。相反,我们只是使用destinationIndex
来完成。下面是一个测试用例:
int[] a=new[] { 1, 2 }, b=new[] { 3, 4, 5 }, c=new[] { 6 };
Action<int, int> m=(index, count) => Debug.Print("index={0}; count={1}", index, count);
PerformUpdate(2, new[] { a.Length, b.Length, c.Length }, new[] { a, b, c }, new[] { m, m, m });
我们仍然有内联委托,它们Lambda Expressions
在 c# 中调用。根据您提供的原始代码,Do something
嵌套的 for 循环之间有 s 。但是,我们找不到太多非全球已知的信息Update
;我们可以看到的最显着的区别是迭代索引和结束数字,它们i, I
是j, J
和k, K
。因此,我们只是将这些作为参数传递给Action<int, int>
for 做某事,并且它们对于每个级别的 for 循环都是可变的。
执行很大程度上取决于indices
. 它存储当前for循环的迭代索引并传递给下一级递归调用。此外,如果您传递的arrays
计数小于其Length
in indices
,它将被视为具有您传递给的计数长度的数组。不要传递负数,也不要传递更大的数。它可以是缺乏Action<int, int>
,那只是意味着什么都不做而不是做某事。