mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-07 16:45:10 +00:00
94 lines
2.2 KiB
C#
94 lines
2.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace ET
|
|
{
|
|
public class MultiMapSet<T, K>: SortedDictionary<T, HashSet<K>>
|
|
{
|
|
private readonly HashSet<K> Empty = new HashSet<K>();
|
|
|
|
public void Add(T t, K k)
|
|
{
|
|
HashSet<K> list;
|
|
this.TryGetValue(t, out list);
|
|
if (list == null)
|
|
{
|
|
list = new HashSet<K>();
|
|
this.Add(t, list);
|
|
}
|
|
list.Add(k);
|
|
}
|
|
|
|
public bool Remove(T t, K k)
|
|
{
|
|
HashSet<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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 不返回内部的list,copy一份出来
|
|
/// </summary>
|
|
/// <param name="t"></param>
|
|
/// <returns></returns>
|
|
public K[] GetAll(T t)
|
|
{
|
|
HashSet<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 HashSet<K> this[T t]
|
|
{
|
|
get
|
|
{
|
|
this.TryGetValue(t, out var list);
|
|
return list ?? Empty;
|
|
}
|
|
}
|
|
|
|
public K GetOne(T t)
|
|
{
|
|
HashSet<K> list;
|
|
this.TryGetValue(t, out list);
|
|
if (list != null && list.Count > 0)
|
|
{
|
|
return list.FirstOrDefault();
|
|
}
|
|
return default;
|
|
}
|
|
|
|
public bool Contains(T t, K k)
|
|
{
|
|
HashSet<K> list;
|
|
this.TryGetValue(t, out list);
|
|
if (list == null)
|
|
{
|
|
return false;
|
|
}
|
|
return list.Contains(k);
|
|
}
|
|
}
|
|
} |