| using System.Linq; | |
| namespace AppsheetEpplus; | |
| 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; | |
| } | |
| } |