public void SecondPass() { KeyValuePair <C, B> firstItem; _di4.TryGetFirst(out firstItem); var lambdaCarrier = new AtomicDictionary <uint, Lambda>(); KeyValueUpdate <C, B> updateFunction = delegate(C k, B i) { return(i.Update(lambdaCarrier.Values)); }; List <uint> keysToRemove = new List <uint>(); List <uint> keys; foreach (var bookmark in _di4.EnumerateFrom(firstItem.Key)) { foreach (var lambda in bookmark.Value.lambda) { lambdaCarrier.AddOrUpdate(lambda.atI, lambda); if (lambda.phi == Phi.RightEnd) { keysToRemove.Add(lambda.atI); } } if (UpdateRequired(bookmark.Value.lambda, lambdaCarrier)) { _di4.TryUpdate(bookmark.Key, updateFunction); } foreach (uint item in keysToRemove) { lambdaCarrier.Remove(item); } keysToRemove.Clear(); keys = new List <uint>(lambdaCarrier.Keys); foreach (var key in keys) { lambdaCarrier[key] = new Lambda(Phi.Middle, lambdaCarrier[key].atI, _collectionID); } } }