¿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.
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
@vipresh ¿Puedes poner un poco más de cuidado en tu escritura? Es difícil de entender así. – CodesInChaos