public void Clean()
        {
            var    c = new WeakList <object>();
            object x = new object();

            using (NoGCRegion.Enter(1000)) {
                AddCollectableItems(c, 3);

                c.InsertFirst(x);
                c.InsertAfter(x, x);
                c.InsertBefore(x, x);

                Assert.AreEqual(6, c.AddCountSinceLastClean);
                Assert.AreEqual(6, c.UnsafeCount);
                Assert.IsTrue(c.Take(3).SequenceEqual(new[] { x, x, x }));
            }

            Helpers.CollectAndWait();

            c.Clean();
            Assert.AreEqual(0, c.AddCountSinceLastClean);
            Assert.AreEqual(3, c.UnsafeCount);

            c.Remove(x);
            c.Remove(x);
            Assert.AreEqual(1, c.UnsafeCount);

            GC.KeepAlive(x);
        }