Tôi có một vòng lặp
Item last = Model.Results.Last[];
// do something with last
0 và cần thực thi một số logic khi mục cuối cùng được chọn từ Item last = Model.Results.Last[];
// do something with last
1, e. g foreach [Item result in Model.Results]
{
//if current result is the last item in Model.Results
//then do something in the code
}
Tôi có thể biết vòng lặp nào cuối cùng mà không sử dụng vòng lặp for và bộ đếm không?
Giải pháp tốt nhất
Nếu bạn chỉ cần làm điều gì đó với phần tử cuối cùng [trái ngược với điều gì đó khác với phần tử cuối cùng thì sử dụng LINQ sẽ giúp ích ở đây
Item last = Model.Results.Last[];
// do something with last
Nếu bạn cần làm điều gì đó khác với phần tử cuối cùng thì bạn cần một cái gì đó như
Item last = Model.Results.Last[];
foreach [Item result in Model.Results]
{
// do something with each item
if [result.Equals[last]]
{
// do something different with the last item
}
else
{
// do something different with every item but the last
}
}
Mặc dù bạn có thể cần phải viết một bộ so sánh tùy chỉnh để đảm bảo rằng bạn có thể biết rằng mặt hàng đó giống với mặt hàng được trả về bởi
Item last = Model.Results.Last[];
// do something with last
2Cách tiếp cận này nên được sử dụng một cách thận trọng vì
Item last = Model.Results.Last[];
// do something with last
3 cũng có thể phải lặp qua bộ sưu tập. Mặc dù đây có thể không phải là vấn đề đối với các bộ sưu tập nhỏ, nhưng nếu nó trở nên lớn thì nó có thể ảnh hưởng đến hiệu suất. Nó cũng sẽ thất bại nếu danh sách chứa các mục trùng lặp. Trong trường hợp này, một cái gì đó như thế này có thể phù hợp hơnint totalCount = result.Count[];
for [int count = 0; count < totalCount; count++]
{
Item result = Model.Results[count];
// do something with each item
if [[count + 1] == totalCount]
{
// do something different with the last item
}
else
{
// do something different with every item but the last
}
}
Giải pháp liên quan
C# – Cách lấy chỉ mục của lần lặp hiện tại của vòng lặp foreach
Ian Mercer đã đăng một giải pháp tương tự như thế này trên blog của Phil Haack
Điều này giúp bạn có được mục [
Item last = Model.Results.Last[];
// do something with last
4] và chỉ mục của nó [Item last = Model.Results.Last[];
// do something with last
5] bằng cách sử dụng quá tải này của LINQ's Item last = Model.Results.Last[];
// do something with last
6tham số thứ hai của hàm [bên trong Chọn] đại diện cho chỉ mục của phần tử nguồn
Item last = Model.Results.Last[];
// do something with last
7 đang tạo một đối tượng ẩn danh mớiCó thể tránh phân bổ heap bằng cách sử dụng
Item last = Model.Results.Last[];
// do something with last
8 nếu bạn đang sử dụng C# 7. 0 trở lênItem last = Model.Results.Last[];
// do something with last
4Bạn cũng có thể loại bỏ
Item last = Model.Results.Last[];
// do something with last
9 bằng cách sử dụng tính năng hủy tự độngItem last = Model.Results.Last[];
// do something with last
6C# – Các đối tượng nhân bản sâu
Trong khi một cách tiếp cận là triển khai giao diện
Item last = Model.Results.Last[];
foreach [Item result in Model.Results]
{
// do something with each item
if [result.Equals[last]]
{
// do something different with the last item
}
else
{
// do something different with every item but the last
}
}
0 [được mô tả, vì vậy tôi sẽ không lặp lại], đây là một trình sao chép đối tượng nhân bản sâu tuyệt đẹp mà tôi đã tìm thấy trên The Code Project cách đây một thời gian và tích hợp nó vào mã của chúng tôi. Như đã đề cập ở nơi khác, nó yêu cầu các đối tượng của bạn phải được tuần tự hóaItem last = Model.Results.Last[];
// do something with last
8Ý tưởng là nó tuần tự hóa đối tượng của bạn và sau đó giải tuần tự hóa nó thành một đối tượng mới. Lợi ích là bạn không phải lo lắng về việc sao chép mọi thứ khi một đối tượng trở nên quá phức tạp
Trong trường hợp bạn thích sử dụng các phương thức mở rộng mới của C# 3. 0, thay đổi phương thức để có chữ ký sau
Item last = Model.Results.Last[];
// do something with last
9Bây giờ cuộc gọi phương thức đơn giản trở thành
Item last = Model.Results.Last[];
foreach [Item result in Model.Results]
{
// do something with each item
if [result.Equals[last]]
{
// do something different with the last item
}
else
{
// do something different with every item but the last
}
}
1CHỈNH SỬA [ngày 10 tháng 1 năm 2015] Tôi nghĩ rằng tôi nên xem lại điều này, đề cập đến việc gần đây tôi đã bắt đầu sử dụng [Newtonsoft] Json để làm điều này, nó sẽ nhẹ hơn và tránh được chi phí của các thẻ [Serializable]. [NB @atconway đã chỉ ra trong các nhận xét rằng các thành viên riêng tư không được sao chép bằng phương thức JSON]