这些是我必须使用的固定数据结构,我无法重新定义或遗憾地改变它们。
我循环遍历列表,列表中的每个对象如下所示(将鼠标悬停在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;
}
答案 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的值,因此可以把事情搞砸了。