【问题标题】:Mutiple keys in c# and retrieving associated valuesc# 中的多个键和检索关联值
【发布时间】:2014-03-27 15:50:33
【问题描述】:

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

我正在遍历一个列表,列表中的每个对象如下所示(在 Visual Studio 中悬停)。

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

我将如何通过键在此列表中查找值,即说明如何在给定键之一(例如 ida=828)的情况下查找值。我可以在浏览列表时取出键值,但有没有办法更快地做到这一点? IE。给定 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# dictionary key


【解决方案1】:

我对您要完成的工作感到有些困惑(您在问题的任何地方都没有提到idb),但是如果idaidb 的独特组合是应该得到的你的价值,那么你可以使用Tuple&lt;int, int&gt;作为键:

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;

那你就可以查两个字典了。

【讨论】:

  • 我目前对 idb 不感兴趣,这只是顺其自然。这些数据结构已经存在,我正在尝试使用它们。我无法对它们进行更改。
  • 数据结构是什么?那是一堂课吗?让我们看看定义数据结构的实际代码。对象列表是如何定义的?真的是List&lt;WhateverType&gt;吗?
  • @itsmen86 我在上面添加了更多内容。希望这会有所帮助?
【解决方案2】:

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

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

这假设您实际上可以“新建”字典中的键,您知道 ida 和 idb 的值,并且该键具有一个接受 ida 和 idb 的构造函数。我的所有重大假设,但我需要更多地了解您的问题才能给出更好的答案。

否则,您必须遍历字典中的每个键值对。喜欢:

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

这将是 O(n) 与字典中的项目数(这对于字典来说有点傻),而且,您的字典中可能有多个 ida 为 828 的值,因此可以用扳手扔东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多