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

时间:2013-09-15 17:46:31

标签: c# collections

如果我有包含

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

我应该如何存储和检索它们?想到的只有两个选项

  1. 将它们放入List<MyStruct> anhd循环中,直到找到并中断
  2. 将它们存储在字典Tuple<int, int, string>中作为键,将ValueToFind存储为值
  3. 后者不是那么方便,因为我希望将它们作为结构。是否有一个集合使用类似数据库索引的东西来为3个第一个字段进行快速检索?

    -matti

2 个答案:

答案 0 :(得分:1)

最好使用带有适当密钥的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

答案 1 :(得分:0)

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

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

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

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

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