Find in assoc array then iterate
Paul Backus
snarwin at gmail.com
Sat Oct 22 19:46:02 UTC 2022
On Saturday, 22 October 2022 at 15:21:07 UTC, Kevin Bailey wrote:
> OTOH, a forward iterator (i.e. copyable but does not need to
> go backwards) solves the problem elegantly and efficiently.
The builtin function [`byKeyValue`][1] returns a forward range
(D's version of a forward iterator) over the contents of an
associative array. To save the current iteration state, use the
`.save` method.
Here's a simple example:
```d
import std.algorithm, std.range, std.stdio;
void main()
{
auto aa = ["x": 123, "y": 456, "z": 789, "w": 10];
// name of range type is private, so use auto + typeof
auto it = aa.byKeyValue;
typeof(it) saved;
// iterate once and save our position partway through
for (; !it.empty; it.popFront)
{
auto e = it.front;
if (e.key == "y")
saved = it.save;
writefln("%s: %s", e.key, e.value);
}
writeln("--------");
// iterate again from saved position
foreach (e; saved)
writefln("%s: %s", e.key, e.value);
}
```
[1]: https://druntime.dpldocs.info/object.byKeyValue.1.html
More information about the Digitalmars-d-learn
mailing list