2013-04-15 15 views
5

Pracuję nad oprogramowaniem, które pobiera dane w czasie rzeczywistym i wydobywa z nich szereg funkcji w zależności od danych wprowadzanych przez użytkownika. Każda dostępna funkcja składa się z jednej metody, która pobiera tablicę podwaja i powrót poszukiwanych funkcji, takich jak ten na MeanAbsoluteValue:Zadeklaruj klasy statyczne, aby można je było przechowywać na liście

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

Ponieważ każda z tych cech ma tylko sposób obliczyć myślałem o próbę przepisać je, aby można było je zbierać i wybierać z tej Kolekcji.

Próbowałem napisać interfejs do ich użycia, ale ponieważ są statyczne, nie było to dozwolone.

Czy jest sposób na zrobienie tego? A jeśli tak, czy możesz wskazać mi właściwy kierunek?

+0

nie będzie w stanie wykorzystać polimorfizm używanie klas statycznych. – code4life

+0

Nie możesz używać lambdas lub delegatów? – Rik

+0

Nie jestem pewien, co o klasie abstrakcyjnej posiadającej metodę statyczną, wiem, że możesz zmusić ją do wdrożenia, ale jeśli zaimplementowana logika możemy z niej skorzystać. – Devesh

Odpowiedz

8

Można utworzyć tablicę delegatów zbudowanych z Calculate metod tych klas, na przykład:

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

Oto demo on ideone.

+0

Działa doskonale, dzięki! – Sander

0

Wystarczy kolekcję Func ... delegatów

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

sklepu do swoich funkcji w słowniku, i szukać ich po imieniu

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); 
} 
Powiązane problemy