алгоритм обновления агрегированного значения при изменении элемента - PullRequest
1 голос
/ 25 января 2010

(я использую C #, но это не обязательно зависит от платформы)

Скажем, у меня есть таблица значений, которые индексируются тройкой ключей (A, B, C). Значения в таблице поступают из внешнего источника с единичными интервалами. Я хочу публиковать агрегаты по различным наборам ключей, например, рассчитать сумму по всем значениям, где B = b1.

Это тривиально, если я просто перебираю всю таблицу каждый раз, но, очевидно, это неэффективно. Что меня интересует, так это то, что есть ли особенно хороший способ создать такую ​​вещь, чтобы я обновлял sum(B = b1) только тогда, когда значение в таблице изменяется, что повлияет на эту сумму? Кажется, мне нужно было бы создать какой-то объект Aggregation, который бы содержал список всех значений, включенных в эту агрегацию, но я чувствую, что может быть более элегантный способ избежать меня. Что-то вроде запроса LINQ "в реальном времени" ...

Ответы [ 2 ]

1 голос
/ 25 января 2010

Используйте Dictionary<TypeOfB, int>. Каждый раз, когда вы добавляете новый b, делайте

dictionary[b] += value;

Если значение изменяется, выполните

dictionary[b] += (newValue - oldValue)
0 голосов
/ 25 января 2010

Что ж, для простого примера, который вы представили, почему бы не иметь событие, скажем, OnValueChanging, которое сигнализирует о значении, которое должно измениться? Затем вы можете записать текущее значение, скажем, x. Затем запустите другое событие OnValueChanged и запишите новое значение, скажем, y. Тогда сумма, которую вы хотите обновить, равна currentSum - x + y.

...