Generic lists, you just gotta love them, especially if using linq! Well to the point. Lets say you got a list with Guid's of which you know one and based on that knowledge want to get either the one before or after.
Guid a = new Guid("709DBFA9-88B3-4518-A32F-C21B6AAE2917"); Guid b = new Guid("B9956FC6-FD9B-4F52-B96E-C1D0C29E1E55"); Guid c = new Guid("BFB9054A-AB18-4349-BCB4-19979D3486BB"); // <-- you know this one, the c guid Guid d = new Guid("1A8D6CAB-FD42-4517-A0EA-08D3F64DCD69"); Guid e = new Guid("02A8CA8A-5BC8-41BE-8AB8-332EF0B5407B"); List<Guid> guidList = new List<Guid> {a, b, c, d, e};
Solution
Oh wow, now I need to start building indexes pushing and popping yada yada. Well no, a better way to solve this is by using linq. Getting the record after the one you search for
private static Guid GetNext(IEnumerable<Guid> guidList, Guid current) { return guidList.SkipWhile(i => !x.Equals(current)).Skip(1).First(); }
And to get the record before...
private static Guid GetPrevious(IEnumerable<Guid> guidList, Guid current) { return guidList.TakeWhile(i => !x.Equals(current)).Last(); }
Using Generics (you should)
Whilst separated methods can be neat sometimes a lot of time and engineering can be saved using some generics instead, this means you can dynamically change the type of list you want to search for a certain record.In example
private static T GetNext<T>(IEnumerable<T> list, T current) { try { return list.SkipWhile(x => !x.Equals(current)).Skip(1).First(); } catch { return default(T); } } private static T GetPrevious<T>(IEnumerable<T> list, T current) { try { return list.TakeWhile(x => !x.Equals(current)).Last(); } catch { return default(T); } }
Some usage
String example
string f = "first"; string g = "second"; string h = "third"; string i = "fourth"; string j = "fifth"; List<string> stringList = new List<string>{f,g,h,i,j}; var prev = GetPrevious<string>(stringList, j); var next = GetNext<string>(stringList, j);
Guid example
Guid a = new Guid("709DBFA9-88B3-4518-A32F-C21B6AAE2917"); Guid b = new Guid("B9956FC6-FD9B-4F52-B96E-C1D0C29E1E55"); Guid c = new Guid("BFB9054A-AB18-4349-BCB4-19979D3486BB"); Guid d = new Guid("1A8D6CAB-FD42-4517-A0EA-08D3F64DCD69"); Guid e = new Guid("02A8CA8A-5BC8-41BE-8AB8-332EF0B5407B"); List<Guid> guidList = new List<Guid> {a, b, c, d, e}; var prev = GetPrevious<Guid>(guidList, c); var next = GetNext<Guid>(guidList, c);