public IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolidator, Func <int, bool> needCol, int n, IRandom rand = null)
        {
            var cur = GetRowCursor(needCol, rand);

            consolidator = new Consolidator();
            if (n >= 2)
            {
                var setColumns = new HashSet <int>(_columns);
                var res        = new IRowCursor[n];
                var empty      = new EmptyCursor(this,
                                                 col => setColumns.Contains(col) || needCol(col) || (_otherValues != null && _otherValues.IsColumnActive(col)));
                for (int i = 0; i < n; ++i)
                {
                    res[i] = i == 0 ? cur : empty;
                }
                return(res);
            }
            else
            {
                return new IRowCursor[] { cur }
            };
        }
        public IRowCursor[] GetRowCursorSet(out IRowCursorConsolidator consolidator, Func <int, bool> needCol, int n, IRandom rand = null)
        {
            var cur = GetRowCursor(needCol, rand);

            consolidator = new Consolidator();
            if (n >= 2)
            {
                // This trick avoids the cursor to be split into multiple later.
                var res   = new IRowCursor[n];
                var empty = new EmptyCursor(this,
                                            col => col == _column || needCol(col) ||
                                            (_otherValues != null && _otherValues.IsColumnActive(col)));
                for (int i = 0; i < n; ++i)
                {
                    res[i] = i == 0 ? cur : empty;
                }
                return(res);
            }
            else
            {
                return new IRowCursor[] { cur }
            };
        }