我試圖創建在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;
}
}
}
我不知道它是什麼,你問了。你能提供一些你有什麼樣的代碼,或者你最終想要做什麼樣的客戶代碼? – millimoose
你自動遞增的這個「鍵」是什麼?在返回對象時,「重新組織」集合意味着什麼?你的意思是,如果你有鑰匙「1,2,3,4,5」,然後用鑰匙「3」取出物品,那麼物品4和5分別移動到3和4,因此鑰匙現在爲「1」 ,2,3,4「,下一個鍵是」5「而不是」6「? – pstrjds
自動增加密鑰並重新組織集合?列表不是您要查找的內容嗎?它具有索引,並在刪除項目時重新組織它自己。 –