AddRows
        (
            GroupInfo [] oGroups,
            IList <IntergroupEdgeInfo> oIntergroupEdges
        )
        {
            Debug.Assert(oGroups != null);
            Debug.Assert(oIntergroupEdges != null);
            AssertValid();

            GroupEdgeRows oGroupEdgeRows = new GroupEdgeRows();

            foreach (IntergroupEdgeInfo oIntergroupEdge in oIntergroupEdges)
            {
                AddRow(oGroups[oIntergroupEdge.Group1Index].Name,
                       oGroups[oIntergroupEdge.Group2Index].Name,
                       oIntergroupEdge.Edges, oGroupEdgeRows);
            }

            return(oGroupEdgeRows);
        }
        CreateGraphMetricColumns
        (
            GroupEdgeRows oGroupEdgeRows
        )
        {
            Debug.Assert(oGroupEdgeRows != null);
            AssertValid();

            return(new GraphMetricColumn[] {
                CreateGraphMetricColumnOrdered(
                    GroupEdgeTableColumnNames.Group1Name, CellStyleNames.Required,
                    oGroupEdgeRows.Group1Names),

                CreateGraphMetricColumnOrdered(
                    GroupEdgeTableColumnNames.Group2Name, CellStyleNames.Required,
                    oGroupEdgeRows.Group2Names),

                CreateGraphMetricColumnOrdered(
                    GroupEdgeTableColumnNames.Edges, CellStyleNames.GraphMetricGood,
                    oGroupEdgeRows.Edges),
            });
        }
        AddRow
        (
            String sGroup1Name,
            String sGroup2Name,
            Int32 iEdges,
            GroupEdgeRows oGroupEdgeRows
        )
        {
            Debug.Assert(!String.IsNullOrEmpty(sGroup1Name));
            Debug.Assert(!String.IsNullOrEmpty(sGroup2Name));
            Debug.Assert(iEdges >= 0);
            Debug.Assert(oGroupEdgeRows != null);
            AssertValid();

            oGroupEdgeRows.Group1Names.Add(new GraphMetricValueOrdered(
                                               sGroup1Name));

            oGroupEdgeRows.Group2Names.Add(new GraphMetricValueOrdered(
                                               sGroup2Name));

            oGroupEdgeRows.Edges.Add(new GraphMetricValueOrdered(iEdges));
        }
    CreateGraphMetricColumns
    (
        GroupEdgeRows oGroupEdgeRows
    )
    {
        Debug.Assert(oGroupEdgeRows != null);
        AssertValid();

        return ( new GraphMetricColumn[] {

            CreateGraphMetricColumnOrdered(
                GroupEdgeTableColumnNames.Group1Name, CellStyleNames.Required,
                oGroupEdgeRows.Group1Names),

            CreateGraphMetricColumnOrdered(
                GroupEdgeTableColumnNames.Group2Name, CellStyleNames.Required,
                oGroupEdgeRows.Group2Names),

            CreateGraphMetricColumnOrdered(
                GroupEdgeTableColumnNames.Edges, CellStyleNames.GraphMetricGood,
                oGroupEdgeRows.Edges),
            } );
    }
    AddRow
    (
        String sGroup1Name,
        String sGroup2Name,
        Int32 iEdges,
        GroupEdgeRows oGroupEdgeRows
    )
    {
        Debug.Assert( !String.IsNullOrEmpty(sGroup1Name) );
        Debug.Assert( !String.IsNullOrEmpty(sGroup2Name) );
        Debug.Assert(iEdges >= 0);
        Debug.Assert(oGroupEdgeRows != null);
        AssertValid();

        oGroupEdgeRows.Group1Names.Add( new GraphMetricValueOrdered(
            sGroup1Name) );

        oGroupEdgeRows.Group2Names.Add( new GraphMetricValueOrdered(
            sGroup2Name) );

        oGroupEdgeRows.Edges.Add( new GraphMetricValueOrdered(iEdges) );
    }
    AddRows
    (
        GroupInfo [] oGroups,
        IList<IntergroupEdgeInfo> oIntergroupEdges
    )
    {
        Debug.Assert(oGroups != null);
        Debug.Assert(oIntergroupEdges != null);
        AssertValid();

        GroupEdgeRows oGroupEdgeRows = new GroupEdgeRows();

        foreach (IntergroupEdgeInfo oIntergroupEdge in oIntergroupEdges)
        {
            AddRow(oGroups[oIntergroupEdge.Group1Index].Name,
                oGroups[oIntergroupEdge.Group2Index].Name,
                oIntergroupEdge.Edges, oGroupEdgeRows);
        }

        return (oGroupEdgeRows);
    }