2011-10-25 205 views
5

System.Linq.Enumerable.WhereListIterator的区别是什么& System.Linq.Enumerable.WhereSelectListIterator?System.Linq.Enumerable.WhereListIterator&System.Linq.Enumerable.WhereSelectListIterator之间的区别是什么?

一个区别我甲肝注意到的是类型WhereListIterator反映集合对象上的变化,但WhereSelectListIterator不

我将使其成为如更加清晰。

我甲肝,我去找我的域对象从仓库

var buckets = testRepository.GetBuckets(testIds); 

然后我选择一个循环内从上述收集某些桶的情景

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

然后我改变所有的单个属性LooserTrafficDisributor对象的方法内的桶对象。

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集合内的反射变化。

但如果我这样做,即不是从仓库取桶收集的做了选择&然后更新以类似的方式将所有对象斗如下

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集合。 Infact我在DistributeTraffic方法中调试,即使在每次循环后都没有反映出变化。

回答

4

.Where()使您的项目的IEnumerable包含全部满足where条件的所有元素。如果您在该结果集上运行.Select(),则会在select语句中获得您创建的新元素的IEnumerable。所以对原始元素的更改将而不是反映在新元素上。

在您的示例中,您将为原始列表中的每个存储桶创建一个新的存储桶对象,并将原始存储桶中的内容复制到新存储桶中。

+0

老兄你只有一半仪式在说我在我的例如。我创建了“一个新的Bucket对象,**将内容从原桶中复制到新的Bucket **。在我的第二部分中,我从testRows中选择了”testrows“是一个不同类型的集合&Infact在末尾添加.TOList()可以解决问题 – Vipresh

+4

@vipresh你能否更注意自己的写作?这很难理解。 – CodesInChaos

相关问题