2011-10-25 15 views
5

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.

risposta

4

.Where() rende un IEnumerable dei tuoi articoli contenente tutti gli elementi che soddisfano i criteri di cui. Se esegui uno .Select() su quel set di risultati, otterrai un IEnumerable di nuovi elementi che hai creato nell'istruzione select. Quindi le modifiche agli elementi originali saranno non riflettono sui nuovi elementi.

Nel tuo esempio si crea per ogni secchio nella lista originale fullfilling tua cui criteri di un nuovo oggetto Secchio, copiando il contenuto dal secchio originale alla nuova benna.

+0

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

+4

@vipresh Puoi mettere un po 'più attenzione nella tua scrittura? È difficile da capire in questo modo. – CodesInChaos

Problemi correlati