public int CompareTo(AlleleBlock other) { // first sort ascending by start point of the blocks int positionCompare = PositionIndex.CompareTo(other.PositionIndex); if (positionCompare != 0) { return(positionCompare); } // then sort descending by end point of the blocks int sizeCompare = AlleleIndexes.Length.CompareTo(other.AlleleIndexes.Length); if (sizeCompare != 0) { return(-sizeCompare); } // then sort ascending by start point of the blocks w/ trimmed ref position considered int numRefPosBeforeCompare = NumRefPositionsBefore.CompareTo(other.NumRefPositionsBefore); if (numRefPosBeforeCompare != 0) { return(numRefPosBeforeCompare); } // then sort descending by end point of the blocks w/ trimmed ref position considered int numRefPosAfterCompare = NumRefPositionsAfter.CompareTo(other.NumRefPositionsAfter); if (numRefPosAfterCompare != 0) { return(-numRefPosAfterCompare); } // then sort ascending by each allele index for (int i = 0; i < AlleleIndexes.Length; i++) { int alleleCompare = AlleleIndexes[i].CompareTo(other.AlleleIndexes[i]); if (alleleCompare != 0) { return(alleleCompare); } } return(0); }