Improve performance of reading array values
diff --git a/EPPlus/CellStore.cs b/EPPlus/CellStore.cs
index a3c8598..d977a96 100644
--- a/EPPlus/CellStore.cs
+++ b/EPPlus/CellStore.cs
@@ -68,7 +68,7 @@
         {
             var page = (short)(Row >> CellStore<int>.pageBits);
             _searchIx.Index = page;
-            var res = Array.BinarySearch(_pages, 0, PageCount, _searchIx);
+            var res = (_pages[page].Index == page) ? page : Array.BinarySearch(_pages, 0, PageCount, _searchIx);
             if (res >= 0)
             {
                 GetPage(Row, ref res);
@@ -263,7 +263,7 @@
         internal int GetPosition(int offset)
         {
             _searchIx.Index = (short)offset;
-            return Array.BinarySearch(Rows, 0, RowCount, _searchIx);
+            return (Rows[offset-1].Index == offset) ? offset-1 : Array.BinarySearch(Rows, 0, RowCount, _searchIx);
         }
         internal int GetNextRow(int row)
         {
@@ -355,7 +355,7 @@
         internal int GetPosition(int Column)
         {
             _searchIx.Index = (short)Column;
-            return Array.BinarySearch(_columnIndex, 0, ColumnCount, _searchIx);
+            return (_columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, _searchIx);
         }
         internal CellStore<T> Clone()
         {
@@ -568,7 +568,7 @@
                     }
                     short ix = (short)(Row - pageItem.IndexOffset);
                     _searchIx.Index = ix;
-                    var cellPos = Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
+                    var cellPos = (pageItem.Rows[ix-1].Index == ix) ? ix-1 : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
                     if (cellPos >= 0)
                     {
                         return pageItem.Rows[cellPos].IndexPointer;
@@ -609,7 +609,7 @@
         {
             lock (_columnIndex)
             {
-                var col = Array.BinarySearch(_columnIndex, 0, ColumnCount, new IndexBase() { Index = (short)(Column) });
+                var col = (_columnIndex[Column-1].Index == Column) ? Column-1 : Array.BinarySearch(_columnIndex, 0, ColumnCount, new IndexBase() { Index = (short)(Column) });
                 var page = (short)(Row >> pageBits);
                 if (col >= 0)
                 {
@@ -645,7 +645,7 @@
 
                     short ix = (short)(Row - ((pageItem.Index << pageBits) + pageItem.Offset));
                     _searchIx.Index = ix;
-                    var cellPos = Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
+                    var cellPos = (pageItem.Rows[ix].Index == ix) ? ix : Array.BinarySearch(pageItem.Rows, 0, pageItem.RowCount, _searchIx);
                     if (cellPos < 0)
                     {
                         cellPos = ~cellPos;