同時に複数のInputが入っていることも想定し、若いInput入力でbreak;をせず全Inputの状態を取得したいです。
現状上位桁が0の時、取り逃してしまいますね。
Input1が入っていることを条件にInput3はアクション可能というような使い方も想定しています。
enumを使うと判定をわかりやすく書けます(.NET Frameworkの場合は、HasFlag
は遅いで有名なので注意してください)
FlagsAttribute クラス (System) | Microsoft Learn
Enum.HasFlag(Enum) メソッド (System) | Microsoft Learn
ふと。もっと良い書き方、例えば配列を使ったりする方法もあるのではないか?と思った次第です
例えばbinaryStr[i]
のようにインデクサをお使いなので、配列を使っているのとほぼ同じことかと思います。
イヤなのはその後の、if
羅列のほうですよね。
i
やcount
を使って処理を共通化できるなら、if
羅列を消すことができるでしょう。
前回の質問の続きでしょうから寄せました。
WindowsフォームアプリケーションにてDllを使いたい
cs
1 using System ;
2 using System . Diagnostics ;
3 using System . Drawing ;
4 using System . Linq ;
5 using System . Windows . Forms ;
6
7 namespace Qvcazys1ngsxj93
8 {
9 public partial class Form1 : Form
10 {
11 private DataGridView dataGridView1 ;
12 private Timer timer1 ;
13 private object handle ;
14
15 public Form1 ( )
16 {
17 InitializeComponent ( ) ;
18
19 dataGridView1 = new DataGridView
20 {
21 AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode . Fill ,
22 Dock = DockStyle . Fill ,
23 Parent = this ,
24 } ;
25
26 dataGridView1 . Columns . Add ( new DataGridViewTextBoxColumn { HeaderText = "Board" , } ) ;
27
28 for ( int i = 1 ; i <= 8 ; i ++ )
29 dataGridView1 . Columns . Add ( new DataGridViewTextBoxColumn { HeaderText = $"in { i } " , } ) ;
30
31 dataGridView1 . Rows . Add ( "hoge" ) ;
32 dataGridView1 . Rows . Add ( "fuga" ) ;
33 dataGridView1 . Rows . Add ( "piyo" ) ;
34
35
36 timer1 = new Timer { Interval = 1000 , } ;
37 timer1 . Tick += Timer1_Tick ;
38 timer1 . Start ( ) ;
39 }
40
41 private void Timer1_Tick ( object sender , EventArgs e )
42 {
43 int xInput = Top16 . GetInputs ( handle ) ;
44
45 // 0埋めで8桁取得(上位桁の0を取り逃さないように)
46 string binaryStr = Convert . ToString ( xInput , 2 ) . PadLeft ( 8 , '0' ) ;
47
48 // 確認用(出力ウィンドウ)
49 Debug . Write ( $"\n { binaryStr } " ) ;
50 Debug . Write ( $" →逆順 { string . Join ( "" , binaryStr . Reverse ( ) ) } " ) ;
51 Debug . WriteLine ( $" →反転 { string . Join ( "" , binaryStr . Reverse ( ) . Select ( x => x == '0' ? '1' : '0' ) ) } " ) ;
52
53
54 // hoge行の処理
55 int count = 0 ;
56 foreach ( char inputBinaryNum in binaryStr . Reverse ( ) ) // 右が1なのでひっくり返す
57 {
58 count ++ ;
59 if ( inputBinaryNum == '0' ) // 0だったら入力有
60 {
61 Debug . Write ( $"Input { count } , " ) ;
62 dataGridView1 . Rows [ 0 ] . Cells [ count ] . Style . BackColor = Color . Blue ;
63 }
64 else
65 {
66 dataGridView1 . Rows [ 0 ] . Cells [ count ] . Style . BackColor = Color . White ;
67 }
68 }
69 Debug . WriteLine ( "" ) ;
70
71
72 // fuga行の処理
73 Flag flag = ( Flag ) ~ xInput ; // 各ビット反転してenumにキャスト
74 Debug . WriteLine ( flag ) ;
75
76 var row1 = dataGridView1 . Rows [ 1 ] ;
77
78 // ループにしずらいのでこういうのは向かないかなw
79 if ( flag . HasFlag ( Flag . Input1 ) ) row1 . Cells [ 1 ] . Style . BackColor = Color . Blue ;
80 else row1 . Cells [ 1 ] . Style . BackColor = Color . White ;
81 // 以下同じ意味
82 row1 . Cells [ 2 ] . Style . BackColor = flag . HasFlag ( Flag . Input2 ) ? Color . Blue : Color . White ;
83 row1 . Cells [ 3 ] . Style . BackColor = flag . HasFlag ( Flag . Input3 ) ? Color . Blue : Color . White ;
84 row1 . Cells [ 4 ] . Style . BackColor = flag . HasFlag ( Flag . Input4 ) ? Color . Blue : Color . White ;
85 row1 . Cells [ 5 ] . Style . BackColor = flag . HasFlag ( Flag . Input5 ) ? Color . Blue : Color . White ;
86 row1 . Cells [ 6 ] . Style . BackColor = flag . HasFlag ( Flag . Input6 ) ? Color . Blue : Color . White ;
87 row1 . Cells [ 7 ] . Style . BackColor = flag . HasFlag ( Flag . Input7 ) ? Color . Blue : Color . White ;
88 row1 . Cells [ 8 ] . Style . BackColor = flag . HasFlag ( Flag . Input8 ) ? Color . Blue : Color . White ;
89
90
91 // 複数条件はわかりやすい
92 //if (flag.HasFlag(Flag.Input1) && flag.HasFlag(Flag.Input3)) row.Cells[3].Style.BackColor = Color.Red;
93 // ↑↓意味は同じ
94 if ( flag . HasFlag ( Flag . Input1 | Flag . Input3 ) ) row1 . Cells [ 3 ] . Style . BackColor = Color . Red ;
95
96 // 意味のある名前を付けたければこうでもいい
97 //if (flag.HasFlag(Flag.Input1_and_3)) row.Cells[3].Style.BackColor = Color.Red;
98
99
100
101 //var row2 = dataGridView1.Rows[2];
102
103 //for (var i = 1; i <= 8; i++)
104 //{
105 // row2.Cells[i].Style.BackColor = Color.White;
106
107 // // インデックス(C# 8.0以上)
108 // // [インデックス/範囲処理 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C](https://ufcpp.net/study/csharp/data/dataranges/)
109 // if (binaryStr[^i] == '0') row2.Cells[i].Style.BackColor = Color.Blue;
110 //}
111
112
113
114 //row2.Cells[3].Style.BackColor = binaryStr switch
115 //{
116 // // Input1・Input3の入力があり、Input8の入力がなければ。。。
117 // ['1', .., '0', _, '0'] => Color.Green,
118
119 // // Input1・Input3(・Input8)の入力があれば。。。
120 // // ↑に当てはまらない時なのでここに入るのはInput8もONなことになる
121 // [.., '0', _, '0'] => Color.Red,
122
123 // [.., '0', _, _] => Color.Blue, // Input3の入力があれば。。。
124
125 // _ => Color.White, // default
126 //};
127
128
129
130
131 }
132
133 [ Flags ]
134 enum Flag : byte
135 {
136 None = 0 ,
137 Input1 = 1 ,
138 //Input1 = 0b0000_0001, // こうのほうがわかりやすければそれでもいい
139 //Input1 = 0b1111_1110, // こうはダメ!
140 Input2 = 2 ,
141 Input3 = 4 ,
142 Input4 = 8 ,
143 Input5 = 16 ,
144 Input6 = 32 ,
145 Input7 = 64 ,
146 Input8 = 128 ,
147
148 Input1_and_3 = Input1 | Input3 , // 複数条件に意味のある名前を付けたければ
149 }
150
151 private class Top16 // 雑いw
152 {
153 private static Random random = new Random ( ) ;
154 public static int GetInputs ( object handle ) => random . Next ( 256 ) ;
155 }
156 }
157 }