変数が値の「リスト」の値と等しいかどうかを判断する最も簡潔な方法
-
09-06-2019 - |
質問
C# に変数があり、それが一連の変数の 1 つと等しいかどうかを確認する必要がある場合、最善の方法は何ですか?
セットを配列に保存するソリューションを探しているわけではありません。私は、答えを得るために何らかの方法でブール論理を使用する解決策があるかどうかを確認することにもっと興味があります。
次のようなことができることはわかっています。
int baseCase = 5;
bool testResult = baseCase == 3 || baseCase == 7 || baseCase == 12 || baseCase == 5;
もっとこのようなことができるかどうか知りたいです:
int baseCase = 5;
bool testResult = baseCase == (3 | 7 | 12 | 5);
明らかに上記は機能しませんが、テスト値ごとに同じ変数を何度も繰り返す必要がある最初の例よりも簡潔なものがあるかどうかを確認することに興味があります。
アップデート:
それが最も簡単なアプローチのように見えるため、CoreyNの答えを受け入れることにしました。実践的でありながら、初心者でも理解しやすい内容だと思います。
残念ながら、私が働いている場所では、システムは .NET 2.0 フレームワークを使用しているため、すぐにアップグレードする可能性はありません。私が思いつく最も明白なソリューション以外に、.NET 3.5 フレームワークに依存しない他のソリューションはありますか?
new List<int>(new int[] { 3, 6, 7, 1 }).Contains(5);
解決
bool b = new int[] { 3,7,12,5 }.Contains(5);
他のヒント
T の配列が IList<T> を実装し、IList<T> には Contains メソッドがあるという事実を利用して、.NET 2.0 でも同様のことを行うことができます。したがって、以下は Corey の .NET 3.5 ソリューションと同等ですが、明らかに明確ではありません。
bool b = ((IList<int>)new int[] { 3, 7, 12, 5 }).Contains(5);
私は配列宣言、または少なくとも 1 次元配列引数を渡すために IList<T> をよく使用します。つまり、Count などの IList プロパティを使用して、配列からリストに簡単に切り替えることができます。例えば。
private readonly IList<int> someIntegers = new int[] { 1,2,3,4,5 };
入力としてどのタイプのデータがあるかを指定していないため、入力を 2 のべき乗 -> 2,4,8,16... に分割できると仮定します。これにより、ビットを使用して、テスト値が入力内のビットの 1 つであるかどうかを判断できるようになります。
4 => 0000100
16 => 0010000
64 => 1000000
二進数計算を使用して...
テストリスト = 4 + 16 + 64 => 1010100
テスト値 = 16
testResult = testList & testValue