Home > Mobile >  Can I have an if statement change what variable is accessed in a loop
Can I have an if statement change what variable is accessed in a loop

Time:10-15

Hey I'm in a situation where I have a for loop that does some stuff and I want to make a line of code either call a function passing in an array indexed by the for loops index, or run a single (not array) variable for every call of that function, I know I could do that by putting an if statement inside the for loop but i'd be repeating the same if statement over and over getting the same result. So is there a way good way I can run the if statement before the for loop and the result of that if statement run the same for loop but that one call passes in the array or the variable?

Code Example

        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;
        }

CodePudding user response:

If the condition doesn't change and is not depending on the loop variables, initialize a bool variable before the loop:

bool condition = ... // TODO

for (int i = 0; i < CurrentVerticalList.Count; i  )
{
    GuiGeneral CGroup = CurrentVerticalList[i];
    var variable = condition ? fixVariable : ForcedResize[i];
    CGroup.ResizeUsingStandard(variable); 
    // ...
}

CodePudding user response:

Eh, hard to understand the question to me but i recon what you want is something along these lines, could've helped with more types supplied, but you could make the intend achievable using a local function:

        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));
        }

It varies from week to week if i love or hate those local functions, but they have uses

CodePudding user response:

Here you go, moving your condition check out of your for loop:

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;
}

Edit: Wanted to let you know that the other answers here are still doing a check at every iteration, but not this one.

  • Related