0

これが私の問題です:

  • 私には2つのクラスがあります:ClassObjClassProperty;
  • ClassObj(それを呼びましょうlstProperty)のプロパティの1つは、ListClassPropertyオブジェクトの現在のインスタンスが持つプロパティを表す)のです。
  • Array実行時に、可能なすべての場所に保存しました。ClassPropertyこれをと呼びますArray arrPossibleProperty

ClassObj私の問題は、インスタンスが特定のセットに一致するかどうかをチェックする非常に高速な方法を見つけることですClassProperty(彼が特定のセットのlstPropertyすべてを持っている場合ClassProperty)。

そのポーズのシーケンスarrayBit表現するのを作成することを考えていました。、、および彼のインデックスを参照として使用します。ClassPropertyClassObjArray arrPossiblePropertyProperty

たとえば、10個のプロパティがあり、そのInstanceAうちClassObjの1番目が4番目と9番目である場合、次のビット配列を生成します。1001000010

私の質問は、たとえば、ビットの配列が(たとえば)3番目と4番目のプロパティを持っていることを(最も速くて最もパフォーマンスの高いソリューションで)確認するにはどうすればよいですか?

もちろん、これを行うためのよりパフォーマンスの高い方法が必要な場合は、私に知らせてください。

4

2 に答える 2

1

&、、、または(ニーズ|に応じて)などのビット演算を使用することをお勧めします^~

1001000010 & 0000000100 != 00000000001001000010を例にとると、3番目のビットが設定されているかどうかを確認するには、次のようにします。

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

arrPossibleProperty可能なすべてのClassProperty-objects( )の配列が実行時に初期化されると言います。次に、その配列の大きさがわからないと思います。これにより、定義上ハードコーディングされている列挙型が除外されます。代わりに、質問で示すようにある種のビットマップを使用する場合は、マッピングとマッピング解除を行うために、ある時点でarrPossiblePropertyClassPropertyのリストを繰り返す必要がありますlstProperty

私のポイントは、実際に高レベルのC#オブジェクトを操作しているときに、このビットをいじる方が速いと主張する多くの仮定を立てているということです。決して想定しないでください。テスト。測定。

これはあなたの質問と非常によく似た質問で、答えは標準の.NETライブラリ関数を使用して必要なことを実行します。

HashSet<T>().IsSupertSetOf().

それは十分に速いですか?次に、ビット演算ではるかに読みにくいコードを作成する代わりに、それを使用します。

于 2013-02-06T12:15:24.350 に答える