You should either synchronize access to the list which you are iterating over using a lock
or a concurrent collection of some sort or make a copy of the collection before doing the check for intersection.
You can check for intersection by using Rect.Intersect?
Here's an example (copied from msdn)
private Rect intersectExample2()
{
// Initialize new rectangle.
Rect myRectangle = new Rect();
// The Location property specifies the coordinates of the upper left-hand
// corner of the rectangle.
myRectangle.Location = new Point(10, 5);
// Set the Size property of the rectangle with a width of 200
// and a height of 50.
myRectangle.Size = new Size(200, 50);
// Create second rectangle to compare to the first.
Rect myRectangle2 = new Rect();
myRectangle2.Location = new Point(0, 0);
myRectangle2.Size = new Size(200, 50);
// Intersect method finds the intersection between the specified rectangles and
// returns the result as a Rect. If there is no intersection then the Empty Rect
// is returned. resultRectangle has a size of 190,45 and location of 10,5.
Rect resultRectangle = Rect.Intersect(myRectangle, myRectangle2);
return resultRectangle;
}
Here's some code which checks if ALL multiple rectangles intersect.
bool CheckIfAllIntersect(IEnumerable<Rect> rectangles)
{
return rectangles.Aggregate(rectangles.FirstOrDefault(), Rect.Intersect) != Rect.Empty;
}
If you would like ANY rectangle to intersect, you can use the following
bool CheckIfAnyInteresect(IEnumerable<Rect> rectangles)
{
return rectangles.Any(rect => rectangles.Where(r => !r.Equals(rect)).Any(r => r.IntersectsWith(rect)));
}