2009-08-26 6 views
14

J'ai une liste d'objets qui ont tous une propriété idTrouver enregistrement suivant dans un ensemble: LINQ

Par exemple,

1, 10, 25, 30, 4

J'ai un currentId et Je dois trouver la prochaine Id dans la liste

Ainsi, par exemple courant Id est fixé à 25, je dois retourner l'objet avec un identifiant de 30. l'un après qui serait 4.

Comment se je fais ça élégamment dans LINQ?

EDIT

La liste est ordonnée par une propriété "de tri". Donc, vous ne pouvez pas simplement commander par identifiant, car cela gâcherait la commande.

+0

Si vous Voulez-vous obtenir un seul objet pourquoi ne pas réorganiser la requête? –

Répondre

33

Sans réordonnancement (note je modifier un peu comme je pense que je mal lu la question):

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

Il est évident que, si data était un ensemble d'objets, quelque chose comme:

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

Aussi, si cela arrivait à la fin de la liste et a essayé d'ignorer, serait-il jeter une exception ou juste retourner null. Ai-je besoin de vérifier cela? – qui

+2

en l'état, il lancerait - mais vous pourriez utiliser 'FirstOrDefault' à la place, qui ne lancera pas. –

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

Pourrait gâcher l'ordre, désolé - avoir édité la question pour l'effacer – qui

2

Il existe plusieurs solutions. Je suggère quelque chose comme le suivant.

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 vous souhaitez que les ID apparaissent dans l'ordre dans lequel ils apparaissent dans la collection, vous pouvez utiliser ce qui suit.

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

Si cela retourne null, vous avez essayé d'obtenir l'article suivant du dernier élément.

Questions connexes