Profiling shows MoveNext takes most time, which I guess is true as it is lazy. But I don't know in what direction I could improve the code. (Open pic in new tab would allow u see bigger chart.)    IEnumerable<string> MixedBlock(List<string> reelLayout, string thisBlock, int length)    {        List<string> recentBlock = RecentBlock(length - 1, reelLayout);        var upper = Enumerable.Range(1, length - 1);        var lower = Enumerable.Range(1, totalWeight[thisBlock].Num);        var query = from x in upper                    from y in lower                    where x + y == length                    select Tuple.Create(x, y);        foreach (var t in query)        {            string upperBlock = string.Join(,, recentBlock.Skip(length - 1 - t.Item1));            string lowerBlock = string.Join(,, thisBlock.Split(',').Take(t.Item2));            yield return upperBlock + , + lowerBlock;        }    }
plz help optimize the small code snippet, VS2010 profiling chart provided
c#