Me gustaría escribir una clase LinearInterpolator, donde X es el tipo del valor del eje X e Y el tipo del valor del eje Y. No puedo ver cómo hacer esto de modo que X podría ser un DateTime o un doble. La clase es algo así como más adelante (que no se ha probado):Un interpolador lineal genérico: cómo lidiar con DateTime?
class LinearInterpolator<X, Y>
{
private List<X> m_xAxis;
private List<Y> m_yAxis;
public LinearInterpolator(List<X> x, List<Y> y)
{
m_xAxis = x;
m_yAxis = y;
}
public Y interpolate(X x)
{
int i = m_xAxis.BinarySearch(x);
if (i >= 0)
{
return m_yAxis[i];
}
else
{
// Must interpolate.
int rightIdx = ~i;
if (rightIdx >= m_xAxis.Count)
--rightIdx;
int leftIdx = rightIdx - 1;
X xRight = m_xAxis[rightIdx];
X xLeft = m_xAxis[leftIdx];
Y yRight = m_yAxis[rightIdx];
Y yLeft = m_yAxis[leftIdx];
// This is the expression I'd like to write generically.
// I'd also like X to be compilable as a DateTime.
Y y = yLeft + ((x - xLeft)/(xRight - xLeft)) * (yRight - yLeft);
return y;
}
}
}
}
Sería fácil en C++, pero soy nuevo en C# genéricos por lo que cualquier ayuda sería muy apreciada.
Idealmente, esto funcionaría, pero como 'TimeSpan' no es compatible con' TimeSpan/TimeSpan -> double' o 'TimeSpan * double -> TimeSpan' (por razones que incluso pueden considerarse sensatas) creo que estás fuera en el frio. Puede restar tiempos para obtener intervalos y volver a agregarlos, pero no puede encontrar, por ejemplo, la mitad de un intervalo sin escribir código no genérico. – hobbs
Los genéricos de C++ no son lo mismo que los genéricos de C#. El compilador de C++ especializa las plantillas en tiempo de compilación. C# genera código genérico que está especializado en tiempo de ejecución. Una cosa que no funciona son los operadores, no hay un operador genérico de "agregar" o "dividir". No puede hacer que este código funcione por diseño. –