public virtual void RetainAll<U>(SCG.IEnumerable<U> items) where U : T { updatecheck(); HashSet<T> aux = new HashSet<T>(EqualityComparer); //This only works for sets: foreach (U item in items) if (Contains(item)) { T jtem = item; aux.searchoradd(ref jtem, true, false, false); } if (size == aux.size) return; CircularQueue<T> wasRemoved = null; if ((ActiveEvents & EventTypeEnum.Removed) != 0) { wasRemoved = new CircularQueue<T>(); foreach (T item in this) if (!aux.Contains(item)) wasRemoved.Enqueue(item); } table = aux.table; size = aux.size; #if !REFBUCKET defaultvalid = aux.defaultvalid; defaultitem = aux.defaultitem; #endif indexmask = aux.indexmask; resizethreshhold = aux.resizethreshhold; bits = aux.bits; bitsc = aux.bitsc; #if DEBUG #else randomhashfactor = aux.randomhashfactor; #endif if ((ActiveEvents & EventTypeEnum.Removed) != 0) raiseForRemoveAll(wasRemoved); else if ((ActiveEvents & EventTypeEnum.Changed) != 0) raiseCollectionChanged(); }
public virtual void AddAll<U>(SCG.IEnumerable<U> items) where U : T { updatecheck(); bool wasChanged = false; bool raiseAdded = (ActiveEvents & EventTypeEnum.Added) != 0; CircularQueue<T> wasAdded = raiseAdded ? new CircularQueue<T>() : null; foreach (T item in items) { T jtem = item; if (!searchoradd(ref jtem, true, false, false)) { wasChanged = true; if (raiseAdded) wasAdded.Enqueue(item); } } //TODO: implement a RaiseForAddAll() method if (raiseAdded & wasChanged) foreach (T item in wasAdded) raiseItemsAdded(item, 1); if (((ActiveEvents & EventTypeEnum.Changed) != 0 && wasChanged)) raiseCollectionChanged(); }
public virtual void RetainAll <U>(SCG.IEnumerable <U> items) where U : T { updatecheck(); HashBag <T> res = new HashBag <T>(itemequalityComparer); foreach (U item in items) { KeyValuePair <T, int> p = new KeyValuePair <T, int>(item); if (dict.Find(ref p)) { KeyValuePair <T, int> q = p; if (res.dict.Find(ref q)) { if (q.Value < p.Value) { q.Value++; res.dict.Update(q); res.size++; } } else { q.Value = 1; res.dict.Add(q); res.size++; } } } if (size == res.size) { return; } CircularQueue <T> wasRemoved = null; if ((ActiveEvents & EventTypeEnum.Removed) != 0) { wasRemoved = new CircularQueue <T>(); foreach (KeyValuePair <T, int> p in dict) { int removed = p.Value - res.ContainsCount(p.Key); if (removed > 0) #warning We could send bag events here easily using a CircularQueue of (should?) { for (int i = 0; i < removed; i++) { wasRemoved.Enqueue(p.Key); } } } } dict = res.dict; size = res.size; if ((ActiveEvents & EventTypeEnum.Removed) != 0) { raiseForRemoveAll(wasRemoved); } else if ((ActiveEvents & EventTypeEnum.Changed) != 0) { raiseCollectionChanged(); } }