2009-02-09 16 views
6

No tengo mucha experiencia con el uso de la palabra clave yield. Tengo estas extensiones IEnumerable < T> para conversión de tipo.Uso sobrecargado del rendimiento rendimiento

Mi pregunta es, ¿tiene el primer método sobrecargado el mismo efecto de rendimiento que obtengo del segundo método?

public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(this IEnumerable<TFrom> toList) 
{ 
    return ConvertFrom<TTo, TFrom>(toList, TypeDescriptor.GetConverter(typeof(TTo))); 
} 

public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(this IEnumerable<TFrom> toList, TypeConverter converter) 
{ 
    foreach (var t in toList) 
     yield return (TTo)converter.ConvertFrom(t); 
} 
+0

Voy a actualizar su comentario a Jon ... –

+0

Por favor, configure su comentario como respuesta en este thred http://stackoverflow.com/questions/1947919/template-style-is-not-setting- algunas preferencias y yo lo acepto. – FFire

Respuesta

4

Cuando llame a la primera sobrecarga, inmediatamente llamará a la segunda sobrecarga. Eso no ejecutará ningún código en su cuerpo, que se habrá movido a una clase anidada que implementa el bloque iterador. Cuando se llaman por primera vez GetEnumerator() y luego MoveNext() en el IEnumerable<TTo> devuelto, entonces el código en su segunda sobrecarga comenzará a ejecutarse.

Tengo una bastante larga article on the iterator block implementation, que puede que le interese.

+0

¿Estás de acuerdo con @Marc Gravell? la forma en que estoy usando este método es traducir un objeto EF en un objeto DataContract para WCF. tan List (Hoteles) .ConvertTo (SerializableHotels, Hotels)(); – bendewey

+0

No tengo una opinión firme sobre los convertidores de tipo, pero sé que Marc sabe mucho más sobre él que yo. –

+0

En realidad, Jon, eso suena como un trabajo para tu mapeador de propiedades en MiscUtil (no recuerdo el nombre). –

2

Sí, porque el retorno rendimiento simplemente genera una clase IEnumerator de compilación. yield return es solo magia de compilación.

2

Como un lado ... la mayoría de los convertidores de tipos solo funcionan a/desde cadenas. Otra opción interesante aquí podría ser los operadores de conversión estáticos definidos en contra del tipo (s) - Tengo un código .NET 3.5 que hace esto en MiscUtil - vea el método Convert mencionado here.

Re tu comentario:

la forma en que estoy usando este método es trasladar un objeto EF en un objeto DataContract de WCF. por lo lista (Hoteles) .ConvertTo (SerializableHotels, Hoteles)()

Suena como debe ya sea a utilizar la serialización, o si los nombres de las propiedades tienen una relación directa, tal vez algo como PropertyCopy<To>.CopyFrom(from) - este es de nuevo desde MiscUtil (pero algo del trabajo de Jon este tiempo) - es decir

public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(
    this IEnumerable<TFrom> list, TypeConverter converter) 
{ 
    return list.Select(item => PropertyCopy<TTo>.CopyFrom<TFrom>(item); 
} 

Aparte de eso, es probable que más acomodados hablando de un Conversion<,> en lugar de un TypeConverter.

+0

Gracias, voy a echar un vistazo. – bendewey

+0

Marc, esto es genial. No estoy seguro si puedo usarlo debido a algunos problemas de licencia. Tendré que verificarlo, pero gracias – bendewey

+0

Me gustaría darle la respuesta, porque usted respondió mi pregunta oculto sin respuesta, y le agradezco. Aunque, los otros respondieron la pregunta exacta que hice sobre el uso del rendimiento. ¿Pensamientos? – bendewey