mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
[+] 接入ET8服务端
[+] 接入ET8服务端
This commit is contained in:
141
Assets/GameScripts/DotNet/Core/MultiMap.cs
Normal file
141
Assets/GameScripts/DotNet/Core/MultiMap.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ET
|
||||
{
|
||||
public class MultiMap<T, K>:
|
||||
//#if UNITY
|
||||
// SortedLinkList<T, List<K>>
|
||||
//#else
|
||||
SortedDictionary<T, List<K>>
|
||||
//#endif
|
||||
{
|
||||
private readonly List<K> Empty = new();
|
||||
private readonly int maxPoolCount;
|
||||
private readonly Queue<List<K>> pool;
|
||||
|
||||
public MultiMap(int maxPoolCount = 0)
|
||||
{
|
||||
this.maxPoolCount = maxPoolCount;
|
||||
this.pool = new Queue<List<K>>(maxPoolCount);
|
||||
}
|
||||
|
||||
private List<K> FetchList()
|
||||
{
|
||||
if (this.pool.Count > 0)
|
||||
{
|
||||
return this.pool.Dequeue();
|
||||
}
|
||||
return new List<K>(10);
|
||||
}
|
||||
|
||||
private void Recycle(List<K> list)
|
||||
{
|
||||
if (list == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (this.pool.Count == this.maxPoolCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
list.Clear();
|
||||
this.pool.Enqueue(list);
|
||||
}
|
||||
|
||||
public void Add(T t, K k)
|
||||
{
|
||||
List<K> list;
|
||||
this.TryGetValue(t, out list);
|
||||
if (list == null)
|
||||
{
|
||||
list = this.FetchList();
|
||||
this.Add(t, list);
|
||||
}
|
||||
list.Add(k);
|
||||
}
|
||||
|
||||
public bool Remove(T t, K k)
|
||||
{
|
||||
List<K> list;
|
||||
this.TryGetValue(t, out list);
|
||||
if (list == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (!list.Remove(k))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (list.Count == 0)
|
||||
{
|
||||
this.Remove(t);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public new bool Remove(T t)
|
||||
{
|
||||
List<K> list;
|
||||
this.TryGetValue(t, out list);
|
||||
if (list == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
this.Recycle(list);
|
||||
return base.Remove(t);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 不返回内部的list,copy一份出来
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
/// <returns></returns>
|
||||
public K[] GetAll(T t)
|
||||
{
|
||||
List<K> list;
|
||||
this.TryGetValue(t, out list);
|
||||
if (list == null)
|
||||
{
|
||||
return Array.Empty<K>();
|
||||
}
|
||||
return list.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 返回内部的list
|
||||
/// </summary>
|
||||
/// <param name="t"></param>
|
||||
/// <returns></returns>
|
||||
public new List<K> this[T t]
|
||||
{
|
||||
get
|
||||
{
|
||||
this.TryGetValue(t, out List<K> list);
|
||||
return list ?? Empty;
|
||||
}
|
||||
}
|
||||
|
||||
public K GetOne(T t)
|
||||
{
|
||||
List<K> list;
|
||||
this.TryGetValue(t, out list);
|
||||
if (list != null && list.Count > 0)
|
||||
{
|
||||
return list[0];
|
||||
}
|
||||
return default;
|
||||
}
|
||||
|
||||
public bool Contains(T t, K k)
|
||||
{
|
||||
List<K> list;
|
||||
this.TryGetValue(t, out list);
|
||||
if (list == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return list.Contains(k);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user