2013-04-15 8 views
5

Sto sviluppando un software che acquisisce dati in tempo reale ed estrae una serie di funzioni da quelle che dipendono dall'input dell'utente. Ogni funzione disponibile è costituito da un metodo che accetta un array di doppie e restituire la funzione desiderata, come questo per il MeanAbsoluteValue:Dichiarare le classi statiche in modo che possano essere memorizzate all'interno dell'elenco

public static class MeanAbsoluteValue{ 
    public static double Calculate(double[] data){ 
     return data.Sum(s => Math.Abs(s))/data.Length; 
    } 
} 

Dal momento che ciascuna delle caratteristiche ha solo il metodo di una Calcolare stavo pensando di provare per riscriverli in modo che possano essere raccolti e scelti da quella Collezione.

Ho provato a scrivere un'interfaccia per loro, ma poiché sono statici questo non era permesso.

C'è un modo per farlo? E se sì, potresti indicarmi la direzione giusta?

+0

Non sarà in grado di sfruttare il polimorfismo usando classi statiche. – code4life

+0

Non puoi usare lambda o delegati? – Rik

+0

Non sono sicuro di una classe astratta che abbia un metodo statico, so che puoi costringerli a implementare, ma se la logica implementata possiamo usarla. – Devesh

risposta

8

È possibile creare un array di delegati costruiti dalle Calculate metodi di queste classi, come questo:

Func<double[],double>[] array = new Func<double[],double>[] { 
    MeanAbsoluteValue.Calculate 
, MeanValue.Calculate 
, Deviation.Calculate 
// ...and so on 
}; 

Ecco un demo on ideone.

+0

Funzionando perfettamente, grazie! – Sander

0

Basta avere una collezione di Funz ... delegati

var list = new List<Func<double[], double>(MeanAbsoluteValue.Calculate, Average.Calculate) 
var accum = 0; 
foreach(var func in list) 
{ 
    accum += func(new [] {1,3,4,}); 
} 
2

Conservare alle funzioni in un dizionario, e li Look Up di nome

var methods = new Dictionary<string, Func<double[], double>>(); 
methods.Add("MeanAbsoluteValue", MeanAbsoluteValue.Calculate); 

... 
public double DoFunc(string name, double [] args) 
{ 
    var func = methods[name]; 
    return func(args); 
} 
Problemi correlati