2011-10-25 32 views
5

Sự khác nhau giữa System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator là gì?Sự khác nhau giữa System.Linq.Enumerable.WhereListIterator & System.Linq.Enumerable.WhereSelectListIterator là gì?

Một khác biệt mà tôi nhận thấy là hav Loại WhereListIterator phản ánh những thay đổi về đối tượng thu nhưng WhereSelectListIterator không

tôi sẽ làm cho nó rõ ràng hơn cho ví dụ.

Tôi hav một kịch bản mà tôi lấy Object miền của tôi từ Repository

var buckets = testRepository.GetBuckets(testIds); 

Sau đó, tôi chọn xô nào đó từ bộ sưu tập trên bên trong một vòng lặp

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

Sau đó, tôi thay đổi một tài sản duy nhất của tất cả các các đối tượng Bucket bên trong phương thức của đối tượng LooserTrafficDisributor.

ITrafficDistributor distributor = new LooserTrafficDisributor(bucketsForTest); 

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

Constructor của LooserTrafficDisributor

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

Các phân phối phương pháp bên LooserTrafficDistributor trông như thế này

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 
} 

Sau này tôi có thể thấy những thay đổi phản ánh trong bộ sưu tập IEnumerable updatedBuckets.

Nhưng nếu tôi làm ví dụ này thay vì lấy bộ sưu tập Bucket từ kho làm một lựa chọn & sau đó cập nhật tất cả các Bucket đối tượng theo cách tương tự như sau

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

tôi không thể có được những thay đổi phản ánh bên trong IEnumerable bộ sưu tập updatedBuckets. Infact Tôi đã sửa lỗi bên trong các phương thức DistributeTraffic ngay cả ở đó các thay đổi không được phản ánh sau mỗi vòng lặp.

Trả lời

4

.Where() tạo một IEnumerable cho các mục của bạn có chứa tất cả các yếu tố làm đầy đủ các tiêu chí nơi. Nếu bạn chạy .Select() trên tập hợp kết quả đó, bạn sẽ nhận được một IEnumerable của các phần tử mới mà bạn đã tạo trong câu lệnh chọn. Vì vậy, thay đổi đối với các yếu tố ban đầu sẽ không phải phản ánh trên các yếu tố mới.

Trong ví dụ bạn tạo cho mỗi Nhóm trong danh sách gốc, hãy điền đầy đủ tiêu chí của bạn vào đối tượng Thùng mới, sao chép nội dung từ nhóm gốc sang Nhóm mới.

+0

Dude U r chỉ có một nửa nghi thức khi nói tat trong ví dụ của tôi. Tôi tạo ra "một đối tượng Bucket mới, ** sao chép nội dung từ thùng ban đầu sang Bucket mới. Trong ví dụ của tôi. Trong phần thứ hai, nơi tôi m Chọn từ testRows có" testrows "là một tập hợp các loại khác nhau & Infact Thêm .TOList() ở cuối sloves vấn đề – Vipresh

+4

@ vipresh Bạn có thể đặt một chút quan tâm hơn vào văn bản của bạn? Thật khó để hiểu như thế này. – CodesInChaos

Các vấn đề liên quan