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

C# 通过集合中的3个字段查找4字段结构的最快方法是什么?,c#,collections,C#,Collections,如果我有一个包含 public struct MyStruct { public int Id1; public int Id2; public string Name; public int ValueToFind; } 我应该如何存储和检索它们?我只想到两个选择 将它们放入列表anhd循环中,直到我找到并断开 将它们作为键存储在dictionaryTuple中,将value作为值存储在find中 后者不是那么方便,因为我希望将它们作为该结构。是否有一个集合使

如果我有一个包含

public struct MyStruct
{
    public int Id1;
    public int Id2;
    public string Name;
    public int ValueToFind;
}
我应该如何存储和检索它们?我只想到两个选择

  • 将它们放入
    列表
    anhd循环中,直到我找到并断开
  • 将它们作为键存储在dictionary
    Tuple
    中,将value作为值存储在find中
  • 后者不是那么方便,因为我希望将它们作为该结构。是否有一个集合使用类似于数据库索引的方法来快速检索前3个字段

    -matti

    最好使用带有适当钥匙的钥匙。可以将结构存储在字典中。这使您能够更快地检索和插入(接近
    O(1)

    对于这样一个简单的结构,您不需要
    元组
    ,请尝试以下方法:

    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);
    }
    
    static void Main()
    {
    字典d=新字典();
    MyStruct ms=newmystruct()
    {
    Key=new MyStructKey(){Id1=0,Id2=0,Name=string.Empty},
    ValueToFind=4
    };
    d、 添加(ms.Key,ms);
    Console.WriteLine(d[ms.Key].ValueToFind);
    }
    
    或者,您可以使用
    字典
    来避免数据重复,也可以根本不使用
    MyStruct

    最好使用带有适当键的。可以将结构存储在字典中。这使您能够更快地检索和插入(接近
    O(1)

    对于这样一个简单的结构,您不需要
    元组
    ,请尝试以下方法:

    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);
    }
    
    static void Main()
    {
    字典d=新字典();
    MyStruct ms=newmystruct()
    {
    Key=new MyStructKey(){Id1=0,Id2=0,Name=string.Empty},
    ValueToFind=4
    };
    d、 添加(ms.Key,ms);
    Console.WriteLine(d[ms.Key].ValueToFind);
    }
    

    或者,您可以使用
    Dictionary
    来避免数据重复,也可以根本不使用
    MyStruct

    内置的基于哈希表的类型使得按与确切键类型不同的内容查找有点困难。散列理论没有任何东西可以阻止这一点,但对于BCL来说,目前这是不可能的

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

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

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

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

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

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

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

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


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

    客户
    IEqualityComparer
    和字典如何?不幸的是,将该结构同时用作键和值会增加内存开销。就我个人而言,我将它们分为两个结构,一个用于键,一个用于值。然后在读取值后将它们组合成一个结构。thans!我得去看看。没有听说过。没有理由字典不能映射到为方便而需要的结构(只需要更多的内存)使用HashSet(带相等比较器)怎么样@SargeBorsch
    HashSet
    s对于OP提到他正在做的非常清楚的查找是没有用的。那么一个客户
    IEqualityComparer
    加上一本字典呢?不幸的是,将该结构同时用作键和值会增加内存开销。就我个人而言,我将它们分为两个结构,一个用于键,一个用于值。然后在读取值后将它们组合成一个结构。thans!我得去看看。没有听说过。没有理由字典不能映射到为方便而需要的结构(只需要更多的内存)使用HashSet(带相等比较器)怎么样@SargeBorsch
    HashSet
    s对于OP明确提到他正在进行的查找没有用处。插入速度慢不是问题,因为对所有项目只执行一次。但是你的意思是我使用struct作为键吗?该值是多少?我将BS称为“较慢插入”。保持数组列表或链表的排序是相当昂贵的。@matti我没有说过要使用struct作为键。@将millimoose插入到排序列表中也是
    O(logn)
    。字典不是
    O(nlogn)
    吗?重写Equals会使它更快。默认实现使用非常慢的反射。缓慢插入不是问题,因为对所有项只执行一次。但是你的意思是我使用struct作为键吗?该值是多少?我将BS称为“较慢插入”。保持数组列表或链表的排序是相当昂贵的。@matti我没有说过要使用struct作为键。@将millimoose插入到排序列表中也是
    O(logn)
    。字典不是
    O(nlogn)
    吗?重写Equals会使它更快。默认实现使用的反射速度非常慢。在这种情况下,您不需要重写提供相等和哈希代码的方法。如果默认相等有效并且对您来说足够快,则正确。我很少看到这种情况。你不需要重写等式和散列码