NReco.PivotData.TopPivotTable Взять последнее N вместо первого N - PullRequest
0 голосов
/ 19 сентября 2019

Взятие первого N числа строк довольно просто и хорошо работает с

var topPvtTbl = new TopPivotTable(runningPvtTbl, 3, 99);
                                topPvtTbl.IncludeOtherGroups = false;

Есть ли обратное?Мой пример использования заключается в том, что данные возвращают даты в строках в порядке возрастания, и вместо трех первых дат мне нужны последние три даты.Я не вижу опцию BottomPivotTable.

1 Ответ

0 голосов
/ 20 сентября 2019

Вы можете достичь желаемого следующим образом:

  • настроить базовый PivotTable класс для оси заказов с датами в обратном порядке (по убыванию)
  • применить оболочку TopPivotTable квыберите только первые 3 даты (= так, чтобы они фактически были последними 3 днями)
  • ключи обратной оси с Array.Reverse.Например, если даты представляют собой столбцы: Array.Reverse(topPvtTbl.ColumnKeys);

- обновление -

Этот подход не будет работать, если базовый расчет, связанный с таблицей, основан на порядке конкретной оси (например,RunningValuePivotTable).Кроме того, вы можете реализовать свою собственную IPivotTable оболочку, которая принимает последние N элементов.Например:

public class LastNColumnsPivotTable : IPivotTable {
  IPivotTable basePvtTbl;

  public LastNColumnsPivotTable(IPivotTable pvtTbl, int lastN) {
    basePvtTbl = pvtTbl;
    if (basePvtTbl.ColumnKeys.Length>lastN) {
      lastColumnKeys = basePvtTbl.ColumnKeys.Skip(basePvtTbl.ColumnKeys.Length - lastN).ToArray();
    } else {
      lastColumnKeys = basePvtTbl.ColumnKeys;
    }
  }

  public string[] Columns { get { return basePvtTbl.Columns; } }
  public string[] Rows { get { return basePvtTbl.Rows; } }

  ValueKey[] lastColumnKeys;
  public ValueKey[] ColumnKeys { get { return lastColumnKeys; } }

  public ValueKey[] RowKeys { get { return basePvtTbl.RowKeys; } }
  public IPivotData PivotData { get { return basePvtTbl.PivotData; } }

  public IAggregator GetValue(ValueKey rowKey, ValueKey colKey) {
    return basePvtTbl.GetValue(rowKey, colKey);
  }
}
...