On Fri, Mar 21, 2014 at 04:10:12PM +0000, Justin Whear wrote: [...] > This pull request[1] for groupBy has been hanging around for a year > now, driving me to copy-and-paste the implementation into a couple of > my projects. Using it, you could do this: > > auto tuples = ... // get your list of (B, foo), (B, bar), etc. > auto output = tuples.sort!`a[0] < b[0]` > .groupBy!`a[0] == b[0]`; > // output is a range of: > // [ > // [(A, begga)], > // [(B, foo), (B, bar), (B, big)], > // [(C, ble)] > // ] > > The advantage being that output isn't an array at all but a lazy range > of lazy ranges. > > 1 https://github.com/D-Programming-Language/phobos/pull/1186
Be aware, though, that groupBy only compares *adjacent* elements for equivalence; it does not sort the input. So if your input has equivalent elements interspersed with non-equivalent elements, you will have the equivalent elements split into multiple runs in the output. Example: auto data = [ tuple(1, "a") tuple(1, "b") tuple(2, "c") tuple(1, "d") ]; writeln(data.groupBy!((a,b) => a[0] == b[0])); Will output: [[tuple(1, "a"), tuple(1, "b")], [tuple(2, "c")], [tuple(1, "d")]] Which may not be what the OP wants. T -- Unix was not designed to stop people from doing stupid things, because that would also stop them from doing clever things. -- Doug Gwyn