2010-01-25 5 views
1

(j'utilise C#, mais ce n'est pas nécessairement spécifique à la plateforme)de mettre à jour une valeur agrégée lorsqu'un élément change

Dire que j'ai une table de valeurs, qui sont indexées par un triplet de clés (A, B, C). Les valeurs de la table transitent depuis une source externe à intervalles sporadiques. Je souhaite publier des agrégats sur divers ensembles de clés, par ex. calculer une somme sur toutes les valeurs où B = b1.

Cela est trivial à faire si je ne fais que répéter l'opération sur toute la table à chaque fois, mais évidemment ce n'est pas efficace. Ce que je me demande est, y at-il une manière particulièrement bonne de concevoir une telle chose de sorte que je mette à jour seulement sum(B = b1) quand une valeur dans la table change qui affecterait cette somme? Il semble que je devrais créer une sorte d'objet Aggregation qui conserve une liste de toutes les valeurs incluses dans cette agrégation, mais je pense qu'il pourrait y avoir une manière plus élégante de m'échapper. Quelque chose comme une requête LINQ "temps réel" ...

+0

S'il vous plaît poster un exemple de code pour nous de commencer ... –

Répondre

0

Eh bien, pour l'exemple simple que vous avez présenté, pourquoi ne pas avoir un événement, par exemple, OnValueChanging qui signale la valeur qui est sur le point de changer? Vous pouvez ensuite enregistrer la valeur actuelle, par exemple, x. Ensuite, déclenchez un autre événement OnValueChanged et enregistrez la nouvelle valeur, par exemple, y. Ensuite, la somme que vous souhaitez mettre à jour est currentSum - x + y.

+0

qui fonctionnerait, mais les valeurs venez une autre machine. Je suppose que le message envoyé pourrait inclure à la fois la nouvelle valeur et l'ancienne valeur, je n'y avais pas pensé. – toasteroven

1

Utilisez un Dictionary<TypeOfB, int>. Chaque fois que vous ajoutez un nouveau b, faire

dictionary[b] += value; 

Si un changement de valeur, faire

dictionary[b] += (newValue - oldValue) 
+0

Vous avez indiqué ci-dessous que la machine envoie uniquement la nouvelle valeur. J'avais l'impression qu'il envoyait quatre choses: '(a, b, c)' et 'value', afin que vous puissiez garder une trace de l'ancienne valeur à la réception. Sinon, si la nouvelle valeur n'est réellement nécessaire pour rien du côté réception, vous pouvez simplement envoyer '(newValue - oldValue)' (et 'b', bien sûr) pour mettre à jour la somme. –

Questions connexes