В чем разница между 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);
Затем я изменяю одно свойство всех объектов Bucket внутри метода объекта 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.
Но если я сделаю это, то есть вместо получения коллекции 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. {{ 1}} Фактически, я отлаживал внутри методов DistributeTraffic, даже если изменения не отражались после каждого цикла цикла.