public int[] SwapTwoRange(int[] genes, GeneRange range1, GeneRange range2) { if (range2.Position < range1.Position) { var r = range2; range2 = range1; range1 = r; } if (range2.Position < range1.Position + range1.Length) { if (range1.IsDisjointWith(range2)) { var error = true; } throw new ArgumentException("Gene ranges are overlapped!"); } var temp = new int[genes.Length]; var range1EndPosition = range1.Position + range1.Length; var range2EndPosition = range2.Position + range2.Length; var middleLength = range2.Position - range1EndPosition; if (range1.Position > 0) { Array.Copy(genes, 0, temp, 0, range1.Position); } Array.Copy(genes, range2.Position, temp, range1.Position, range2.Length); if (middleLength > 0) { Array.Copy(genes, range1EndPosition, temp, range1.Position + range2.Length, middleLength); } Array.Copy(genes, range1.Position, temp, range2EndPosition - range1.Length, range1.Length); if (range2EndPosition < genes.Length) { Array.Copy(genes, range2EndPosition, temp, range2EndPosition, genes.Length - range2EndPosition); } return(temp); }