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=828
或object.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;
}
我对你想要完成的事情有点困惑(你在问题中的任何地方都没有提到idb
),但如果ida
和idb
的唯一组合应该让你获得值,那么你可以使用Tuple<int, int>
作为关键:
var lookup = new Dictionary<Tuple<int, int>, MyObject>();
lookup[Tuple.Create(828, 133)] = MyObjectInstance;
但是,如果您的意图是获得给定键(ida
或idb
)的值,那么您最好只创建两个字典:
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的值,因此这可能会造成麻烦。