Estoy en la situación en que muchas de mis clases son contenedores de objetos conocidos pero no ordenados de diferentes tipos, p. un recipiente puede ser similar al siguiente:C# más cercano equivalente a la expresión de coincidencia F #?
public class Container
{
public A A { get; private set; }
public B B { get; private set; }
public C C { get; private set; }
public bool StoreIfKnown(object o)
{
// TODO...
}
}
Así que si o
es de tipo A
Debe ser almacenado en el A
propiedad, tipo B
en la propiedad B
y así sucesivamente.
En F # el método StoreIfKnown
se podría escribir algo como lo siguiente (con perdón de los errores de sintaxis, mi F # no es muy grande y bastante oxidado):
match o with
| ?: A a -> A <- a; true
| ?: B b -> B <- b; true
| ?: C c -> C <- c; true
| _ -> false
Pero en C# la única manera parece ser el lugar verbosa:
if (o is A)
{
this.A = (A)o;
return true;
}
if (o is B)
{
this.B = (B)o;
return true;
}
// etc.
return false;
que podría hacerlo con la palabra clave as
para evitar el patrón de prueba/cast que sería más rápido, pero es aún más detallado.
¿Hay alguna manera elegante de hacer esto en C#?
estoy impactado en realidad hay alguien por ahí usando F # ... – pixelbobby
@pixelbobby: observo que hay 478 F # preguntas, en comparación con 409 Haskell, Scala 382, 353 Lisp, 305 Erlang, y 96 OCaml. F # parece ser el lenguaje de programación funcional más popular en SO, probablemente debido al cruce de la comunidad hubFS y los desarrolladores .NET que quieren saltar al tren de programación funcional. – Juliet
No diría que uso F #, solo me gusta estar al tanto de sus características. ¡Aunque estaría ansioso por tener un trabajo donde fuera el idioma principal que utilicé (asumiendo la idoneidad para el propósito) para mejorar mis habilidades! Conocer al menos los conceptos básicos de varios idiomas que utilizan paradigmas diferentes a los de los idiomas en los que normalmente trabaja, mejora su capacidad de programación integral. –