2010-05-10 6 views

Respuesta

10

Puede usar LINQ con cualquier IEnumerable utilizando la función Cast<T>() o la función OfType<T>(). Si está seguro de que el IEnumerable solo contiene objetos de un tipo particular, entonces Cast<T>() será un poco más rápido.

Por ejemplo,

ArrayList foo = new ArrayList(); 

foo.Add("bar"); 
foo.Add("baz"); 

var bar = foo.Cast<string>().Select(s => s.ToUpper()); 

Hay muchas clases existentes (como ArrayList) que existían antes de la llegada de los genéricos en .NET, por lo que todavía no son genéricos.

+0

¿Qué tanto impacto tendrá en el rendimiento? –

+0

@Chris: muy poco con 'Cast', y muy ligero con' OfType' (ya que la comprobación de tipos se realiza dos veces). –

2

Estas clases a menudo datan de antes de que existieran genéricos en .net, muchas de estas clases tienen equivalentes genéricos, pero no todas. También hay soluciones. p.ej. con linq, cualquier colección no genérica se puede hacer de manera lineal y genérica utilizando los métodos de extensión .Cast() y .OfType().

+0

+1 para usar "linqy" –

+0

Linqy es una buena palabra, pero prefiero la que acuñó un colega después de agregar un montón de UpdatePanels a su página asp.net. Declaró que acababa de "ajaxificar" su página ;-) –

2

Tenga en cuenta que muchos de los tipos de BCL que estamos utilizando son de antes de los genéricos, que llegaron en 2.0. Sin embargo, todavía puedes usar LINQ con muchos de ellos, simplemente tienes que hacer un poco de trabajo extra.

ArrayList arrayList = new ArrayList(); 
arrayList.Add(1); 
arrayList.Add(2); 

var query = from item in arrayList.OfType<int>() select item; 
+2

Esto * filtrará * los elementos en ArrayList solo a aquellos que son de tipo int. –

12

La historia importa. Los genéricos no siempre existieron, por lo que puede encontrar clases y API que fueron diseñadas antes del advenimiento de los genéricos.

Además, la audiencia objetivo importa. Algunas funciones están dirigidas a una audiencia de desarrolladores que puede tener problems understanding generics:

disyuntiva: API que utilizan algunos características avanzadas de los genéricos pueden ser demasiado difícil de usar para algunos desarrolladores. El concepto de medicamentos genéricos no es ampliamente entendido , en algunos casos, la sintaxis puede plantear problemas, y como cualquier gran nueva característica , Generics puede plantear una curva aprendizaje significativo para algunos desarrolladores de nivel de entrada.

Sí, la cita es de 2004, pero algunas, si no la mayoría de la .Net API que utiliza hoy en día salió en 2005, por lo que la cita es realmente muy relevante.

+2

+1 En discusiones previas con el personal de MS, son muy reticentes a realizar cambios bruscos en las API públicas (o incluso cambios aditivos en las interfaces, ya que esto afectaría a los implementadores de interfaces existentes).si eres un consumidor puro, suena como un dolor en el culo, pero una vez que estás en su posición (produciendo API para el consumo de los demás), rápidamente empiezas a sentir empatía y a seguir prácticas similares, ya que te facilita la vida. y facilita una adopción más rápida de versiones más nuevas y mejor compatibles. –

Cuestiones relacionadas