2013-07-15 29 views
7

Trong C#, sẽ sử dụng Select() để chiếu các phần tử của một trật tự phần tử IOrderedEnumerable?IOrderedEnumerable.Select() giữ nguyên thứ tự phần tử?

  • Nếu có, cách trả lại số IEnumerable và không phải là IOrderedEnumerable?
  • Nếu không, làm thế nào tôi có thể đạt được điều này (ngoài việc sử dụng foreach)?

Lưu ý rằng câu hỏi này KHÔNG phải là bản sao của this one - Tôi chỉ có mệnh đề Select(), wihtout Distinct().

EDIT

Vâng, đó là LINQ to Objects. BTW, liệu câu trả lời có khác biệt không nếu tôi thực sự đang quering một số SQL DB?

+0

Có thể. Mặc dù tôi không sử dụng 'select', tôi thường thực hiện phân trang kết quả bằng cách đặt trước các kết quả và sau đó gọi' Skip' và 'Take' để nhận tập hợp con của những kết quả đó liên quan đến trang hiện tại. Đơn đặt hàng luôn được duy trì một cách đáng tin cậy vì vậy tôi mong đợi nó hoạt động tương tự trong khi 'Chọn' ... chỉ cần kiểm tra nó và xem – musefan

+0

Có phải LINQ to Objects không? –

+0

Có một chút chi tiết hơn khi sử dụng 'IOrderedEnumerable' (và nó sử dụng, chủ yếu áp dụng tiêu chí sắp xếp thứ cấp) trong bài đăng này http://stackoverflow.com/questions/8518557/when-to-return-iorderedenumerable –

Trả lời

9

Select không thay đổi thứ tự phần tử. Nó là một streaming operator (MSDN), có nghĩa là nó xử lý các phần tử nguồn theo thứ tự nguồn và tạo ra từng phần tử dự kiến.

Vì vậy, nếu bạn đang thực hiện chiếu nguồn theo thứ tự, kết quả dự kiến ​​sẽ giữ nguyên thứ tự của các phần tử nguồn.


Một điều nữa - bạn có thể tự hỏi tại sao kết quả không thực hiện IOrderedEnumerable<T>:

int[] items = { 2, 3, 1, 8, 5 }; 
IEnumerable<int> query = items.OrderBy(i => i).Select(i => i); 
bool isOrdered = query is IOrderedEnumerable<int>; // false 

Đó là vì Select điều hành trả về đối tượng mới iterator (WhereSelectArrayIterator trong trường hợp này) mà đọc mục từ bộ sưu tập nguồn (OrderedEnumerable trong trường hợp này) từng cái một, mục dự án và trả về phép chiếu. Đối tượng trình lặp mới này không thực hiện giao diện IOrderedEnumerable<T>, nó chỉ đơn giản là IEnumerable<T>. Bộ sưu tập theo thứ tự bây giờ là nguồn của trình lặp, nhưng không phải là trình lặp.