Ho bisogno di scrivere qualcosa che chiamo Contenitore di aggregazione, che memorizza Aggregazioni, che sono essenzialmente Azioni che accettano una raccolta di oggetti e producono un singolo oggetto come risultato. Esempi di aggregazioni sarebbero: Media aritmetica, mediana di un insieme di numeri, media armonica ecc. Ecco un codice di esempio.Aggregazione e come verificare se è possibile sommare gli oggetti
var arithmeticMean = new Aggregation
{
Descriptor = new AggregationDescriptor { Name = "Arithmetic Mean" },
Action = (IEnumerable arg) =>
{
double count = 0;
double sum = 0;
foreach (var item in arg)
{
sum += (double)item;
count++;
}
return sum/count;
}
};
Ecco il mio problema con il codice. Ho assunto che gli oggetti fossero solo il doppio e quindi hanno fatto una conversione. Cosa succede se non sono il doppio? Come posso assicurarmi che mi sia consentito sommare due oggetti? Esiste una sorta di interfaccia per questo negli assiemi .Net standard? Ho bisogno di qualcosa come ISummable ... O ho bisogno di implementarlo da solo (quindi dovrò avvolgere tutti i tipi primitivi come double, int, eccetera per supportarlo).
Qualsiasi consiglio relativo alla progettazione di tale funzionalità sarà utile.
Il problema non è che si è necessario determinare se una raccolta è "sommabile". Tutti i valori numerici sono intrinsecamente sommabili. La domanda che dovresti porre è invece "Is 'arg? Una raccolta di numeri?". Puoi provare a fornire variazioni fortemente tipizzate di 'Action' per diversi tipi numerici, o cast di esecuzione su' arg'. – Jon
Jon, grazie per la risposta. Lo so, gli esempi che ho dato sono tutti numerici ... Ma mi piacerebbe davvero scrivere qualcosa di più generico e utile. Non mi piacerebbe scrivere un sacco di cast di esecuzione lì, ma suggerisco che un insieme di Azioni con diversi tipi di argomenti funzionerebbe qui ... –
Dai un'occhiata a Metodi Enumerabili - ha set di metodi generici parametrizzati con ogni tipo supporta: 'Sum, Sum , Sum , Sum >' ecc. Questo è l'unico modo per rendere il parametro di tipo "sommabile" –