title: Is there an efficient .NET collection for fast retrieval operations based on two dimensions ranges?
body: <p>I'm looking for a fast and efficient .NET collection (if any). My purpose is to perform for fast range based retrieval operations but that still manage to be not that slow regarding insertions and deletions (I know this is usually the tradeoff about the retrieval efficiency and modifications over collections). To make it short, let's say that retrieval operations efficiency still matter a bit more than the modifications one.</p>
  
  <p>The background is that I'm designing a Canvas using winforms, to make it simple say that I'm just "painting" shapes on it:</p>
  
  <p><a href="https://i.stack.imgur.com/9H3NA.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9H3NA.png" alt="enter image description here"></a></p>
  
  <p>To make the approach a bit simpler, let's consider that no matter how the shape is or looks like, we just are going to consider the bounding box around it defined with a Client Rectangle.</p>
  
  <p>Anyway, say now I'm clicking on an item on my Control (so displayed in the Canvas View) which displays potentially (accordingly to the ZoomValue) only a partial collection of the all the items contains in the Canvas, how to know quickly which item has been clicked?</p>
  
  <p>Each item has its own BoundingBox property (so X, Y, Width &amp; Height) and the Z-order. 
  But here it's different we basically have the coordinates of the mouse converted into Canvas View coordinates (accordingly to the zoom factor), and based on it I'm wondering how to avoid a full and lengthy search among the View Items (by the way this question also involves the redistribution of the items when the View is changing).</p>
  
  <p>In case of hundred items it's still fine now I'm thinking about the situation where there is like thousands of arrows on screen (which is a number far more bigger than the one given for the window handle controls and that is why I am designing my own canvas).</p>
  
  <p>I looked at some SPT strategies including the OmniTree data structure which may be the data-structure that is the most suitable to my situation but still, I'm doubting a bit about the modifications than can be pretty slow: <a href="http://www.codeproject.com/Articles/794171/Omni-Tree-Data-Structure-in-Csharp" rel="nofollow noreferrer">http://www.codeproject.com/Articles/794171/Omni-Tree-Data-Structure-in-Csharp</a></p>
  
  <p>Anyone who would have already got the same sort of requirements?</p>