自定义切换用例作为foreach的替代方法

问题描述 投票:0回答:2

对于游戏,我目前正在研究粒子系统。粒子是仅具有位置数据的对象。这些粒子具有通过使用嵌入到其中的矢量场来更新其位置的方法。粒子在数组内部

要在一个物理步骤中更新所有粒子,我目前使用了foreach:

foreach (particle p in ParList) p.update;

其中update方法仅对原始位置进行两次移位和两次加法。现在,我想知道我的系统可以处理多少个粒子,是否可以对其进行优化以增加该数量。

[查看foreach的工作原理,我发现它只是一个基本的for循环,它进行了比较和对索引号的添加。

我想做一个for循环而无需检查索引号是否> = 0且不将索引号减1。

这两个操作通常并不多,但是在我的情况下,它们大约占操作数的1/3。所以我想知道我是否可以这样:

switch (Parlist.Length)
{
    case 1024:
        ParList[1023].update;
        goto case 1023;
    case 1023:
        ParList[1022].update;
        goto case 1022;
    //and so on until
    case 1:
        ParList[0].update;
        break;
}

虽然它看起来很可怕,但我知道这不是应该做的,但首先进行的测试似乎使我在这里实际上可以大大提高性能。我想将其放到一个类中,并以更通用的方式访问它,例如将foreach语法转换为for循环。我希望这样结束:

eachcase (particle p in ParList)
{
    //instructions using p
}

这被翻译为:

switch (Parlist.Length)
{
    case 1024:
        //reference to instructions using Parlist[1023]
        goto case 1023;
    //and so on until
    case 1:
        //reference to instructions using Parlist[0]
        break;
}

我如何建立这样的自定义结构?在C#中可以吗?

如果我能够执行此操作,那么我也想实现这样的自定义中断条件:

eachcase (particle p in ParList, p.x == 0 && p.z == 0)
{
    //instructions using p
}

这被翻译为:

switch (Parlist.Length)
{
    case 1024:
        if (/*break condition*/) break;
        //reference to instructions using Parlist[1023]
        goto case 1023;
    //and so on until
    case 1:
        if (/*break condition*/) break;
        //reference to instructions using Parlist[0]
        break;
}

我阅读了有关Lambda表达式的信息,在这里可以帮到我,但我不确定如何将其连接到通常的对象数组。

c# foreach switch-statement
2个回答
0
投票

为什么不在这里尝试递归示例代码看起来像

function UpdateParList(int length){
   ParList[length - 1].Update;
   // add break condition here if required
   UpdateParList(length-1);
}

0
投票

它认为您需要这样的东西

for (int i = Parlist.Length - 1; i >= 0; i--) 
{
    ParList[i].update;
}

int i = Parlist.Length - 1;
while (i) {
    ParList[i--].update;
}
© www.soinside.com 2019 - 2024. All rights reserved.