1

如果我有包含的结构

public struct MyStruct
{
    public int Id1;
    public int Id2;
    public string Name;
    public int ValueToFind;
}

我应该如何存储和检索它们?只有2个选项浮现在脑海

  1. 把它们放在List<MyStruct>anhd循环中,直到我找到并打破
  2. 将它们作为键存储在字典Tuple<int, int, string>中,将 ValueToFind 作为值存储

后者不是那么方便,因为我希望将它们作为那个结构。是否有一个集合使用数据库索引之类的 3 个第一个字段来快速检索?

-马蒂

4

2 回答 2

1

最好使用Dictionary<TKey, TVAlue>带有适当键的 a。您可以将结构存储在字典中。这使您甚至可以快速检索和插入(接近O(1))。

对于这样一个不需要 的简单结构Tuple,试试这个:

public struct MyStructKey
{
    public int Id1;
    public int Id2;
    public string Name;
}

public struct MyStruct
{
    public MyStructKey Key;
    public int ValueToFind;
}

然后,例如:

static void Main()
{
  Dictionary<MyStructKey, MyStruct> d = new Dictionary<MyStructKey, MyStruct>();

  MyStruct ms = new MyStruct()
  {
    Key = new MyStructKey() { Id1 = 0, Id2 = 0, Name = string.Empty },
    ValueToFind = 4
  };

  d.Add(ms.Key, ms);

  Console.WriteLine(d[ms.Key].ValueToFind);
}

或者,您可以使用Dictionary<MyStructKey, int>不重复数据,并且根本不使用MyStruct

于 2013-09-15T17:50:40.153 回答
0

内置的基于哈希表的类型使得通过与确切键类型不同的东西进行查找有点困难。散列理论没有什么可以阻止它成为可能,但目前 BCL 是不可能的。

要使用内置执行查找,Dictionary您需要提供 GetHashCode 和 Equals 方法MyStruct。然后,您需要传入一个部分填充的实例,MyStruct该实例设置了相关的三个字段,并从中计算哈希码和相等结果。

如果您想要更优雅的解决方案,请使用新结构作为查找键:

public struct MyStructKey
{
    public int Id1;
    public int Id2;
    public string Name;
}

将这个新结构的所有键值放入一个Dictionary. 确保覆盖提供相等性和哈希码的方法。

于 2013-09-15T18:41:17.797 回答