2011-09-20 21 views
5

Sé que es good practice uso de LINQ en lugar de bucles iterativos, que puede modificar este código para utilizar LINQ?¿Cómo puedo cambiar ese código para utilizar LINQ

List<string> priorsLstIDs = ServiceUtil.extractColumnValuesAsStringVals(tqrPriors,Helper.STUDY_ID); 
List<DateTime> priorsLstDates = ServiceUtil.extractColumnValuesAsDateTimeVals(tqrPriors, "STUDY_DATE"); 
List<PriorElemSt> priorsElemLst = new List<PriorElemSt>(priorsLstIDs.Count); 

PriorElemSt elem; 

for (int i = 0; i < priorsLstIDs.Count; i++) 
{ 
    elem = new PriorElemSt(priorsLstIDs[i], priorsLstDates[i]); 
    priorsElemLst.Add(elem); 
} 

return filterStudyPriors(priorsElemLst); 

Gracias.

Actualización: ¿puede la llamada al método filterStudyPriors() ser parte del LINQ?

+4

no encienda sólo porque usted lee es una buena práctica. En bucles ajustados, por ejemplo, el código iterativo puede ser mucho más rápido. –

+3

Yo agregaría. En algunos casos, los bucles iterativos son mucho más simples de modificar para otros. No hagas de todo un clavo solo porque tienes un martillo. – rerun

+0

Estoy completamente de acuerdo –

Respuesta

8
IEnumerable<PriorElemSt> priorsElemLst = priorsLstIDs.Select((s,i) => new PriorElemSt(s, priorsLstDates[i])); 
return filterStudyPriors(priorsElemLst); 
+0

La firma es IEnumerable Delashmate

+0

@Delashmate: A continuación, la segunda parte de mi respuesta es más adecuado para usted. – abatishchev

+0

Esto no se compilará, en su respuesta 'i' será una cadena pero debe ser un número entero para pasar a la lista como un índice. –

4

Usted puede utilizar el método Zip

var priorsElemLst = priorsLstIDs.Zip(
    priorsLstDates, (i, d) => new PriorElemSt(i, d)) 

En la declaración i anterior es el elemento de priorsLstIds y d el elemento de priorsLstDates. Serán 'comprimidos' juntos usando sus posiciones en sus listas.

2

no es una buena práctica en absoluto, pero sólo si usted piensa que va a mejorar la legibilidad contra una pérdida de rendimiento.

LINQ-to-Objects generalmente va a agregar algunos gastos indirectos marginales (iteradores múltiples, etc.). Todavía tiene que hacer los bucles, y tiene delegar invoca, y por lo general tendrá que hacer un poco de desreferencia extra para llegar a las variables capturadas etc.

Is a LINQ statement faster than a 'foreach' loop?

4

se puede utilizar el método de Enumerable.Range así:

//first get the range of indexes 
var range = Enumerable.Range(0, priorsLstIDs.Count); 
//now project a list of elements at each index 
var priorsElemLst = range.Select(i => new PriorElemSt(priorsLstIDs[i], priorsLstDates[i])).ToList(); 
Cuestiones relacionadas