| using System; | 
 | using System.Collections.Generic; | 
 | using System.Linq; | 
 | using System.Text; | 
 | using OfficeOpenXml.FormulaParsing.Exceptions; | 
 | using OfficeOpenXml.FormulaParsing.Utilities; | 
 |  | 
 | namespace OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup | 
 | { | 
 |     public class ArrayLookupNavigator : LookupNavigator | 
 |     { | 
 |         private readonly FunctionArgument[] _arrayData; | 
 |         private int _index = 0; | 
 |         private object _currentValue; | 
 |   | 
 |         public ArrayLookupNavigator(LookupDirection direction, LookupArguments arguments, ParsingContext parsingContext) | 
 |             : base(direction, arguments, parsingContext) | 
 |         { | 
 |             Require.That(arguments).Named("arguments").IsNotNull(); | 
 |             Require.That(arguments.DataArray).Named("arguments.DataArray").IsNotNull(); | 
 |             _arrayData = arguments.DataArray.ToArray(); | 
 |             Initialize(); | 
 |         } | 
 |  | 
 |         private void Initialize() | 
 |         { | 
 |             if (Arguments.LookupIndex >= _arrayData.Length) | 
 |             { | 
 |                 throw new ExcelErrorValueException(eErrorType.Ref); | 
 |             } | 
 |             SetCurrentValue(); | 
 |  | 
 |         } | 
 |  | 
 |         public override int Index | 
 |         { | 
 |             get { return _index; } | 
 |         } | 
 |  | 
 |         private void SetCurrentValue() | 
 |         { | 
 |             _currentValue = _arrayData[_index]; | 
 |         } | 
 |  | 
 |         private bool HasNext() | 
 |         { | 
 |             if (Direction == LookupDirection.Vertical) | 
 |             { | 
 |                 return _index < (_arrayData.Length - 1); | 
 |             } | 
 |             else | 
 |             { | 
 |                 return false; | 
 |             } | 
 |         } | 
 |  | 
 |         public override bool MoveNext() | 
 |         { | 
 |             if (!HasNext()) return false; | 
 |             if (Direction == LookupDirection.Vertical) | 
 |             { | 
 |                 _index++; | 
 |             } | 
 |             SetCurrentValue(); | 
 |             return true; | 
 |         } | 
 |  | 
 |         public override object CurrentValue | 
 |         { | 
 |             get { return _arrayData[_index].Value; } | 
 |         } | 
 |  | 
 |         public override object GetLookupValue() | 
 |         { | 
 |             return _arrayData[_index].Value; | 
 |         } | 
 |     } | 
 | } |