Trovare record successivo in un set: LINQ

Ho una lista di oggetti che hanno tutti una proprietà id

E. g

1, 10, 25, 30, 4

Ho un currentId e ho bisogno di trovare la prossima Id nell’elenco

Così, per esempio, la corrente Id è impostato a 25, ho bisogno di restituire l’oggetto con id uguale a 30. Quello dopo di che sarebbe 4.

Come posso fare questo elegante in LINQ?

MODIFICA

L’elenco è ordinato da una “sorta” di proprietà. Così si può semplicemente order by id, come in grado di rovinare l’ordine.

  • Se si desidera ottenere solo un oggetto, perché non riordinare la query?
InformationsquelleAutor qui | 2009-08-26



3 Replies
  1. 34

    Senza ri-ordinare (nota modificare leggermente come penso di aver letto male la domanda):

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

    Ovviamente, se data è stato un insieme di oggetti, qualcosa come:

    var next = data.SkipWhile(obj => obj.Id != last).Skip(1).First();
    • Inoltre, se questo ha ottenuto alla fine della lista e ha cercato di saltare, sarebbe lanciare un’eccezione o semplicemente restituire null. Ho bisogno di controllare per questo?
    • così com’è, si sarebbe rimessa ma si potrebbe usare FirstOrDefault, invece, che non passi.
  2. 3
    int currentId = 25;
    var next = yourCollection.Where(i => i.Id > currentId).OrderBy(i => i.Id).First();
    • Mi fido di ordine, mi spiace – ha curato la domanda a risolverlo
  3. 2

    Ci sono un bel paio di soluzione. Suggerisco qualcosa come il seguente.

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

    Se si desidera che l’id nell’ordine in cui appaiono nell’insieme, si può usare la seguente.

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

    Se ritorna null, avete cercato di ottenere l’elemento successivo dell’ultimo elemento.

Lascia un commento