Vip*_*esh 5 c# linq func where
System.Linq.Enumerable.WhereListIterator和System.Linq.Enumerable.WhereSelectListIterator有什么区别?
我注意到的一个区别是Type WhereListIterator反映了对集合对象的更改,但WhereSelectListIterator没有
我会更明确地说,例如.
我有一个场景,我从存储库中获取我的域对象
var buckets = testRepository.GetBuckets(testIds);
Run Code Online (Sandbox Code Playgroud)
然后我在循环中从上面的集合中选择某些桶
var bucketsForTest = buckets.Where(bucket => bucket.TestID == test.testId);
Run Code Online (Sandbox Code Playgroud)
然后我在LooserTrafficDisributor对象的方法中更改所有Bucket对象的单个属性.
ITrafficDistributor distributor = new LooserTrafficDisributor(bucketsForTest);
IEnumerable<Bucket> updatedBuckets = distributor.Distribute(test.AutoDecision);
Run Code Online (Sandbox Code Playgroud)
LooserTrafficDisributor的构造函数
public LooserTrafficDisributor(IEnumerable<Bucket> allBuckets)
{
this.allBuckets = allBuckets;
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
在此之后,我可以看到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());
Run Code Online (Sandbox Code Playgroud)
我无法获得IEnumerable updatedBuckets集合中反映的更改.事实上,我在DistributeTraffic方法中进行了调试,即使每次循环后都没有反映出更改.
.Where()使您的项目成为 IEnumerable,其中包含满足 where 条件的所有元素。如果您.Select()对该结果集运行 a,您将获得在 select 语句中创建的新元素的 IEnumerable。因此,对原始元素的更改不会反映在新元素上。
在您的示例中,您为原始列表中满足您的位置条件的每个存储桶创建一个新的存储桶对象,将内容从原始存储桶复制到新存储桶。