2009-08-26 14 views
14

Mam listę obiektów, które mają właściwości idZnajdź następny rekord w zestawie: LINQ

Np

1, 10, 25, 30, 4

Mam CurrentID i muszę znaleźć kolejną Id na liście

Tak na przykład prąd Id jest ustawione na 25, muszę wrócić obiekt o identyfikatorze 30. jedna po to byłoby 4.

Jak robię to elegancko w LINQ?

EDIT

lista jest sortowana przez "sort" mienia. Więc nie możesz po prostu zamówić przez id, ponieważ to zepsułoby zamówienie.

+0

Jeśli chcesz uzyskać tylko jeden obiekt, dlaczego nie chcesz zmienić kolejności zapytania? –

Odpowiedz

33

bez ponownego zamawiania (nota edytować lekko jak myślę misread pytanie):

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

Oczywiście, jeśli data był zbiorem obiektów, coś jak:

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

Również, jeśli to dotarł do końca listy i próbował pominąć, to rzuciłby wyjątek lub po prostu zwrócił wartość null. Czy muszę to sprawdzić? – qui

+2

w stanie, to rzucił - ale można użyć "FirstOrDefault" zamiast, które nie będzie rzutować. –

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

Zepsuje zamówienie, przepraszam - edytowałem pytanie, aby je wyczyścić. – qui

2

Istnieje kilka rozwiązań. Proponuję coś takiego.

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); 

Jeśli chcesz, aby identyfikatory w kolejności, w jakiej pojawiają się w kolekcji, możesz użyć poniższych.

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

Jeśli ta zwraca null, próbowałeś dostać następną pozycję ostatniego elementu.

Powiązane problemy