DeleteDuplicateEdges ( ListObject oEdgeTable, Object [,] aoVertex1NameValues, Object [,] aoVertex2NameValues, Object [,] aoThirdColumnValues, Boolean bGraphIsDirected ) { Debug.Assert(oEdgeTable != null); Debug.Assert(aoVertex1NameValues != null); Debug.Assert(aoVertex2NameValues != null); AssertValid(); // Deleting rows one by one is way too slow. Instead, start by adding // a temporary column that has an empty cell for each row that should // be deleted. ListColumn oDeleteIfEmptyColumn; Range oDeleteIfEmptyData; Object [,] aoDeleteIfEmptyValues; MarkRowsForDeletion(oEdgeTable, aoVertex1NameValues, aoVertex2NameValues, aoThirdColumnValues, bGraphIsDirected, out oDeleteIfEmptyColumn, out oDeleteIfEmptyData, out aoDeleteIfEmptyValues); // The edge table will be sorted on the "delete if empty" column so // that all edges that need to be deleted are contiguous. But first, // add another temporary column and set its values to the worksheet // row numbers. This will be used later to restore the original sort // order. ListColumn oOriginalSortOrderColumn; if (!ExcelTableUtil.TryAddTableColumnWithRowNumbers(oEdgeTable, OriginalSortOrderColumnName, ExcelTableUtil.AutoColumnWidth, null, out oOriginalSortOrderColumn)) { throw new InvalidOperationException( "Can't add temporary sort column."); } SortEdgeTable(oEdgeTable, oDeleteIfEmptyData); DeleteMarkedRows(oEdgeTable, oDeleteIfEmptyData, aoDeleteIfEmptyValues); // Restore the original sort order. SortEdgeTable(oEdgeTable, oOriginalSortOrderColumn.Range); oOriginalSortOrderColumn.Delete(); oDeleteIfEmptyColumn.Delete(); // The (deleted) original sort order column is now selected. Select // something more sensible. oEdgeTable.HeaderRowRange.Select(); }