有没有办法在C#中内联委托?

zer*_*0ne 3 c# delegates inline

这是我正在处理的简化场景.循环结构有多种方法.

for (int i=0; i<I; i++) {
    // Do something
    for (int j=0; j<J; j++) {
        // Do something
        for (int k=0; k<K; k++) {
            // Do something
            Update(a,b,c);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在一种方法中,Update(a,b,c)是

a[i] += b[j] * c[k]
Run Code Online (Sandbox Code Playgroud)

在另一种方法中,它是

b[j] += a[i] * c[k]
Run Code Online (Sandbox Code Playgroud)

然而在另一种方法中,它是

c[k] += a[i] * b[j]
Run Code Online (Sandbox Code Playgroud)

目前,我的代码到处都是重复的.C#中是否有一个模式,以便我不重复代码?我很想使用委托,但似乎委托会降低性能(这在我的情况下是至关重要的).

有没有办法为这种情况编写宏或内联委托函数?

Eri*_*ert 11

像这样的东西?

void DoUpdates(Action<int, int, int> update)
{
  for (int i=0; i<I; i++) {
    // Do something
    for (int j=0; j<J; j++) {
      // Do something
      for (int k=0; k<K; k++) {
        // Do something
        update(i, j, k);
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在来电者

DoUpdates((int i, int j, int k) => { a[i] += b[j] * c[k]; });
Run Code Online (Sandbox Code Playgroud)

这就是你要找的东西吗?

  • 你的第一个问题的答案是:拿一个秒表,运行代码,你会发现它的速度有多快.你的第二个问题的答案是否定的. (4认同)

aba*_*hev 5

void Update<T>(T[] x, T[] y, T[] z, int i, int j, int k)
{
    x[i] += y[j] * z[k];
}
Run Code Online (Sandbox Code Playgroud)

用法:

Update(a, b, c, i, j, k);
Update(b, a, c, j, i, k);
Update(c, a, b, k, i, j);
Run Code Online (Sandbox Code Playgroud)

我发现它a总是由i(等等 - bby jcby k)访问。您可以尝试利用这一事实来优化代码。

  • 这个例子不行。没有为类型“T”定义“+=”和“*” (4认同)