C ++ sửa đổi danh sách trong khi lặp lại

Vòng lặp vô hạn và tự quản lý điều kiện để dừng vòng lặp xử lý sau khi bạn đã xử lý mọi thứ ở đó khi bạn bắt đầu xử lý và mọi thứ trong hàng đợi từ trình theo dõi hệ thống tệp

 

 

 

"murthybsn" đã viết trong tin nhắn. 8ba90f2c-8217-4522-be20-291ef991c3b1

Xin chào ppl,

Tôi đang phát triển một ứng dụng cửa sổ nhỏ. Nó có một trình xem tập tin

Trình theo dõi tệp xem một thư mục "C. \Temp" Bất cứ khi nào tệp kiểm tra được đặt trong thư mục đó, tôi sẽ in tất cả các tệp ngoại trừ tệp kiểm tra bằng quy trình. bắt đầu()

Vì vậy, vấn đề của tôi là trong khi lặp lại tất cả các tệp trong thư mục để xử lý bản in, có một dịch vụ khác sẽ đặt thêm một số tệp trong cùng một thư mục

Bài đăng này sẽ thảo luận về cách xóa các phần tử khỏi danh sách trong C # thỏa mãn điều kiện đã cho trong khi lặp lại nó

Vấn đề. Chúng tôi không thể lặp lại danh sách và chỉ cần xóa các phần tử khỏi danh sách đó

Lý do. Di chuyển về phía trước trong danh sách bằng cách sử dụng vòng lặp for và xóa các phần tử khỏi danh sách có thể khiến bạn bỏ qua một số phần tử. Nói cách khác, khi phần tử thứ i của danh sách bị xóa, phần tử được định vị ở chỉ mục tiếp theo sẽ trở thành phần tử thứ i mới. Bây giờ trong lần lặp tiếp theo của vòng lặp for, vì chỉ số i được tăng lên, nên phần tử thứ i chưa được xử lý sẽ bị bỏ qua

Điều này là hiển nhiên từ ví dụ sau, trong đó đầu ra dự kiến ​​sẽ trống, nhưng đầu ra thực tế là [2,4,6,8,10]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

sử dụng Hệ thống;

sử dụng Hệ thống. Bộ sưu tập. Chung;

sử dụng Hệ thống. Linq;

 

lớp công khai Ví dụ

{

    công khai tĩnh vô hiệu Chính()

    {

        Danh sách<int> list = new List<int>(Enumerable.Phạm vi(1, 10));

 

        cho (int i = 0; i < list.Đếm; i++) {

            danh sách. RemoveAt(i);

        }

 

        Bảng điều khiển. WriteLine(Chuỗi. Tham gia(',', list));

    }

}

Tải xuống Chạy mã

 
Ngoài ra, InvalidOperationException sẽ bị ném nếu chúng ta cố di chuyển tiếp trong danh sách bằng cách sử dụng vòng lặp foreach và xóa các phần tử khỏi danh sách. Ngoại lệ này được đưa ra khi lệnh gọi phương thức không hợp lệ đối với trạng thái hiện tại của đối tượng.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

sử dụng Hệ thống;

sử dụng Hệ thống. Bộ sưu tập. Chung;

sử dụng Hệ thống. Linq;

 

lớp công khai Ví dụ

{

    công khai tĩnh vô hiệu Chính()

    {

        Danh sách<int> list = new List<int>(Enumerable.Phạm vi(1, 10));

 

        foreach (int item in list) {

            danh sách. Xóa(mục);        // throws `InvalidOperationException`

        }

 

        Bảng điều khiển. WriteLine(Chuỗi. Tham gia(',', list));

    }

}

Tải xuống mã

 
Có một số cách giải quyết để giải quyết các vấn đề trên

1. Lặp lại ngược

Một giải pháp hay là lặp lại danh sách, điều này không bỏ qua bất cứ thứ gì và chúng ta có thể gọi phương thức RemoveAt() cho .

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

sử dụng Hệ thống;

sử dụng Hệ thống. Bộ sưu tập. Chung;

sử dụng Hệ thống. Linq;

 

lớp công khai Ví dụ

{

    công khai tĩnh vô hiệu Chính()

    {

        Danh sách<int> list = new List<int>(Enumerable.Phạm vi(1, 10));

 

        cho (int i = list.Đếm - 1; i >= 0; i--)

        {

            nếu (danh sách[i] % 2 == 0) {    // remove even elements

                danh sách. RemoveAt(i);

            }

        }

 

        Bảng điều khiển. WriteLine(Chuỗi. Tham gia(',', list));

    }

}

 

/*

đầu ra. 1,3,5,7,9

*/

Tải xuống Chạy mã

2. Sử dụng phương pháp List.Reverse()

Một giải pháp khác để giải quyết vấn đề trên là lặp qua một bản sao ngược của danh sách bằng cách sử dụng vòng lặp foreach. Ví dụ mã sau đây cho thấy cách triển khai điều này bằng cách sử dụng phương thức Reverse() của LINQ.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

sử dụng Hệ thống;

sử dụng Hệ thống. Bộ sưu tập. Chung;

sử dụng Hệ thống. Linq;

 

lớp công khai Ví dụ

{

    công khai tĩnh vô hiệu Chính()

    {

        Danh sách<int> list = new List<int>(Enumerable.Phạm vi(1, 10));

 

        foreach (int item in list.Đảo ngược<int>())

        {

            if (mục % 2 == 0) {    // remove even elements

                danh sách. Xóa(mục);

            }

        }

 

        Bảng điều khiển. WriteLine(Chuỗi. Tham gia(',', list));

    }

}

 

/*

đầu ra. 1,3,5,7,9

*/

Tải xuống mã

3. chỉ số giảm dần

Chúng ta cũng có thể giảm chỉ số i trong vòng lặp khi phần tử i'th bị xóa khỏi danh sách. Bây giờ, phần tử i'th sẽ không bị bỏ qua

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

sử dụng Hệ thống;

sử dụng Hệ thống. Bộ sưu tập. Chung;

sử dụng Hệ thống. Linq;

 

lớp công khai Ví dụ

{

    công khai tĩnh vô hiệu Chính()

    {

        Danh sách<int> list = new List<int>(Enumerable.Phạm vi(1, 10));

 

        cho (int i = 0; i < list.Đếm; i++)

        {

            nếu (danh sách[i] % 2 == 0) {        // remove even elements

                danh sách. RemoveAt(i--);

            }

        }

 

        Bảng điều khiển. WriteLine(Chuỗi. Tham gia(',', list));

    }

}

 

/*

đầu ra. 1,3,5,7,9

*/

Tải xuống Chạy mã

4. Sử dụng bộ sưu tập khác

Thay vì xóa các phần tử khi di chuyển về phía trước trong danh sách, chúng tôi tạo một tập hợp các phần tử đó và xóa chúng sau. Tùy thuộc vào điều kiện xóa được sử dụng, phương pháp này có thể thất bại nếu danh sách chứa các phần tử trùng lặp

Tôi có thể sửa đổi danh sách trong khi lặp lại không?

Quy tắc chung là bạn không sửa đổi tập hợp/mảng/danh sách trong khi lặp lại nó . Sử dụng danh sách phụ để lưu trữ các mục bạn muốn thực hiện và thực thi logic đó trong một vòng lặp sau vòng lặp ban đầu của bạn. Lưu câu trả lời này.

Chúng ta có thể thêm phần tử trong khi lặp không?

Bạn không thể sửa đổi Bộ sưu tập trong khi lặp qua nó bằng Iterator , ngoại trừ Iterator. xóa() . Điều này sẽ hoạt động trừ khi danh sách bắt đầu lặp trống, trong trường hợp đó sẽ không có phần tử trước đó.

Bạn có thể sửa đổi cấu trúc bộ sưu tập trong khi lặp lại bằng cách sử dụng cho mỗi vòng lặp không?

Trong vòng lặp for-each, chúng ta không thể sửa đổi bộ sưu tập , nó sẽ đưa ra một ConcurrentModificationException, mặt khác với trình vòng lặp mà chúng ta có thể sửa đổi .

Làm cách nào để nối các phần tử vào danh sách trong khi lặp qua danh sách trong Python?

Để thêm các mục vào danh sách trong khi lặp lại danh sách đó. .
Sử dụng lớp range() để tạo một đối tượng phạm vi theo độ dài của danh sách
Lặp lại đối tượng phạm vi
sử dụng danh sách. append() để thêm các mục vào danh sách trong khi lặp lại