c# - Using Linq to find next element in subset of a list -


i have following collection

// collection query     var stagetable = new list<stage>     {     new stage {stageid = 1, lifecycleid = 1, stageseqno = 1},     new stage {stageid = 2, lifecycleid = 1, stageseqno = 2},     new stage {stageid = 3, lifecycleid = 1, stageseqno = 3},     new stage {stageid = 4, lifecycleid = 1, stageseqno = 4},     new stage {stageid = 5, lifecycleid = 2, stageseqno = 1},     new stage {stageid = 6, lifecycleid = 2, stageseqno = 2},     new stage {stageid = 7, lifecycleid = 2, stageseqno = 3},     new stage {stageid = 8, lifecycleid = 2, stageseqno = 4},     }; 

and i'm trying construct query return next stage given currentstage contained within same subset defined lifecycleid, e.g., given currentstage = 2 expect stage stageid = 3 back, currentstage = 4 expect null since lifecycleid switches value of 2.

this have

 var lifecycleid = stagetable                 .where(x => x.stageid == currentstageid)                 .select(x => x.lifecycleid);   var nextstage = stagetable                 .where(s => s.lifecycleid == lifecycleid.first())                 .skipwhile(s => s.stageid != currentstageid)                 .skip(1).firstordefault(); 

it appears work, there way perform in single query?

if install morelinq nuget package use code like:

var currentstageid = 4;  var nextstage = stagetable.skipwhile(z => z.stageid < currentstageid)     .lead(1, (x, y) => new { existing = x, next = y })     .take(1)     .firstordefault(z => z.next?.lifecycleid == z.existing.lifecycleid)?.next;  console.writeline(nextstage?.stageid); 

skipwhile skip data before current row.

lead merge adjacent rows (i.e. put current , next row together).

take 1 ensure single row (representing current , next row together).

and firstordefault ensure null returned if second row not have same lifecycleid first row).


Comments

Popular posts from this blog

Qt QGraphicsScene is not accessable from QGraphicsView (on Qt 5.6.1) -

php - Cannot override Laravel Spark authentication with own implementation -

What is happening when Matlab is starting a "parallel pool"? -