MarkRowsForDeletion
(
ListObject oEdgeTable,
Object [,] aoVertex1NameValues,
Object [,] aoVertex2NameValues,
Object [,] aoThirdColumnValues,
Boolean bGraphIsDirected,
out ListColumn oDeleteIfEmptyColumn,
out Range oDeleteIfEmptyData,
out Object [,] aoDeleteIfEmptyValues
)
{
Debug.Assert(oEdgeTable != null);
Debug.Assert(aoVertex1NameValues != null);
Debug.Assert(aoVertex2NameValues != null);
AssertValid();
HashSet<String> oUniqueEdgeKeys = new HashSet<String>();
if ( !ExcelTableUtil.TryGetOrAddTableColumn(oEdgeTable,
DeleteIfEmptyColumnName, ExcelTableUtil.AutoColumnWidth, null,
out oDeleteIfEmptyColumn, out oDeleteIfEmptyData,
out aoDeleteIfEmptyValues) )
{
throw new InvalidOperationException(
"Can't add marked for deletion column.");
}
Int32 iRows = GetRowCount(aoVertex1NameValues);
for (Int32 iRowOneBased = 1; iRowOneBased <= iRows; iRowOneBased++)
{
String sEdgeKey;
Object oDeleteIfEmpty = 1;
if (
TryGetEdgeKey(iRowOneBased, aoVertex1NameValues,
aoVertex2NameValues, aoThirdColumnValues, bGraphIsDirected,
out sEdgeKey)
&&
!oUniqueEdgeKeys.Add(sEdgeKey)
)
{
// This is a duplicate that is not the first instance. It
// should be deleted.
oDeleteIfEmpty = null;
}
aoDeleteIfEmptyValues[iRowOneBased, 1] = oDeleteIfEmpty;
}
oDeleteIfEmptyData.set_Value(Missing.Value, aoDeleteIfEmptyValues);
}