ふらっと C#,C♯,C#(初心者用) Part134
レス数が900を超えています。1000を超えると表示できなくなるよ。
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part133
http://mevius.5ch.net/test/read.cgi/tech/1510056685/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured >>824
やり方次第
作ったことあるのでわかりやすいのは文法をのままコードにする
頭から呼んでって状態を覚えておく
文字リテラル内は解析しないでエスケープルールや”の監視だけする
//や/*コメントの時は行末まで読み捨て >>826
それがわからない
文字列リテラルなのかコメントなのか判断できない
ダブルコーテーションから判定するとそれがコメントだったとき駄目
コメントから判定するとそれが文字列リテラルだったとき駄目
っていうパラドックス >>829
それは変なやり方してるからだろ
おおかた正規表現などで判定してるんだろう
コードを頭から読んでできないのは
文法がおかしいかパースのやり方がおかしいからだ 急がないならどれかの言語のコードでもじっくり読んで勉強したらいい
大体の言語はオープンソースなので好きなのをやればいい
ただしc++の知識ぐらいはいる
急ぐならテストパターンを十分に用意して手あたり次第やればいい >>830
やけっぱちで
解析のコメント削除時に「//」か「/*」見つけたら同じ行の前側みて
文字列リテラル中かどうかみる処理入れて乗り切ってみた >同じ行の前側みて
うん、かなり無茶苦茶だな
先頭から順に読んでいって、「今は文字列リテラル中」とか「今はコメント中」とかの状態を保持しておけよ 独自言語の解析してるんだろ?
他の部分が出来てるなら
普通に頭から読んでって "が出たらリテラルフラグオンにして
//が出たら行末まで読み捨て
/*だったら次の*/がでるまで捨てるだけ
何も難しくない 文字が抜けた
"が出たらリテラルフラグオンにして仕様通りリテラルを最後まで読み切るだけ もしかして、1文字ずつじゃなく1行ずつ読み込んでるんじゃないだろうな >>836
逐次実行じゃなくても、頭から順に読むのは同じだよ
読んだ物を構文木に積んでいって、評価・実行は最後にやれば良いだけ >>829
難しく考えすぎでしょう。
>>826が言ってるのはたぶん単純なステートマシン。
enum State
{
トークン探索中,
文字列検出中,
インラインコメント検出中、
....
}
stateを表すenumを定義して、stateの値に応じて動作を変えるだけ。
文字列リテラルの始め「"」やコメントの始まりを検出するのはstate = State.トークン探索中の時だけ。
素朴すぎるやり方だと思うが、少なくともこれでそんなパラドックスには陥らない >>832
本当にめちゃくちゃだな
前方見ても意味ない
確定するためには本当に最初までさかのぼることになる >>834-835で答えが出てるのでこれ以上はスレの無駄遣い >>840
大丈夫だよ
文字列リテラルって2行続かないじゃん確か >>845
ぎゃああああ
出来やがった
既存コードが解析の初っ端でコメント削除からやってるから
弄りたくなかったけど
いよいよ駄目だな 知らんかったんかいw
コメントは削除するんでなく、「読み捨てる」んだ >>848
いや、似非c#だからそんなことできんだろと ヒアドキュメントを除いたとしてもしソースの先頭の/*をどうやってみつける?
状態を持たないならソースの頭までさかのぼるしかない >>850
いや、今のルーチンはコメントの削除からやってるのよ コメントも文字列も先に始まったほうが勝つからどうしょうもない 質問しといて聞かないパターン=成長しない初心者パターン ただ悩みを聞いて欲しかったんじゃないですか
女の相談事みたいなw
まあ、どうせ人も減ってるしそれもありでしょう >>853
いや、アドバイス通り
頭から読んでいくしかないっぽいっすね
クレームが来てるところがまさにそこなので誤魔化しが効かない >>854
お姉さんが聞いてあげるわ。
今夜、川口駅リリア側の出入り口で待ってる swich() { case xxxx: ~
xxxxに変数をつかいたいのだが、switchに変わるものってなに? >>857
xxxが数値か文字列なら変数だろうと使えたはずです。オブジェクトの場合、同値の判定が基本型のように単純じゃないから無理。 switchi( (button)sender) ){
case Button1: ~
case Button2:~
case Button3:~
}
こんな感じのことがしたい。
〜はMethod()でいいので、
void switch_tb()= {
{Button1, Method1}
{Button2, Method2}
{Button3, Method3}
}
switch_suru((button)sender);
こんなことできんか? C#はメソッドの中のローカルメソッドってできへんの? >>860
素直にButtonのNameプロパティ使え メソッド内メソッドは無くてもいい機能
メンバー封じ込めの方法はいくらでもあるし
ないほうがエラー見つけやすいと個人的には思う >>864
言語の変化についていけないやつの糞化な >>860
Buttonと関数のDictionaryでできそう
試してないけどこんな感じでメソッド取ってくれば…
Dictionary<Button, Func<T, TResult>> メソッド内メソッドはjavaでずっと使ってたけど
クラスを小さくしていくと使う場面は限られていく 初心者っぽくていいじゃん
「この機能が存在する意味が分からないんですけど、何の役に立つんですか?」
って定番の質問じゃん 使ってる奴も糞ばっかになったな。新しい機能一つ覚えただけでマウンティングしだすアホとか。
なぜその機能が糞かが理解できない脳みそ。取り巻きからして残念な言語になってしまった。 >>860
上は>>862に追加して
if (sender is Button) switch ((sender as Button).Name)
{
case "button1":
case "button2":
}
isの判定とasのキャストはControlとかToolStripMenuItemでも状況に合わせて 今後も言語仕様はどんどん拡張されるよ
他の言語の有名なのどんどん取り入れてってカオスになっていく
個人的には範囲指定が欲しい
1..5か1:5みたいなの foreach(var i in Enumerable.Range(1,5))
foreach(var i in 1..5)
どっちがいい? >>860
ButtonのTagにやりたいこと突っ込んどけ いい方法
buttun1.Click=>{Method1();}; 証左、難しい言葉をしってるね。
>>881
エラー 2 '=>' は無効です。
ってなるが、、、 >>874
こういう実装を参考にして欲しくないな
コントロールのプロパティを自由に修正できなくなるじゃん var aa = ((Button)sender).Equals(button1) ? func1() :
((Button)sender).Equals(button2) ? func2() :
func2();
これどう? >>884
ButtonのName変更ってどんな実装に必要なんだよ・・・ >ButtonのName変更ってどんな実装に必要なんだよ・・・
最初はBUtton1だろ。出来上がって綺麗に整理するときにbtnSetParamとか分かりやすく書き換える。 >>885
それならEqualsじゃなくてsender==button1?でいいよ。キャストもいらない Button.Nameをつかうくらいなら、Tagに書き込んだ方がまし。 実装後にスペルミスに気付いた、他の画面との兼ね合いで名称を統一することになった、仮の名前をちゃんとした名前に置き換えた、とか色々あるだろ
リフレクションでデータ取得する方針のせいでガチガチに名前が決められている画面を作らされたときの面倒さったらなかったわ キャストしないとインテリセンスがでないから、キャストしたほうがいいよ。 こんなの考えたが、
public class CaseAction
{
public CaseAction(object @object, Action action)
{
Object = @object; Action = action;
}
public Action Action { get; private set; }
public object Object { get; private set; }
}
public static class Extensions
{
public static void Switch(this object o, params CaseAction[] caseActions)
{
caseActions.FirstOrDefault(x => x.Object == o)?.Action();
}
}
やっぱり使いづらそうだなw
ところで書いててちょっと思ったけど、==演算子の動作って隠蔽(new)と同じように変数の型に
依存するのか、それともオーバーライドと同じようにオブジェクトの型に依存ずるのか、どっちだっけ? ふと思ったが、ふつうにそれぞれのボタンのイベントに実装したらダメなの >>894
ほとんど共通でボタン毎にちょっとだけ処理が違うとかじゃね グループボックスにボタンを貼り付けて、それをコピーして貼り付けると、イベントが同じところになるだろ。
だからエディット都合だな。
イベントで分けるのが一番いい方法かもしれない。w 再表示するために tabPage1.Controls.Add(grp);で追加したgrpだけをクリアするにはどうしたらいいの?
tabPage1.Controls.Clear(); やるとボタンが消えてしまう。 Controlsプロパティの型はControl.ControlCollectionで
そのクラスのドキュメントを見ましょう。
Remove(Control)というのがあったのでそれで削除できそうです。 Removeを使うのはわかるんだが、要するになにがしたいのかというと
Linqを使ってControlsにAddしたGroupBoxだけを選択して、クリアしたいということ。
その書き方がわからない。ということ。 再表示とかクリアとか俺様な用語法されても何言ってるのか分からないよw tabPage1に貼り付けたコントロール群をLinqを使って選択的に消去したいということ。これでもわからん? 煽って悪かったけど
その書き方じゃ誰にもつたわらないよ
意味がわからないけどgrpを消したいならgrpをどこかに記録しておけばいい
終わり
はい次の方〜 >>904
よかったね
言葉遣いや表現力だけ見ると小学生かなって思うけど >903
Keyになる言葉の意味がわからないと解らないと思うよ。それが解る人にはわかる。 var toRemove = tabPage1.Controls.Cast<Control>().FirstOrDefault( .... );
if (toRemove != null)
tabPage1.Controls.Remove(toRemove);
これを1行にしたいってことだったのかな?
拡張メソッド使ってControl側に自分を包含するコンテナのControlCollectionを
引数に撮るメソッドを定義しないとできない気がする
何でもいいけど、冗長でもいいから分かるように書いて欲しいよね >>897
これでスタートして答えをもらおうとして失敗
次に >>899 要するにと言ってるけど何も要してないどころか条件を追加してる
そして これ >>901 への流れ
トンチンカン
最初のレスでなぜ伝わると思ったのかが分からない 無理矢理だなあ
Action<Control> removeMe = x => x?.Parent?.Controls.Remove(x);
removeMe(
tabPage1.Controls.Cast<Control>().FirstOrDefault( .... )
); private void button3_Click(object sender, EventArgs e)
{
var grps = tabPage1.Controls.Cast<Control>().Where(c => c is GroupBox );
foreach (var grpB in grps)
{
tabPage1.Controls.Remove(grpB);
}
}
これで一回で消えないのは何故だろう? grpsには全部のグループボックスが
入っている。しかしforeachでところどころ飛ばしてしまう。 ケツから消していくとうまくいくんだろきっと。
まえからでもこうやるとうまく行く。
private void button3_Click(object sender, EventArgs e)
{
var grps = tabPage1.Controls.Cast<Control>().Where(c => c is GroupBox );
List<GroupBox> gg = new List<GroupBox>();
foreach (var grp in grps)
{
gg.Add(grp);
}
foreach (var grpB in gg)
{
tabPage1.Controls.Remove(grpB);
}
} さて、原理は分ったが、これを1行で書くにはどうするのか? 逆にグループボックス以外を抽出してからパネルの中身全消去からの追加とかはどうかな(>_<) >>918
>>916のLinqにReverse()追加すれば >>919
なんで1行にこだわってるの?
どれだけ読みにくいソースにできるか研究でもしてんの? >920 それ、俺もちょっと考えた。
>921 それは最終手段にとっておいたのに。
Reverse()ってあるんか? それだ!! レス数が900を超えています。1000を超えると表示できなくなるよ。