2009-08-26 34 views
14

Tôi có một danh sách các đối tượng mà tất cả đều có một đặc tính idTìm kỷ lục tiếp theo trong một tập: LINQ

Ví dụ

1, 10, 25, 30, 4

Tôi có một currentId và tôi cần phải tìm ra id tiếp theo trong danh sách

vì vậy, đối id hiện ví dụ được thiết lập đến 25, tôi cần phải trả lại đối tượng với một id của 30. một sau đó sẽ là 4.

Làm thế nào sẽ tôi làm việc này thanh lịch trong LINQ?

EDIT

Danh sách này được sắp xếp theo một "loại" tài sản. Vì vậy, bạn không thể chỉ theo thứ tự của id, vì điều đó sẽ mess up thứ tự.

+0

Nếu bạn chỉ muốn có một đối tượng tại sao không sắp xếp lại truy vấn? –

Trả lời

33

Nếu không tái đặt hàng (lưu ý để tôi chỉnh sửa một chút như tôi nghĩ tôi không nhận định các câu hỏi):

int[] data = {1, 10, 25, 30, 4}; 
int last = 25; 
var next = data.SkipWhile(i => i != last).Skip(1).First(); 

Rõ ràng, nếu data là một tập các đối tượng, một cái gì đó như:

var next = data.SkipWhile(obj => obj.Id != last).Skip(1).First(); 
+0

Ngoài ra, nếu điều này đã đến cuối danh sách và cố gắng bỏ qua, nó sẽ ném một ngoại lệ hoặc chỉ trả về null. Tôi có cần kiểm tra điều này không? – qui

+2

như nó đứng, nó sẽ ném - nhưng bạn có thể sử dụng 'FirstOrDefault' thay vào đó, mà sẽ không ném. –

3
int currentId = 25; 
var next = yourCollection.Where(i => i.Id > currentId).OrderBy(i => i.Id).First(); 
+0

Làm rối trật tự, xin lỗi - đã chỉnh sửa câu hỏi để xóa nó lên – qui

2

Có một vài giải pháp. Tôi đề nghị một cái gì đó như sau.

var next = items 
    .Where(item => item.Id > currentId) 
    .OrderBy(item => item.Id) 
    .First(); 

var next = items 
    .OrderBy(item => item.Id) 
    .First(item => item.Id > currentId); 

Nếu bạn muốn id theo thứ tự chúng xuất hiện trong bộ sưu tập, bạn có thể sử dụng như sau.

var next = items 
    .SkipWhile(item => item.Id != currentId) 
    .Skip(1) 
    .FirstOrDefault(); 

Nếu điều này trả về null, bạn đã cố gắng lấy mục tiếp theo của mục cuối cùng.

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