Moritz Warning wrote:
On Sat, 17 Oct 2009 18:58:08 +0000, BCS wrote:
what will this do?

foreach(key; aa.keys)
   if(Test(key))
      aa.remove(key);

It's undefined behavior.
You shouldn't try to mutate the aa while iterating.
I hope that will be fixed.
It took me some time to find this out.

That's really annoying, and it's true of most (all?) C# base class library collections. When coding in C#, I often find myself doing:

var remove = new HashedSet<Foo>();
foreach (var foo in foos)
        if (Test(foo)) remove.Add(foo);
foos.RemoveAll(remove);

It's more allocation than necessary, but more than that, it's an unnecessarily complicated way of interacting with the collection.

Reply via email to