簡體   English   中英

System.Linq.Enumerable.WhereListIterator和System.Linq.Enumerable.WhereSelectListIterator有什么區別?

[英]What is difference between System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator?

System.Linq.Enumerable.WhereListIterator和System.Linq.Enumerable.WhereSelectListIterator有什么區別?

我注意到的一個區別是Type WhereListIterator反映了對集合對象的更改,但WhereSelectListIterator沒有

我會更明確地說,例如。

我有一個場景,我從存儲庫中獲取我的域對象

var buckets = testRepository.GetBuckets(testIds);

然后我在循環中從上面的集合中選擇某些桶

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

然后我在LooserTrafficDisributor對象的方法中更改所有Bucket對象的單個屬性。

ITrafficDistributor distributor = new LooserTrafficDisributor(bucketsForTest);

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

LooserTrafficDisributor的構造函數

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

LooserTrafficDistributor中的分配方法如下所示

 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
 }

在此之后,我可以看到IEnumerable updatedBuckets集合中反映的變化。

但是如果我這樣做,即不是從存儲庫中獲取Bucket集合,而是以類似的方式選擇&然后更新所有Bucket對象。

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

我無法獲得IEnumerable updatedBuckets集合中反映的更改。 事實上,我在DistributeTraffic方法中進行了調試,即使每次循環后都沒有反映出更改。

.Where()使你的項目的IEnumerable包含所有滿足where條件的元素。 如果在該結果集上運行.Select() ,您將獲得在select語句中創建的IEnumerable新元素。 因此,對原始元素的更改不會反映新元素。

在您的示例中,您為原始列表中的每個Bucket創建了滿足新Bucket對象的where條件,將內容從原始存儲桶復制到新存儲桶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM