2008-10-03 27 views

Trả lời

15

Câu trả lời ngắn gọn - có.

Rõ ràng, mặc dù, thứ tự của các mục trong bộ sưu tập có thể không chính xác như được chèn vào, tùy thuộc vào loại bộ sưu tập (ví dụ: từ điển).

Nhưng bạn sẽ nhận được kết quả tương tự mỗi khi bạn lặp qua một bộ sưu tập đơn, chưa sửa đổi bằng cách sử dụng vòng lặp foreach.

+0

hmmmm ... có vẻ như cả hai chúng tôi đã làm điều tương tự. Đã viết một câu, đăng nó, và sau đó ngay lập tức chỉnh sửa nó để xây dựng. –

+0

Thật vậy. Tôi nghĩ câu trả lời của bạn phù hợp hơn tôi, hy vọng OP sẽ gắn thẻ đó là kết quả cuối cùng. Chắc chắn có vẻ là thắng cuộc bầu cử phổ biến :) –

+0

Vấn đề với việc gắn thẻ nó là câu trả lời dứt khoát, tất nhiên, là nó không chính xác! –

25

Tùy thuộc vào loại bộ sưu tập. Đối với hầu hết các bộ sưu tập, câu trả lời là "Có".

Tuy nhiên, điều này không được đảm bảo. Các tài liệu của một loại bộ sưu tập nên xác định có hay không, nhưng như hầu hết, các chi tiết đó thường được xem xét kỹ hơn. Tuy nhiên, nếu nó không ổn định, nó sẽ là một sự giám sát to lớn nếu các tài liệu không đề cập đến điều đó.

0

Tôi sẽ nói rằng đối với hầu hết bộ sưu tập, bạn có thể giả định điều này là an toàn. Nó không vượt ra ngoài cõi khả năng rằng một bộ sưu tập nhất định có thể có điều tra viên được thực hiện theo cách không xác định, nhưng điều đó có lẽ sẽ không xảy ra ...

+0

Phụ thuộc nếu bạn muốn có mã "có thể" sẽ hoạt động. Cá nhân tôi thích tự tin hơn thế! – MarkJ

6

Trong khi câu trả lời là "có" cho tất cả các bộ sưu tập sẵn có và có thể bất kỳ lớp bộ sưu tập lành mạnh nào ngoài đó, tài liệu không có bất kỳ ràng buộc nào được xây dựng cho IEnumerable. Do đó, không có gì cho chúng ta biết rằng mỗi lần lặp lại phải ổn định.

tôi có thể tưởng tượng trường hợp sử dụng sau đây:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9)) 
    Console.WriteLine(i); 

này cũng có thể được thực hiện như một lớp học mà mang lại một trật tự khác nhau cho mỗi lần lặp.

Vì vậy - nếu bạn cũng muốn xem xét các trường hợp đường biên lạ, câu trả lời phải là “no”.

+0

Uh, James có thay đổi câu trả lời của mình không? Khi tôi viết của tôi, nó vẫn là bản gốc. : -/ –

+0

ví dụ tuyệt vời về trường hợp khi đơn đặt hàng không nhất quán! –

3

Mặc dù thông thường, các thành phần sẽ được trả lại theo cùng thứ tự, hoàn toàn không có sự đảm bảo nào. Nó hoàn toàn phụ thuộc vào việc thực hiện nội bộ của lớp sưu tập.

Tôi có thể thấy một trường hợp cho một lớp sưu tập được thiết kế đặc biệt để trả lại các phần tử theo thứ tự ngẫu nhiên, chẳng hạn.

Tóm lại, trừ khi bạn biết việc triển khai nội bộ của lớp thu thập, không giả định bất kỳ điều gì về đơn đặt hàng.

10

Bạn không thể đảm bảo điều này trừ khi bạn biết việc triển khai cụ thể lớp bạn đang lặp lại.

Bộ sưu tập có thứ tự phần tử được xác định (ví dụ: List<T>) sẽ liệt kê theo thứ tự ổn định.

Đối với các bộ sưu tập mà trạng thái của đối tượng không thay đổi, rất có khả năng các phần tử sẽ quay lại theo cùng thứ tự, ví dụ: Dictionary<K,V>, mặc dù điều này không được đảm bảo bởi đặc điểm kỹ thuật.

Ví dụ về trường hợp này sẽ không xảy ra, bạn có thể tưởng tượng việc triển khai từ điển dựa trên hashtable có thể nén hoặc thay đổi kích thước bảng không đồng bộ.Việc triển khai như vậy sẽ không đảm bảo thứ tự lặp lại ổn định.

1

Re "chưa sửa đổi" (trả lời của NM) - lưu ý rằng nhiều vùng chứa phức tạp như từ điển không đảm bảo duy trì trật tự. Đôi khi việc thêm mục sẽ làm cho mục đó xuất hiện cuối cùng (cho hiển thị thứ tự được giữ nguyên) và đôi khi nó sẽ khiến các nhóm nội bộ sắp xếp lại, đưa ra một thứ tự hoàn toàn khác.

Những thứ như SortedList <,> vv rõ ràng có quy tắc riêng của họ.

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