On Wednesday, 8 February 2023 at 19:04:15 UTC, Alexander Zhirov wrote:
[...]

I would write a data structure and use struct members to reason about things, but that's probably just preference.

```
import std;

struct DatabaseEntry
{
    int id = -1;
    string deleted;
    string name;

    this(string[string] aa)
    {
        this.id = aa["id"].to!int;
        this.deleted = aa["deleted"];
        this.name = aa["name"];
    }

    auto opEquals(typeof(this) that) const
    {
        return
            (this.id == that.id) &&
            (this.deleted == that.deleted) &&
            (this.name == that.name);
    }
}

auto buildSortedEntryRange(string[string][int] aa)
{
    return aa
        .byValue
        .map!(entry => DatabaseEntry(entry))
        .array
        .sort!((a,b) => a.id < b.id);
}

void main()
{
    auto arrayA =
    [
        4:["id":"4", "deleted":"f", "name":"6.2"],
        3:["id":"3", "deleted":"f", "name":"5.6_hwlister"],
        2:["id":"2", "deleted":"t", "name":"6.2"],
        1:["id":"1", "deleted":"f", "name":"5.6"]
    ];

    auto arrayB =
    [
        6:["id":"6", "deleted":"f", "name":"6.2_test"],
        5:["id":"5", "deleted":"f", "name":"5.6_test"],
        4:["id":"4", "deleted":"f", "name":"6.2_hwlister"],
        3:["id":"3", "deleted":"f", "name":"5.6_hwlister"],
        2:["id":"2", "deleted":"f", "name":"6.2"],
        1:["id":"1", "deleted":"f", "name":"5.6"]
    ];

    auto entriesFromA = buildSortedEntryRange(arrayA);
    auto entriesFromB = buildSortedEntryRange(arrayB);
auto range = zip(StoppingPolicy.longest, entriesFromA, entriesFromB);

    foreach (entryA, entryB; range)
    {
        if (entryA != entryB)
        {
            writeln(entryB);
            // ...
        }
    }
}
```

Output is:

```
DatabaseEntry(2, "f", "6.2")
DatabaseEntry(4, "f", "6.2_hwlister")
DatabaseEntry(5, "f", "5.6_test")
DatabaseEntry(6, "f", "6.2_test")
```

Reply via email to