C#の質問です。
フラグとして使用できるように定義した列挙型HogeTypeを、
下記コードのvalues[(int)HogeType2.Type3]
のように配列のindexとして使用したいのですが、値が飛び飛びなので当然ながらできません。
values[(int)HogeType2.Type3]
のように配列の値を直接取得までの速さはできなくとも、Dictinary<HogeType,float>
よりも速い方法がありましたら教えていただきたいです。
(HogeTypeと1の論理積が1になるまでHogeTypeを右シフトして、右シフトした回数を配列のindexとする手法が最速でしょうか・・・)
よろしくお願いいたします。
cs
1public enum HogeType 2{ 3 Type1 = 1 << 0, 4 Type2 = 1 << 1, 5 Type3 = 1 << 2, 6} 7public enum HogeType2 8{ 9 Type1 = 0, 10 Type2, 11 Type3 12} 13 14public class HogeClass 15{ 16 public HogeClass() 17 { 18 float[] values = new float[] { 0.1f, 0.2f, 0.3f}; 19 20 float f = values[(int)HogeType.Type3]; // ←当然エラー 21 float f2 = values[(int)HogeType2.Type3]; 22 } 23} 24 25
配列のインデックスとして使いたいのに、値を飛び飛びにする理由は何でしょう?
フラグとして使用できるようにするためとなります。
フラグとして使うとありますが、
HogeType.Type1 | HogeType.Type2
こういう場合はどう扱うんですか?
正直質問からは何のためにenumを使用するのか全く見えてきませんので、目的を忘れて手段に固執しているような予感しかしません
クラスC1がフラグとして使用しないHogeType型の変数を持っている
クラスC2がフラグとして使用しないHogeType型の変数を持っている
クラスC1とクラスC2を型とするフィールドをそれぞれ持つクラスPが、C1,C2のHogeType型をFlag管理したい。
そしてHogeType型に紐付けた値を動的に切り替えたい(質問文のvalues)
クラスPが持つC1とC2のHogeTypeに紐付けた値(values)の合計値をいくつか知りたい
と思い質問いたしました(コードではなくわかりにくい文章ですみません)。
客観的に見て目的を忘れて手段に固執されているところがあればご指摘くださると幸いです。
それは目的ではなく手段です。目的の記述が皆無なので、目的を忘れて手段に固執しているように見えます。別の言い方をすれば、手段のことを目的だと思い込んでいるように見えます。
enumでフラグって書くからbitフラグかと思ったからの一つ目の疑問だったんですが、全く関係なさそうですね。「HogeType.Type1 | HogeType.Type2」を使用するなら「float[] values = new float[] { 0.1f, 0.2f, 0.3f};」なんてありえないけど言及がないので。
また、ひょっとしてこれが本来の目的?と思われるのは
>Dictinary<HogeType,float>よりも速い方法がありましたら教えていただきたいです。
ですが、.NET4.6以前を使用している場合でもなければintをkeyにした場合と比べても気にする必要がないレベルの速さらしいのでDctionaryのkeyにenumを使うと遅いからってのは過去のことのようです
ただ、Dctionary自体が遅いというのであれば、また別ですが、そのあたりも含めて質問に書いていないと質問で絞った範囲でしか回答が来ないので最善策にはたどり着けませんよ
意図がわかりにくい質問文であったことは否めません。
失礼しました・・・
回答5件
あなたの回答
tips
プレビュー