¿Puedo usar yield return
cuando el tipo de devolución es IGrouping<TKey, TElement>
o IDictionary<TKey, TValue>
?rendimiento de rendimiento funciona solo para IEnumerable <T>?
Respuesta
yield return
obras para exactamente 4 casos:
IEnumerable
IEnumerable<T>
IEnumerator
IEnumerator<T>
Esto se debe a que tiene que construir una máquina de estados internos; un diccionario (etc.) no sería posible con esto. Por supuesto, puede simplemente return
un tipo adecuado.
Artículo útil aquí http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx si desea implementar IEnumerable usted mismo. – Rory
@Rory sí, implementarlo usted mismo es un PITA masivo, y no puedo pensar en ninguna razón "normal" para hacerlo, ahora que existen bloques iteradores. Tengo algunos de estos, pero eso suele ser compatible con los proyectos que deben compilarse incluso en los compiladores de C# 1.2; no exactamente el escenario "normal". –
De acuerdo, aunque IGrouping podría ser bueno en algunos casos, parece más fácil usar un IEnumerable
No, sólo :-) IEnumerable
No es cierto; ver mi respuesta ;-p –
Yo no lo creo. Si bien el documentation no lo especifica exactamente, la forma en que está redactado implica que solo se puede usar cuando el tipo de devolución del método sea IEnumerable
o IEnumerable<T>
. Es posible que pueda escribir una clase que implemente IGrouping
dando un IEnumerable
(que sería devuelto por su método usando yield return
), pero esa es la única opción realmente.
La especificación del idioma lo explica en su lugar ... ver 8.18 en ECMA 334 –
No, porque un bloque de iterador es simplemente una máquina de estados construida en su nombre por el compilador. Esta característica le permite "ceder" y el elemento como una parte de una secuencia.
Si el tipo de devolución no era IEnumerable<T>
(como IDictionary
por ejemplo) el compilador tendría que generar métodos para implementar esa interfaz y en ese punto no tendría mucho sentido porque estaría trabajando con una colección en lugar de una secuencia.
Sin embargo, podría devolver IEnumerable<KeyValuePair<K,V>>
que sería similar a un diccionario. A continuación, obtendrías return KeyValuePairs. Incluso podría envolver esto con otro método que crea un diccionario a partir de la devolución. Lo único que el primer método no garantizaría es la singularidad en las claves.
Luego pierde el tiempo de acceso O (1), y tiene que pasar por cada KVP para encontrar la clave correcta, tomando al peores O (n) veces. –
Respuesta: No. Una declaración yield return
se puede utilizar sólo si el tipo de retorno es IEnumerator
, IEnumerator<T>
, IEnumerable
, o IEnumerable<T>
.
De §8.14 de la C# 3.0 spec:
La declaración de rendimiento se utiliza en un bloque de iterador (§8.2) para producir un valor para el objeto empadronador (§10.14.4) o un objeto enumerable (§10.14.5) de un iterador o para señalar el final de la iteración.
De §10.14.4:
objeto Un enumerador tiene las siguientes características:
- Implementa
IEnumerator
yIEnumerator<T>
, en dondeT
es el tipo de rendimiento del iterador.
[...]
De §10.14.5:
Un objeto enumerable tiene las siguientes características:
- Implementa
IEnumerable
yIEnumerable<T>
, dondeT
es el tipo de rendimiento del iterador.
[...]
Sólo tiene que llamar al método iterador y la cadena ToDictionary
GroupBy
o después de ella, y tiene la misma cosa. Ponlo en un método de envoltura de una línea si necesitas llamarlo así desde varios lugares.
Como el yield return
se puede utilizar con tipos como IEnumerator<T>
¿por qué no hacer algo como esto?
internal static IEnumerable<Dictionary<byte, string>> GetData()
{
Dictionary<byte, string> result = GetMyData(); //read from db
yield return result;
}
Espero que ayude.
Usted está 'produciendo una lista de diccionarios enteros, no pares clave-valor. – titol
- 1. rendimiento de rendimiento anidado con IEnumerable
- 2. ¿El rendimiento es == IEnumerable & IEnumerator?
- 3. Uso sobrecargado del rendimiento rendimiento
- 4. ¿Qué tipo de hormigón devuelve 'rendimiento rendimiento'?
- 5. rendimiento rendimiento muchos?
- 6. Rendimiento de rendimiento dentro de los usos
- 7. patrón de trabajo de rendimiento rendimiento
- 8. ¿Cómo funciona IEnumerable <T> .ToArray()?
- 9. Rendimiento del rendimiento anidado en un árbol
- 10. ¿Cómo funciona IEnumerable <T> .Reverse?
- 11. C# List <> Add() método rendimiento
- 12. Rendimiento de rendimiento en Java
- 13. ¿Reescribir este rendimiento de foreach a un rendimiento de linq?
- 14. ruptura de rendimiento; - comportamiento loco
- 15. Rendimiento de rendimiento del rendimiento: en Smalltalk (específicamente Squeak)
- 16. Obtener un IEnumerable <T> de un IEnumerable <IEnumerable <T>>
- 17. Event Store 3.0 - Rendimiento/rendimiento
- 18. Rendimiento solo una vez por iteración
- 19. ¿Está usando Lazy <T> malo para el rendimiento?
- 20. Rendimiento LINQ en memoria
- 21. Rendimiento para múltiples bloques
- 22. epoll rendimiento
- 23. rendimiento siempre se llama
- 24. ¿Puedo implementar retorno de rendimiento para funciones de IEnumerable en VB.NET?
- 25. Eventos vs. Rendimiento
- 26. vmware y rendimiento para desarrollar
- 27. Cómo convertir un IEnumerable <IEnumerable <T>> a un IEnumerable <T>
- 28. ¿Cuál es la forma preferida (rendimiento y legibilidad) de encadenar los métodos de extensión IEnumerable <T>?
- 29. IEnumerable <IEnumerable <T>> IEnumerable a <T> usando LINQ
- 30. rendimiento de ejecución (retorno de rendimiento) usando Scala continuaciones
posible duplicado de [Algunos ayudan a comprender "rendimiento"] (http://stackoverflow.com/questions/317462/some-help-understanding-yield) – nawfal