| 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; |
| } |
| } |
| } |