【问题标题】:Collection with entries that function as both key and value?具有既作为键又作为值的条目的集合?
【发布时间】:2012-05-03 19:06:58
【问题描述】:

我正在寻找一种可以让我存储和查找多个元组的解决方案。字典只提供了一种查找键而不是值的简单方法。我明白为什么(价值的非唯一性可能性)。但是,如果每个条目(键和值)都是严格唯一的怎么办。是否有一个集合可以轻松地让我存储和查找我选择的任何键并返回该键的匹配字段?在查找值时,我必须指定关键字段和所需的查找字段。我的目标是 C# 4.0

例子:

Collection<string, int, myEnum> myCollection = new ...

myCollection.Add("abc", 5, myEnum.First);
myCollection.Add("def", 6, myEnum.Second);

myCollection[int, myEnum, 6] = Second (of type myEnum) -> 我只是想出了如何指定键和值字段的方式。是否存在这样的集合,还是我需要自己推出?

我了解我正在研究表格的概念,但我希望尽可能避免使用表格结构。

注意:元组的数量将限制为

谢谢

【问题讨论】:

  • Jon Skeet 在这里发布了一个可以满足您的需求的课程:stackoverflow.com/questions/255341/…
  • 鲁本,太好了,你打败了我,我自己也看到了,但发现你已经发布了链接。非常感谢,正是我想要的。我很惊讶没有内置的集合来存放如此琐碎的东西。也许这个用例很少出现,因为大多数值都没有强制要求是唯一的,但我发现它很有价值。

标签: c# collections dictionary tuples lookup


【解决方案1】:

这是 .NET 中所有集合的列表:
http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx
如您所见,找不到这样的集合。

我也很确定在描述这种范式的普通计算机科学文献中没有标准的数据结构。

Arion 的实现可以满足您的需求,但在搜索键/值时性能不佳,并且不提供键或值的唯一性,而仅提供对。

你能做的是用两个字典来实现你的数据结构,其中一个的值引用另一个的键。

【讨论】:

  • 我特别提到了唯一性是强制的,我问是因为我很清楚 C# 中的标准集合。您最后的建议并没有解决问题,因为您无法轻松查找第二个字典的值以返回第一个字典的匹配键。
  • 是的,你可以。我可能不够清楚,但我建议的是字典 A 中的值指向字典 B 中的键,而字典 B 中的值指向字典 A 的键。
  • 我知道你指的是什么。我说没有简单的方法可以使用 dict C 的值“abc”来查找 Dict A 的键。这就是为什么 Jon Skeet 想出了他的解决方案,我偶然发现了这个解决方案,Ruben 很友好地指出了这个解决方案。
【解决方案2】:

您可以只使用 hashsettuple。像这样:

var hs=new HashSet<Tuple<string,int,myEnum>>();

然后添加你这样做(add 函数是 O(1)):

hs.Add(new Tuple<string,int,myEnum>("abc", 5, myEnum.First));
hs.Add(new Tuple<string,int,myEnum>("def", 6, myEnum.Second));

要查找你这样做的元组(contains 函数是 O(1)):

var tupleTolookUp=new Tuple<string,int,myEnum>("abc", 5, myEnum.First);
if(hs.Contains(tupleTolookUp))
{
    //do what ever with the tupleTolookUp
}

hashset 中,Tuples 必须是唯一的。但好在你不必重写Equalsgethashcode。因为元组是在内部进行的。

参考资料:

【讨论】:

  • 谢谢,有趣的想法,但是,它并没有真正解决问题,例如查找 myEnum.First 以返回“abc”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2016-09-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多