protected override void EndProcessing()
 {
     while (_lastItemsQueue.Count > 0)
     {
         PartitionObject obj = _lastItemsQueue.Dequeue();
         LastItemMatchImpl(obj.Item);
     }
 }
        protected override void ProcessRecord()
        {
            if (_curObjIndex < _firstNItems)
            {
                FirstItemMatchImpl(_inputObject);
            }
            else if (_lastNItems > 0)
            {
                if (_lastItemsQueue.Count == _lastNItems)
                {
                    PartitionObject obj = _lastItemsQueue.Dequeue();
                    if (IsSelectedIndexMatch(obj.Index))
                    {
                        SelectedIndexMatchImpl(obj.Item);
                    }
                    else
                    {
                        NonSelectedItemImpl(obj.Item);
                    }
                }
                _lastItemsQueue.Enqueue(new PartitionObject(_curObjIndex, _inputObject));
            }
            else
            {
                if (IsSelectedIndexMatch(_curObjIndex))
                {
                    SelectedIndexMatchImpl(_inputObject);
                }
                else
                {
                    NonSelectedItemImpl(_inputObject);
                }
            }

            _curObjIndex++;
        }