2011-10-25 24 views
5

¿Cuál es la diferencia entre System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator?¿Cuál es la diferencia entre System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator?

Una diferencia i haber notado es Tipo WhereListIterator refleja los cambios en el objeto de colección, pero no se WhereSelectListIterator

voy a hacerlo más claro para, por ejemplo.

I hav un escenario en el que voy a buscar mi objeto de dominio del repositorio

var buckets = testRepository.GetBuckets(testIds); 

Luego seleccione ciertos cubos de la colección anterior dentro de un bucle

var bucketsForTest = buckets.Where(bucket => bucket.TestID == test.testId); 

Entonces cambio una sola propiedad de todos los Objetos de Cubo dentro del método del objeto LooserTrafficDisributor.

ITrafficDistributor distributor = new LooserTrafficDisributor(bucketsForTest); 

IEnumerable<Bucket> updatedBuckets = distributor.Distribute(test.AutoDecision); 

Constructor de LooserTrafficDisributor

public LooserTrafficDisributor(IEnumerable<Bucket> allBuckets) 
    { 
     this.allBuckets = allBuckets; 
    } 

El método de distribuir el interior LooserTrafficDistributor se parece a esto

private IEnumerable<Bucket> DistributeTraffic(bool autoDecision) 
{ 
    // allBuckets is class variable in LooserTrafficDistributor object which is set through constructor shown above . 
    // Omitted other details 

       allBuckets.Where(bucket=> bucket.IsControl == false).ToList() 
        .ForEach(bucket => bucket.TrafficPercentage += 10)); 
return allBuckets 
} 

Después de esto puedo ver los cambios reflejados dentro de la colección IEnumerable updatedBuckets.

Pero si hago esto es decir, en lugar de ir a buscar la colección Cubo del repositorio hacer un selecto & luego actualizar todos los objetos del cubo de manera similar como sigue

var bucketsForTest = testRows.Where(testrow => testrow.url == url.url).Select(currRow => new Bucket 
    { 
       TestID = currRow.TestId, 
        BucketID = currRow.BucketId, 
        BucketName = currRow.c_bucket_name, 
        TrafficPercentage = Convert.ToInt32(currRow.i_bucket_percentage), 
        IsControl = currRow.b_is_control, 
        IsEnabled = currRow.b_enabled, 
        UpdatedAdminId = currRow.i_updated_admin_id, 
        LogAsSection = currRow.i_log_as_section 
      }) ; 

    ITrafficDistributor distributor = new LooserTrafficDisributor(bucketsForTest); 

    IEnumerable<Bucket> updatedBuckets = distributor.Distribute(test.AutoDecision, strategy.GetStatisticallySignificantLoosingBucketIds()); 

no puedo conseguir los cambios reflejados en el interior del IEnumerable actualización de la colección de casillas. De hecho, depuré dentro de los métodos DistributeTraffic, incluso allí los cambios no se reflejaron después de cada ronda de bucle.

Respuesta

4

.Where() hace un IEnumerable de sus artículos que contienen todos los elementos que cumplen los criterios where. Si ejecuta un .Select() en ese conjunto de resultados, obtendrá un IEnumerable de elementos nuevos que ha creado en la instrucción de selección. Por lo tanto, los cambios en los elementos originales serán y no se reflejarán en los nuevos elementos.

En su ejemplo, crea para cada Cubo en la lista original rellenando su criterio where un nuevo objeto Bucket, copiando el contenido del bucket original al nuevo Bucket.

+0

Tío U sólo medio rito para decir tat en mi ejemplo. Creo "un nuevo objeto Bucket", ** copiando el contenido del bucket original al nuevo Bucket **. En mi ejemplo, en la segunda parte donde estoy seleccionando de testRows, "testrows" es una colección de diferentes tipos & Infact. agregando .TOList() al final resuelve el problema – Vipresh

+4

@vipresh ¿Puedes poner un poco más de cuidado en tu escritura? Es difícil de entender así. – CodesInChaos

Cuestiones relacionadas