private ForStatementSyntax CollectionIndexLoop(
            string comparisonKindKey,
            ExpressionSyntax left,
            ExpressionSyntax right)
        {
            // The name of the index variable used in the loop over elements.
            string indexVarName = _localVariableNameGenerator.GetNextLoopIndexVariableName();

            // The two elements that will be compared each time through the loop.
            ExpressionSyntax leftElement =
                SyntaxFactory.ElementAccessExpression(
                    left,
                    SyntaxHelper.BracketedArgumentList(
                        SyntaxFactory.IdentifierName(indexVarName)));

            ExpressionSyntax rightElement =
                SyntaxFactory.ElementAccessExpression(
                    right,
                    SyntaxHelper.BracketedArgumentList(
                        SyntaxFactory.IdentifierName(indexVarName)));

            // From the type of the element (primitive, object, list, or dictionary), create
            // the appropriate comparison, for example, "a == b", or "Object.Equals(a, b)".
            string elmentComparisonTypeKey = PropertyInfoDictionary.MakeElementKeyName(comparisonKindKey);

            StatementSyntax comparisonStatement = GeneratePropertyComparison(elmentComparisonTypeKey, leftElement, rightElement);

            return(SyntaxFactory.ForStatement(
                       SyntaxFactory.VariableDeclaration(
                           SyntaxFactory.ParseTypeName(WellKnownTypeNames.Int),
                           SyntaxFactory.SingletonSeparatedList(
                               SyntaxFactory.VariableDeclarator(
                                   SyntaxFactory.Identifier(indexVarName),
                                   default(BracketedArgumentListSyntax),
                                   SyntaxFactory.EqualsValueClause(
                                       SyntaxFactory.LiteralExpression(
                                           SyntaxKind.NumericLiteralExpression,
                                           SyntaxFactory.Literal(0)))))),
                       SyntaxFactory.SeparatedList <ExpressionSyntax>(),
                       SyntaxFactory.BinaryExpression(
                           SyntaxKind.LessThanExpression,
                           SyntaxFactory.IdentifierName(indexVarName),
                           SyntaxFactory.MemberAccessExpression(
                               SyntaxKind.SimpleMemberAccessExpression,
                               left,
                               SyntaxFactory.IdentifierName(CountPropertyName))),
                       SyntaxFactory.SingletonSeparatedList <ExpressionSyntax>(
                           SyntaxFactory.PrefixUnaryExpression(
                               SyntaxKind.PreIncrementExpression,
                               SyntaxFactory.IdentifierName(indexVarName))),
                       SyntaxFactory.Block(comparisonStatement)));
        }