在C#中有没有像字典一样工作的集合,它有多个键,允许双向访问?例如:
Collection<int, string> a = new Collection<int, string>();
a.Add(1, "a");
a.Add(1, "b");
a.Add(2, "a");
a.Get(1);//returns ["a", "b"]
a.InverseGet("a"); //returns [1, 2]发布于 2018-09-04 16:28:27
使用Tuple List<Tuple<int,string>>允许具有相同键和LINQ的集合对您的集合进行查询Where
例如,
List<Tuple<int,string>> list = new List<Tuple<int,string>>();
list.Add(Tuple.Create(23, "Foo"));
list.Add(Tuple.Create(23, "Bar"));
list.Add(Tuple.Create(25, "Bar"));
var keys = list.Where(x=> x.Item1 == 23).Select(x=> x.Item2); // FOO, BAR
var values = list.Where(x=> x.Item2 == "Bar").Select(x=> x.Item1); ; // 23, 25发布于 2018-09-04 22:53:11
这里有一个解决方案,可以在两个方向上为您提供字典查找的性能。我假设您想忽略重复的元组,并且默认的比较器就足够了。实现其他操作,如删除,留给读者作为练习
public class TwoWayCollection<A, B>
{
private Dictionary<A, HashSet<B>> byADictionary = new Dictionary<A, HashSet<B>>();
private Dictionary<B, HashSet<A>> byBDictionary = new Dictionary<B, HashSet<A>>();
public IEnumerable<B> Get(A a)
{
return byADictionary[a];
}
public IEnumerable<A> InverseGet(B b)
{
return byBDictionary[b];
}
public void Add(A a, B b)
{
if (!byADictionary.ContainsKey(a))
{
byADictionary[a] = new HashSet<B>();
}
byADictionary[a].Add(b);
if (!byBDictionary.ContainsKey(b))
{
byBDictionary[b] = new HashSet<A>();
}
byBDictionary[b].Add(a);
}
}那么使用它实际上就是你提议的代码。根据字典,Get和InverseGet都采用O(1)方法
TwoWayCollection<int, string> a = new TwoWayCollection<int, string>();
a.Add(1, "a");
a.Add(1, "b");
a.Add(2, "a");
a.Get(1); //returns ["a", "b"]
a.InverseGet("a"); //returns [1, 2]https://stackoverflow.com/questions/52161921
复制相似问题