C# 在以大数组作为成员元素的列表中高效查找对象

C# 在以大数组作为成员元素的列表中高效查找对象,c#,arrays,performance,list,C#,Arrays,Performance,List,嗨,我有一节课如下 class State { int[] some_array; //some other members } 现在我需要比较两个状态对象是否相同。我定义了两个相同的状态,如果它们具有相同的某些数组,而不考虑对象的其他成员 现在我有了一个包含数千个状态对象的列表。如何通过查找有效地获取一个状态并发现列表中存在另一个类似的状态 我可以将列表中每个state元素的some\u数组数组与给定的state对象进行比较。但这将需要大量的计算O(N*某些_数组的大小)。我

嗨,我有一节课如下

class State
{
    int[] some_array;
    //some other members
}
现在我需要比较两个状态对象是否相同。我定义了两个相同的状态,如果它们具有相同的
某些数组
,而不考虑对象的其他成员

现在我有了一个包含数千个状态对象的列表。如何通过查找有效地获取一个状态并发现列表中存在另一个类似的状态

我可以将列表中每个state元素的
some\u数组
数组与给定的state对象进行比较。但这将需要大量的计算O(N*某些_数组的大小)。我怎样才能用最小的计算量做到这一点


注意:除一个数组外,所有数组权限在每种情况下几乎相同。因此,查找可以深入到数组中。

我不确定这是否可行,但对我来说,在数组中创建内容哈希听起来是个不错的解决方案。这样,您就可以比较散列,而不是迭代整个数组并比较每个单独的值。

假设顺序重要,您的算法是O(N)最坏情况。如果不同状态的值往往不同,那么在比较两个候选元素时,测试通常会很早失败。如果数据是完全随机的,那么将两个状态相互比较的性能将接近O(1)。。。最早的数组元素在大多数情况下都会不同,前两个元素相同的几率会小得多,等等。如果您了解数组中数据的结构(例如,可能最有可能在最后有所不同?),您可以利用这一点。当然,数组的长度可以不同,在做其他事情之前先检查一下


如果数组在初始化后不会更改,则可以预先计算数组元素的哈希值。但是,除非我的第一条语句不适用(通常在检测到差异之前,您会深入数组),否则哈希可能不是最佳选择。

如果两个
数组中的一些
成员只有相同的项,那么它们被认为是相等的吗?或者它们必须以相同的顺序拥有相同的项吗?确实如此。只需重写
GetHashCode
并使其返回数组的哈希值,然后实现
Equals
,以便检查内部数组是否相等。然后,一本简单的
字典
就可以完成剩下的工作。不一定。GetHashCode()在.Net框架中有非常特殊的用途。确保相等的语义在此域特定定义和.NET假设(哈希代码可用于字典/哈希集成员身份)之间兼容。如果要重新定义
对象.Equals
,则重新定义
GetHashCode
是有意义的。如果通过重写
Equals
来实现这一点是有意义的,那么实现
GetHashCode
应该没有问题(只要遵循以下规则:)。如果没有,并且这只是您正在进行的某个比较,那么您可以尝试以另一种方式散列,但不重写
GetHashCode
。嗨,如果我在构建状态时创建了一个数组元素字符串,并将它们作为成员存储在状态类中,会怎么样?然后我只需要比较字符串。会更快吗?是的,订单很重要。实际上,除一个数组元素外,所有元素在每种情况下都几乎相同。因此,查找可以深入到数组的深处。