2012-11-05 90 views
-1

我試圖創建在C#中的特定對象池。我有兩個基本的方法,getObject和putObject以及一個線程安全的集合 - concurrentDictionary(因爲需要有一些鍵來標識池中的對象)。自動遞增辭典鍵

但是當我刪除,並從字典返回的對象,我需要重新組織該集合,並且當我想要把新的對象集合,我想自動增量鍵。有沒有解決方案來實現這一目標?或任何其他收集,這可以幫助我達到相同的效果,並可以幫助我創建對象池? (我有兩個游泳池,一個創建對象,但對象可以包含數據,所以我也有些「數據池」和「數據」應爲對象,具有一些非固定的大小,我需要這個解決方案「數據池」 )。

或者,你是否有一些技術訣竅,如何使對象池(內存池)與對象相比可以包含不同大小的數據

一些示例代碼

- >的foreach是那裏,因爲我想找到「數據對象」的大小最接近的匹配,然後,如果有任何合適的對象,我想退貨。如果不是,我創建新的。

namespace MPool 
{ 
    public class DataPool<T> 
    { 
     private ConcurrentDictionary<int,T> _objects; 
     private Func<T> _objectGenerator; 

     public DataPool(Func<T> objectGenerator) 
     { 
      if (objectGenerator == null) 
       throw new ArgumentNullException("Chyba metoda objectGenerator"); 
      _objects = new ConcurrentDictionary<int,T>(); 
      _objectGenerator = objectGenerator; 
     } 

     public T GetObject(int size) 
     { 
      int diverse = Int32.MaxValue; 
      T item = default(T); 
      int key = -1; 
      foreach (KeyValuePair<int,T> obj in _objects) { 
       if (GetObjectSize(obj.Value) == size) { 
        //item = obj.Value; 
        key = obj.Key; 
        break; 
       } else { 
        if (Math.Abs((GetObjectSize(obj.Value) - size)) < diverse) { 
         diverse = Math.Abs((GetObjectSize(obj.Value) - size)); 
         if (diverse < (2 * GetObjectSize(obj.Value))) { 
          //item = obj.Value; 
          key = obj.Key; 
         } 
        } 
       } 
      } 
      if (key==-1) { 
       return _objectGenerator(); 
      } else { 
       _objects.TryRemove(key, out item); 
       return item; 
      } 
     } 

     public void PutObject(T item) 
     { 
      //_objects.AddOrUpdate 
     } 

     public void Free() 
     { 
      while (!_objects.IsEmpty) { 
       _objects.Clear(); 
      } 
     } 

     private int GetObjectSize(T TestObject) 
     { 
      BinaryFormatter bf = new BinaryFormatter(); 
      MemoryStream ms = new MemoryStream(); 
      byte[] Array; 
      bf.Serialize(ms, TestObject); 
      Array = ms.ToArray(); 
      return Array.Length; 
     } 
    } 
} 
+4

我不知道它是什麼,你問了。你能提供一些你有什麼樣的代碼,或者你最終想要做什麼樣的客戶代碼? – millimoose

+0

你自動遞增的這個「鍵」是什麼?在返回對象時,「重新組織」集合意味着什麼?你的意思是,如果你有鑰匙「1,2,3,4,5」,然後用鑰匙「3」取出物品,那麼物品4和5分別移動到3和4,因此鑰匙現在爲「1」 ,2,3,4「,下一個鍵是」5「而不是」6「? – pstrjds

+3

自動增加密鑰並重新組織集合?列表不是您要查找的內容嗎?它具有索引,並在刪除項目時重新組織它自己。 –

回答

0

我對發佈的代碼不直接關係到你正在嘗試做的(因爲我仍然爲你想要做什麼有點不確定)評論,但我覺得這應該是解決。

您正在計算所述對象的大小在每次循環迭代潛在的4倍。由於您一次將這些對象添加到集合中,因此我建議您在此類中創建一個輔助類,以便存儲對象及其大小,並在創建時計算它,然後將這些對象存儲在集合中。

public DataPool<T> 
{ 
     internal class DataStructHelper<T> 
     { 
      public T DataObject { get; private set; } 
      public int Size { get; private set; } 
      public DataStructHelper(T dataObject) 
      { 
       DataObject = dataObject; 
       Size = GetObjectSize(dataObject); 
      } 

      private int GetObjectSize(T TestObject) 
      { 
       BinaryFormatter bf = new BinaryFormatter(); 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        byte[] Array; 
        bf.Serialize(ms, TestObject); 
        return ms.ToArray().Length; 
       } 
      } 
     } 
    } 
// Other code here 
} 

不知道你的類將如何被使用,並且計劃打這個東西用,等多少個線程,我只想用常規列表考慮和周圍的訪問鎖定。您可以按排序順序存儲項目,並使用BinarySearch根據大小插入和搜索項目(您需要提供比較功能)。

+0

謝謝,那麼如何創建新的對象,在收集時不是具有合適大小的對象? –

+0

應該在PutObject方法中調用此代碼,該方法將數據放入集合中。當你在GetObject中返回一個對象時,你將從集合中移除,所以這個結構在那裏不會有用。 – pstrjds