首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双向键值采集

双向键值采集
EN

Stack Overflow用户
提问于 2018-09-04 16:24:02
回答 2查看 894关注 0票数 1

在C#中有没有像字典一样工作的集合,它有多个键,允许双向访问?例如:

代码语言:javascript
复制
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]
EN

回答 2

Stack Overflow用户

发布于 2018-09-04 16:28:27

使用Tuple List<Tuple<int,string>>允许具有相同键和LINQ的集合对您的集合进行查询Where

例如,

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2018-09-04 22:53:11

这里有一个解决方案,可以在两个方向上为您提供字典查找的性能。我假设您想忽略重复的元组,并且默认的比较器就足够了。实现其他操作,如删除,留给读者作为练习

代码语言:javascript
复制
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)方法

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52161921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档