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

本文关键字:检索 关联 | 更新日期: 2023-09-27 17:54:36

这些是我必须使用的固定数据结构,我不能重新定义或更改它们。

我正在循环一个列表,列表中的每个对象看起来如下(在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;
}

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

我对你想要完成的事情有点困惑(你在问题中的任何地方都没有提到idb),但如果idaidb的唯一组合应该让你获得值,那么你可以使用Tuple<int, int>作为关键:

var lookup = new Dictionary<Tuple<int, int>, MyObject>();
lookup[Tuple.Create(828, 133)] = MyObjectInstance;

但是,如果您的意图是获得给定键(idaidb)的值,那么您最好只创建两个字典:

var lookupByA = new Dictionary<int, MyObject>();
var lookupByB = new Dictionary<int, MyObject>();
lookupByA[828] = MyObjectInstance;
lookupByB[133] = MyObjectInstance;

那么你就可以查两本字典

在我看来,你正在检索你的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的值,因此这可能会造成麻烦。