2011-10-25 17 views
5

Jaka jest różnica między System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator?Jaka jest różnica między System.Linq.Enumerable.WhereListIterator i System.Linq.Enumerable.WhereSelectListIterator?

Jedna różnica ja hav zauważyłem jest to typ WhereListIterator odzwierciedla zmiany dotyczące obiektu kolekcji ale WhereSelectListIterator nie

będę się bardziej zrozumiałe dla np.

ja hav scenariusz, gdzie pobierał moja domena obiektu z repozytorium

var buckets = testRepository.GetBuckets(testIds); 

Potem wybrać pewne wiadra z powyższego zbioru wewnątrz pętli

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

Potem zmienić jedną właściwość wszystkich Obiekty Bucket wewnątrz metody obiektu LooserTrafficDisributor.

ITrafficDistributor distributor = new LooserTrafficDisributor(bucketsForTest); 

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

Konstruktor LooserTrafficDisributor

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

Metoda dystrybucji wewnątrz LooserTrafficDistributor wygląda to

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 
} 

Po tym widzę odzwierciedlenie zmian wewnątrz kolekcji IEnumerable updatedBuckets.

Ale jeśli to zrobię to IE zamiast pobierania kolekcji Wiadro z repozytorium zrobić select & następnie zaktualizować wszystkie obiekty Bucket w podobny sposób jak następuje

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()); 

nie mogę dostać zmiany odzwierciedlenie wewnątrz IEnumerable Kolekcja updatedBuckets. Infact I debugowane wewnątrz metod DistributeTraffic nawet tam zmiany nie zostały odzwierciedlone po każdej rundzie pętli.

Odpowiedz

4

tworzy IEnumerable swoich przedmiotów zawierających wszystkie elementy, które spełniają kryteria. Jeśli uruchomisz zestaw .Select() w tym zestawie wyników, otrzymasz IEnumerable nowych elementów utworzonych w instrukcji select. Zatem zmiany w oryginalnych elementach będą odzwierciedlały nowe elementy w stosunku , a nie.

W swoim przykładzie tworzysz dla każdego segmentu z oryginalnej listy, spełniając kryteria dotyczące miejsca pobytu, dla nowego obiektu Bucket, kopiując zawartość z oryginalnego segmentu do nowego segmentu.

+0

Dude U r tylko w połowie rytuał mówiąc tat na moim np. Tworzę "nowy obiekt Bucket, ** kopiuję zawartość z oryginalnego kubełka do nowego Bucket **. W moim np. W drugiej części, gdy wybieram z testRows," testrows "to zbiór różnych typów i obiektów dodawanie .TOList() na końcach slove problem – Vipresh

+4

@vipresh Czy możesz umieścić nieco więcej uwagi w swoim piśmie? Ciężko to zrozumieć. – CodesInChaos