Search code examples
c#loopsbreak

breaking a nested loop


I have a nested loop which is checking if any Currency of Wallet[] matches any Currency in Currency[] UtilityTokens. Upon determining that indeed one of the wallets contains a utility token, I want to break my nested loop as soon as possible to move on.

My current code is the following:

bool walletContainsUtilityToken = false;
for(int i = 0; i < Wallets.Length; i++)
{
    foreach (Currency ut in ExchangeFunctions.UtilityTokens)
    {
        if (Wallets[i].Currency.Equals(ut))
        {
            walletContainsUtilityToken = true;
            break;
        }
    }
    if (walletContainsUtilityToken)
    {
        break;
    }
}

Is this the apropriate way to break nested loops? Is there a different, more efficient way of doing things?


Solution

  • We can get this down to a one-liner, and it will do the early exit you want:

    bool walletContainsUtilityToken = Wallets.Any(w => ExchangeFunctions.UtilityTokens.Any( ut => ut == w.Currency));
    

    This one might be easier to understand (no nesting, only one -shorter- lambda):

    bool walletContainsUtilityToken = Wallets.Select(w => w.Currency).Intersect(ExchangeFunctions.UtilityTokens).Any();
    

    Taking the second option, for clarity I'd actually write it like this:

    bool walletContainsUtilityToken = Wallets.
        Select(w => w.Currency).
        Intersect(ExchangeFunctions.UtilityTokens).
        Any();
    

    If you really want to continue using the full loop, I'd add a check to the loop conditions like so:

    bool walletContainsUtilityToken = false;
    for(int i = 0; i < Wallets.Length && !walletContainsUtilityToken; i++)
    {
        foreach (Currency ut in ExchangeFunctions.UtilityTokens)
        {
            if (Wallets[i].Currency.Equals(ut))
            {
                walletContainsUtilityToken = true;
                break;
            }
        }
    }
    

    Finally, if these lists are large you could significantly improve performance by pre-arranging them into data structures for faster lookup (ie: a Dictionary, or even something that would support a binary search). But this is only a win if the lists are large enough.