2009-08-26 5 views
14

tengo una lista de objetos que todos tienen una propiedad idEncuentra siguiente registro en un conjunto: LINQ

Ej

1, 10, 25, 30, 4

tengo un currentId y necesito encontrar la siguiente identificación en la lista

Así, por ejemplo Id actual se establece en 25, tengo que devolver el objeto con un id de 30. el de después de que sería 4.

Cómo sería hago esto elegantemente en LINQ?

EDITAR

La lista se ordena por una propiedad "especie". Entonces no puedes simplemente ordenar por ID, ya que eso arruinaría el orden.

+0

Si ¿Quieres obtener un solo objeto por qué no reordenar la consulta? –

Respuesta

33

Sin reordenamiento (nota edito un poco como creo que leí mal la pregunta):

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

Obviamente, si data era un conjunto de objetos, algo así como:

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

Además, si esto llega al final de la lista y trata de omitir, ¿lanzará una excepción o simplemente devolverá nulo. ¿Debo verificar esto? – qui

+2

tal como está, arrojaría, pero podría usar 'FirstOrDefault' en su lugar, que no arrojará. –

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

Sería un desastre el orden, lo siento - he editado la pregunta para borrarlo – qui

2

Existen bastantes soluciones. Sugiero algo como lo siguiente.

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

Si desea los identificadores en el orden en que aparecen en la colección, puede usar lo siguiente.

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

Si esto devuelve null, que han tratado de obtener siguiente elemento del último elemento.

Cuestiones relacionadas