コード例 #1
0
    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();
    }
コード例 #2
0
    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();
    }
コード例 #3
0
ファイル: HashBag.cs プロジェクト: bittersmart/NanchangDemo
        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();
            }
        }