0

这是我的问题:

  • 我有两个班级:ClassObjClassProperty;
  • ClassObj(我们称它为lstProperty)的属性之一ListClassProperty(表示对象的当前实例具有的属性);
  • Array在运行时,我已经存储了所有可能的某个地方ClassProperty,我们将调用它Array arrPossibleProperty

我的问题是找到一种非常快速的方法来检查一个实例是否ClassObj匹配一个特定的集合ClassProperty(如果他有lstProperty一个ClassProperty给定的集合)。

我正在考虑创建一个array代表姿势Bit序列的ClassPropertyof ClassObj。使用Array arrPossibleProperty, 和他的索引作为参考Property

因此,例如,如果我们有 10 个属性,并且 aInstanceAClassObj第 1 个、第 4 个和第 9 个,我将生成这个位数组:1001000010

我的问题是,我如何检查例如(最快和最高性能的解决方案)位数组是否具有(例如)第三和第四属性?

当然,如果您需要有更高效的方法,请告诉我。

4

2 回答 2

1

您需要使用按位运算,例如&, |,^~(取决于您的需要)

以 1001000010 为例,要确定是否设置了第 3 位,您需要这样做:1001000010 & 0000000100 != 0000000000,或者更确切地说

bool isSet = myProperty & (1 << (option - 1)) != 0; // to find out if `myProperty` has the property `option` set.
myProperty |= 1 << (option -  1); // to set property `option`

有关按位运算的更多信息:http ://en.wikipedia.org/wiki/Bitwise_operation

或者,更容易实现的是使用枚举。

[Flags]
enum ClassProperty
{
    None = 0x00,
    First = 0x01,
    Second = 0x02,
    Third = 0x04,
    Fourth = 0x08
    // add more if needed
}

然后,你会像这样使用枚举

myProperty = ClassProperty.First | ClassProperty.Second; // sets both First and Second
bool thirdIsSet = myProperty.HasFlag(ClassProperty.Third);
于 2013-02-06T12:05:07.270 回答
1

您说所有可能的 ClassProperty-objects ( arrPossibleProperty) 的数组在运行时被初始化。然后我假设您不知道该数组可能有多大。这排除了枚举,根据定义,枚举是硬编码的。如果您改用您在问题中指出的某种位图,则需要在某些时候迭代 arrPossibleProperty您的 ClassProperty 列表lstProperty以进行映射和取消映射。

我的意思是,你做了很多假设,声称做这个位摆弄更快,而你实际上是在使用高级 C# 对象。永远不要假设。测试。措施。

这是一个与您的问题非常相似的问题,其中答案使用标准 .NET 库函数来执行您想要的操作:

HashSet<T>().IsSupertSetOf().

速度够快吗?然后使用它而不是使用位操作创建更多不可读的代码。

于 2013-02-06T12:15:24.350 回答