通过集合中的 3 个字段查找 4 字段结构的最快方法是什么

本文关键字:字段 结构 方法 是什么 查找 集合 | 更新日期: 2023-09-27 18:31:20

如果我有包含

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

我应该如何存储和检索它们?只有 2 个选项

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

后者不是那么方便,因为我想将它们作为该结构。是否有一个集合对前 3 个字段使用数据库索引之类的东西进行快速检索?

-马蒂

通过集合中的 3 个字段查找 4 字段结构的最快方法是什么

最好使用具有适当键的Dictionary<TKey, TVAlue>。您可以将结构存储在字典中。这为您提供了快速检索和插入(接近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

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

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

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

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

将在此新结构上键入的所有项目放入Dictionary中。确保覆盖提供相等和哈希代码的方法。