Actualmente estoy aprendiendo F # y me encanta el operador yield!
(yield-bang). No solo por su nombre sino también por lo que hace, por supuesto.F # rendimiento! operador - Implementación y posibles equivalentes de C#
El operador yield!
básicamente le permite ceder todos los elementos de una secuencia a partir de una expresión de secuencia. Esto es útil para componer enumeradores. Como encuentro regularmente enumeradores grandes y complicados, me interesan las estrategias que podemos usar para dividirlas y componerlas a partir de enumeradores más simples.
Desafortunadamente, el operador yield!
no está disponible en C#. Por lo que yo entiendo, lo que hace es como un foreach (var x in source) yield x;
pero el libro que estoy leyendo (Petricek's Real World F# - Manning) sugiere que tiene un mejor rendimiento ...
- Entonces, ¿qué es exactamente lo que el F # compilador de aquí? (Sí, también puedo verlo usando Reflector pero me gustaría tener una descripción más detallada del mecanismo).
Con el fin de lograr una construcción similar en C# He explorado múltiples maneras, pero ninguna de ellas es tan conciso como el operador yield!
y yo también no estoy seguro acerca de la complejidad de los mismos. ¿Podría alguien dar su opinión si mis números de BigO son correctos?
Decompose empadronador en múltiples enumeradores privadas y luego producir cada elemento desde el empadronador público:
foreach (var x in part1()) yield x foreach (var x in part2()) yield x
Esto dará lugar efectivamente en una "doble rendimiento" en cada elemento. ¿Es eso O (2n) entonces? (¿o posiblemente peor?) De todos modos, el uso de este enfoque me impide usar
yield break;
desde cualquiera de mis subpartes.Decompose empadronador en varios encuestadores privados y luego concat todos los encuestadores privados desde el empadronador pública:
return part1().Concat(part2())
creo que esto no es diferente de la solución antes mencionada porque
Concat()
se implementa de la manera que he descrito.
¿Alguna otra opción?
Como señala el documento que cita, cuando se usa de forma recursiva hay casos en los que 'yield!' (Que es equivalente al hipotético 'yield foreach' en C#) es O (n) pero' foreach ... yield return. ..' es O (n^2). – kvb
@kvb: Correcto, ese fue el tema del que estoy hablando, lo siento si esto no estaba claro. –