Che differenza c'è tra System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator?Qual è la differenza tra System.Linq.Enumerable.WhereListIterator e System.Linq.Enumerable.WhereSelectListIterator?
Una differenza che ho notato è hav Tipo WhereListIterator riflette le modifiche all'oggetto collezione, ma non si WhereSelectListIterator
farò più chiaro per esempio.
I hav uno scenario in cui vado a prendere il mio dominio oggetto dal repository
var buckets = testRepository.GetBuckets(testIds);
Poi selezionare alcuni secchi della collezione di cui sopra all'interno di un ciclo
var bucketsForTest = buckets.Where(bucket => bucket.TestID == test.testId);
Poi posso cambiare una singola proprietà di tutti gli oggetti Bucket all'interno del metodo dell'oggetto LooserTrafficDisributor.
ITrafficDistributor distributor = new LooserTrafficDisributor(bucketsForTest);
IEnumerable<Bucket> updatedBuckets = distributor.Distribute(test.AutoDecision);
Costruttore di LooserTrafficDisributor
public LooserTrafficDisributor(IEnumerable<Bucket> allBuckets)
{
this.allBuckets = allBuckets;
}
Procedimento distribuire all'interno LooserTrafficDistributor assomiglia a questo
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
}
Dopo questo posso vedere i cambiamenti riflessi all'interno della raccolta IEnumerable updatedBuckets.
Ma se faccio questo esempio, invece di recupero raccolta benna da repository fare un prescelto & quindi aggiornare tutti gli oggetti benna in modo simile come segue
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());
non posso ottenere le modifiche riflesso all'interno IEnumerable collezione aggiornata di Buckets. Infatti ho eseguito il debug all'interno dei metodi DistributeTraffic anche se le modifiche non si riflettevano dopo ogni ciclo.
Dude U r solo mezzo rito nel dire "tat" nel mio eg. Creo "un nuovo oggetto Bucket, ** copiando il contenuto dal bucket originale nel nuovo Bucket **. Nel mio esempio nella seconda parte dove sto selezionando da testRows ci" testrows "è una raccolta di tipo diverso e aggiungendo .TOList() alla fine il problema è – Vipresh
@vipresh Puoi mettere un po 'più attenzione nella tua scrittura? È difficile da capire in questo modo. – CodesInChaos