|  | using System.Linq; | 
|  | 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; | 
|  | 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 => _index; | 
|  |  | 
|  | private void SetCurrentValue() { | 
|  | _currentValue = _arrayData[_index]; | 
|  | } | 
|  |  | 
|  | private bool HasNext() { | 
|  | if (Direction == LookupDirection.Vertical) { | 
|  | return _index < (_arrayData.Length - 1); | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | public override bool MoveNext() { | 
|  | if (!HasNext()) { | 
|  | return false; | 
|  | } | 
|  | if (Direction == LookupDirection.Vertical) { | 
|  | _index++; | 
|  | } | 
|  | SetCurrentValue(); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | public override object CurrentValue => _arrayData[_index].Value; | 
|  |  | 
|  | public override object GetLookupValue() { | 
|  | return _arrayData[_index].Value; | 
|  | } | 
|  | } |