【问题标题】:Can I have an if statement change what variable is accessed in a loop我可以让 if 语句更改循环中访问的变量吗
【发布时间】:2021-12-03 15:35:30
【问题描述】:

嘿,我的情况是,我有一个 for 循环来做一些事情,我想编写一行代码,要么调用一个函数,传入一个由 for 循环索引索引的数组,要么运行一个(不是array) 变量,我知道我可以通过在 for 循环中放置一个 if 语句来做到这一点,但我会一遍又一遍地重复相同的 if 语句以获得相同的结果。那么有没有一种好方法可以在 for 循环之前运行 if 语句,并且该 if 语句的结果运行相同的 for 循环,但是一个调用传入数组或变量?

代码示例

        for (int i = 0; i < CurrentVerticalList.Count; i++)
        {
            GuiGeneral CGroup = CurrentVerticalList[i];

            CGroup.ResizeUsingStandard(ForcedResize[i]); //I want the condition before the for 
                                                         //loop to have ForcedResize[i] here if
                                                         //true and another variable here of the
                                                         //same type but not an array if false.

            for (int j = 0; j < 2; j++)
            {
                GlobalListIndex[j]++;
            }

            CGroup.MoveElementTo(CCoord, false);

            CCoord.y += CGroup.ElementRect.WidthHeight.y;
        }

【问题讨论】:

  • CGroup.ResizeUsingStandard(condition ? ForcedResize[i] : othervar) ?
  • 不是每次循环时都检查条件还是只检查一次条件?
  • 这可能会有所帮助Dynamic Array
  • 它每次都会检查条件。如果该值永远不会改变,请在循环之前将该值捕获到 bool 变量中,然后使用该变量 - 这很便宜
  • 您要设置什么样的条件?每个元素都是随机的吗?循环的每个元素都不同吗?还是在循环结束之前条件的值不会改变?

标签: c# loops if-statement optimization


【解决方案1】:

开始吧,将条件检查移出 for 循环:

Func<int, double> GetResizeFromForcedResize = (index => ForcedResize[index]);
Func<int, double> GetResizeFromVariable  = (index => fixVariable);
var GetResizeValue = condition? GetResizeFromForcedResize : GetResizeFromVariable;

for (int i = 0; i < CurrentVerticalList.Count; i++)
{
    GuiGeneral CGroup = CurrentVerticalList[i];

    CGroup.ResizeUsingStandard(GetResizeValue(i));

    for (int j = 0; j < 2; j++)
    {
        GlobalListIndex[j]++;
    }

    CGroup.MoveElementTo(CCoord, false);

    CCoord.y += CGroup.ElementRect.WidthHeight.y;
}

编辑:想让您知道这里的其他答案仍在每次迭代中进行检查,但不是这个。

【讨论】:

  • 这非常适合我写的内容,但我测试了它只是在循环内执行条件,令我惊讶的是,在循环内执行条件似乎更快。我认为做一次条件会更快,但显然不是。
【解决方案2】:

嗯,我很难理解这个问题,但我认为你想要的是这些方面的东西,本可以帮助提供更多类型,但你可以使用本地函数实现目标:

        ForcedResizeArrayType other = new object(); //TODO: Define return type

        bool condition = ResolveCondition();  //TODO: Define condition to be true or false


        ForcedResizeArrayType GetOneOr(int i, bool condition, 
        ForcedResizeArrayType[] forcedResizeArray)
        {
            return condition ? forcedResizeArray[i] : other;
        }

        for (int i = 0; i < CurrentVerticalList.Count; i++)
        {
            CGroup.ResizeUsingStandard(GetOneOr(i, condition, ForcedResize));
        }

如果我喜欢或讨厌那些本地功能,每周都会有所不同,但它们有用途

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 2020-11-24
    • 1970-01-01
    • 2021-11-05
    • 2011-06-20
    • 2013-08-18
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多