Search code examples
c#linqlinq-to-entities

having trouble performing LINQ's ThenBy inside a loop


I feel like there is some silly syntax error going on here but I can't for the life of me figure it out. I am trying to sort a big list using multiple properties.

Method A:

IOrderedEnumerable<myClass> orderedList = myList.OrderByDescending(e => e.Tier);

orderedList = orderedList.ThenByDescending(e => e.Priority[0].Value);
orderedList = orderedList.ThenByDescending(e => e.Priority[1].Value);
orderedList = orderedList.ThenByDescending(e => e.Priority[2].Value);

orderedList = orderedList.ThenByDescending(e => e.Score);

Method B:

IOrderedEnumerable<myClass> orderedList = myList.OrderByDescending(e => e.Tier);

for (int i = 0; i < 3; i++)
{
    orderedList = orderedList.ThenByDescending(e => e.Priority[i].Value);
}

orderedList = orderedList.ThenByDescending(e => e.Score);

The above Method A works perfectly, but Method B (the way I need to do it) keeps returning an index out of range error, even though it should be the exact same (i.e. 0, 1, 2)

In both instances e.Priority represents a list of 3 KeyValuePairs. I don't understand why Method B is returning an out of range error.


Solution

  • Heh, classic problem of loops here. Correct way to do it:

    IOrderedEnumerable<myClass> orderedList = myList.OrderByDescending(e => e.Tier);
    
    for (int i = 0; i < 3; i++)
    {
        int capturedIndex = i;
        orderedList = orderedList.ThenByDescending(e => e.Priority[capturedIndex].Value);
    }
    
    orderedList = orderedList.ThenByDescending(e => e.Score);
    

    More here: Captured variable in a loop in C#