c#中的多个键并检索关联的值

时间:2014-03-27 15:50:34

标签: c# dictionary key

这些是我必须使用的固定数据结构,我无法重新定义或遗憾地改变它们。

我循环遍历列表,列表中的每个对象如下所示(将鼠标悬停在Visual Studio中)。

{[ida: 828, idb: 133, XXX.XXX.XXX.MyObject]}
    Key: {ida: 828, idb: 133}
    Value: {XXX.XXX.XXX.MyObject}

如何通过键在此列表中查找值,即说明如何在给定其中一个键(例如ida = 828)的情况下查找值。当我浏览列表时,我可以获得键值,但是还是可以更快地执行此操作吗?即鉴于828我可以获得价值,而不是ida=828object.key.ida[828]

其中一个问题是这些数据类型不可更改。有什么建议。有没有办法说ida围绕所有对象?

我知道我可以使用.Equals来确定键值是否存在,即object.key.ida.Equals(828),,但这仍然存在获取值的问题。这可能吗?

数据结构如下所示:

Collection<string, Key, Tstuff>

public struct Key
    {
        public long ida;
        public long idb;
    }

Tstuff是一种泛型类型,但在这种情况下会在下面传递(实际上是上面的值):

public struct D2
{
    public float A;
    public float B;

}

2 个答案:

答案 0 :(得分:0)

我对你想要完成的事情感到有点困惑(你在问题的任何地方没有提到idb),但如果ida和{{1}的独特组合是什么应该让你达到价值,然后你可以使用idb作为关键:

Tuple<int, int>

但是,如果您的目的是获得给定键(var lookup = new Dictionary<Tuple<int, int>, MyObject>(); lookup[Tuple.Create(828, 133)] = MyObjectInstance; ida)的值,那么您最好只创建两个词典:

idb

然后你可以检查两个词典。

答案 1 :(得分:0)

在我看来,您从KeyValuePairs中检索的数据结构是一个字典,其中一个键是一个由两部分组成的对象 - 一个ida和一个idb。如果是这种情况,如果您知道密钥的两个部分(ida和idb),则可以获得恒定时间查找。类似的东西:

var myObject = theDictionary[new WhateverKeyIsCalled(828, 133)]

这假设你实际上可以“新”字典中的键,你知道ida和idb的值,并且键有一个带有ida和idb的构造函数。我的所有重大假设,但我需要更多地了解你的问题,以提供更好的答案。

否则,您必须遍历字典中的每个keyvaluepair。像:

foreach(var keyValuePair in theDictionary)
{
     if(keyValuePair.key.ida == 828)
          return keyValuePair.Value;
}

这将是O(n)中字典中的项目数(对于字典来说有点傻),而且,您的字典中可能有多个ida为828的值,因此可以把事情搞砸了。