public static Rectangle?TryUnion(this Rectangle r1, params Rectangle[] rs) { var tmp = rs.ToList(); Rectangle result = r1; while (tmp.Count > 0) { bool foundAdjacent = false; for (int i = 0; i < tmp.Count; ++i) { var r2 = tmp[i]; if (result.AdjacentTo(r2)) { result = Rectangle.Union(result, r2); tmp.RemoveAt(i); foundAdjacent = true; break; } } if (!foundAdjacent) { return(null); } } return(result); }