ふらっと C#,C♯,C#(初心者用) Part134

レス数が900を超えています。1000を超えると表示できなくなるよ。
2017/11/29(水) 19:23:58.05ID:GNLsbK4F0
「どんなにくだらない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
2018/02/02(金) 22:39:44.98ID:dT49NCpma
間違い

/*は*/を読み捨てしたらダメだなw
2018/02/02(金) 22:40:01.25ID:pft3AbU10
パーサジェネレータ使えよ
2018/02/02(金) 22:48:59.30ID:Zl28+evz0
>>826
それがわからない
文字列リテラルなのかコメントなのか判断できない
ダブルコーテーションから判定するとそれがコメントだったとき駄目
コメントから判定するとそれが文字列リテラルだったとき駄目
っていうパラドックス
2018/02/02(金) 22:52:11.72ID:dT49NCpma
>>829
それは変なやり方してるからだろ
おおかた正規表現などで判定してるんだろう

コードを頭から読んでできないのは
文法がおかしいかパースのやり方がおかしいからだ
2018/02/02(金) 22:56:57.54ID:dT49NCpma
急がないならどれかの言語のコードでもじっくり読んで勉強したらいい
大体の言語はオープンソースなので好きなのをやればいい
ただしc++の知識ぐらいはいる

急ぐならテストパターンを十分に用意して手あたり次第やればいい
2018/02/02(金) 23:08:58.70ID:Zl28+evz0
>>830
やけっぱちで
解析のコメント削除時に「//」か「/*」見つけたら同じ行の前側みて
文字列リテラル中かどうかみる処理入れて乗り切ってみた
2018/02/02(金) 23:10:39.49ID:z7oDIr3g0
>同じ行の前側みて
うん、かなり無茶苦茶だな
先頭から順に読んでいって、「今は文字列リテラル中」とか「今はコメント中」とかの状態を保持しておけよ
2018/02/02(金) 23:15:27.28ID:dT49NCpma
独自言語の解析してるんだろ?

他の部分が出来てるなら
普通に頭から読んでって "が出たらリテラルフラグオンにして
//が出たら行末まで読み捨て
/*だったら次の*/がでるまで捨てるだけ

何も難しくない
2018/02/02(金) 23:17:24.91ID:dT49NCpma
文字が抜けた

"が出たらリテラルフラグオンにして仕様通りリテラルを最後まで読み切るだけ
836デフォルトの名無しさん (ワッチョイ 7703-skLA)
垢版 |
2018/02/02(金) 23:18:02.29ID:HOyQOl0G0
独自言語が逐次実行される前提で話してるな
2018/02/02(金) 23:18:46.57ID:z7oDIr3g0
もしかして、1文字ずつじゃなく1行ずつ読み込んでるんじゃないだろうな
2018/02/02(金) 23:22:20.25ID:z7oDIr3g0
>>836
逐次実行じゃなくても、頭から順に読むのは同じだよ
読んだ物を構文木に積んでいって、評価・実行は最後にやれば良いだけ
2018/02/02(金) 23:24:38.81ID:yHy9QEH1a
>>829
難しく考えすぎでしょう。
>>826が言ってるのはたぶん単純なステートマシン。

enum State
{
  トークン探索中,
  文字列検出中,
  インラインコメント検出中、
  ....
}

stateを表すenumを定義して、stateの値に応じて動作を変えるだけ。
文字列リテラルの始め「"」やコメントの始まりを検出するのはstate = State.トークン探索中の時だけ。
素朴すぎるやり方だと思うが、少なくともこれでそんなパラドックスには陥らない
2018/02/02(金) 23:24:41.10ID:dT49NCpma
>>832
本当にめちゃくちゃだな
前方見ても意味ない
確定するためには本当に最初までさかのぼることになる
2018/02/02(金) 23:24:55.99ID:ErA95Rap0
>>834-835で答えが出てるのでこれ以上はスレの無駄遣い
2018/02/02(金) 23:27:13.14ID:HOyQOl0G0
>>838
横ぐるまを押したか
2018/02/03(土) 00:00:03.20ID:S/Wa3aFw0
>>840
大丈夫だよ
文字列リテラルって2行続かないじゃん確か
2018/02/03(土) 00:06:47.29ID:pHRpw+FT0
>>843
そんなのはルール次第
2018/02/03(土) 00:15:01.77ID:NdjAbgSB0
例えばC#なら@""で改行入れられるし
846愛知人!id:ignore (ワッチョイ 9775-jUAt)
垢版 |
2018/02/03(土) 00:17:09.98ID:GkUi/Itq0
そのときだけ行またげばいいだけだし
2018/02/03(土) 00:34:25.55ID:S/Wa3aFw0
>>845
ぎゃああああ
出来やがった

既存コードが解析の初っ端でコメント削除からやってるから
弄りたくなかったけど
いよいよ駄目だな
2018/02/03(土) 00:38:09.24ID:AuUEv0AE0
知らんかったんかいw

コメントは削除するんでなく、「読み捨てる」んだ
2018/02/03(土) 00:41:40.01ID:S/Wa3aFw0
>>848
いや、似非c#だからそんなことできんだろと
2018/02/03(土) 00:53:02.56ID:PxR3gYBlM
ヒアドキュメントを除いたとしてもしソースの先頭の/*をどうやってみつける?
状態を持たないならソースの頭までさかのぼるしかない
2018/02/03(土) 00:58:38.87ID:S/Wa3aFw0
>>850
いや、今のルーチンはコメントの削除からやってるのよ
2018/02/03(土) 01:03:27.72ID:OVqIgYtY0
コメントも文字列も先に始まったほうが勝つからどうしょうもない
2018/02/03(土) 01:06:21.86ID:PxR3gYBlM
質問しといて聞かないパターン=成長しない初心者パターン
2018/02/03(土) 01:12:38.71ID:xyf2cJ8Ka
ただ悩みを聞いて欲しかったんじゃないですか
女の相談事みたいなw
まあ、どうせ人も減ってるしそれもありでしょう
2018/02/03(土) 01:24:32.23ID:S/Wa3aFw0
>>853
いや、アドバイス通り
頭から読んでいくしかないっぽいっすね
クレームが来てるところがまさにそこなので誤魔化しが効かない
2018/02/03(土) 08:34:38.62ID:WhjNgY2U0
>>854
お姉さんが聞いてあげるわ。
今夜、川口駅リリア側の出入り口で待ってる
857デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 09:02:44.63ID:LvTBogUR0
swich() { case xxxx: ~
xxxxに変数をつかいたいのだが、switchに変わるものってなに?
2018/02/03(土) 09:33:50.59ID:NdjAbgSB0
if
2018/02/03(土) 09:53:42.04ID:nKXUpnsB0
>>857
xxxが数値か文字列なら変数だろうと使えたはずです。オブジェクトの場合、同値の判定が基本型のように単純じゃないから無理。
860デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 10:50:39.85ID:LvTBogUR0
switchi( (button)sender) ){
case Button1: ~
case Button2:~
case Button3:~
}
こんな感じのことがしたい。

〜はMethod()でいいので、
void switch_tb()= {
{Button1, Method1}
{Button2, Method2}
{Button3, Method3}
}
switch_suru((button)sender);
こんなことできんか? 
861デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 10:52:21.97ID:LvTBogUR0
C#はメソッドの中のローカルメソッドってできへんの?
2018/02/03(土) 11:00:14.66ID:VOrllN0n0
>>860
素直にButtonのNameプロパティ使え
2018/02/03(土) 11:01:41.64ID:Ns10a1iN0
>>861
C#7で出来るようになったよ
2018/02/03(土) 11:41:19.78ID:ZFgrbY8z0
糞化が止まらないのか。
2018/02/03(土) 12:15:40.34ID:7uT3RC1La
メソッド内メソッドは無くてもいい機能
メンバー封じ込めの方法はいくらでもあるし

ないほうがエラー見つけやすいと個人的には思う
866デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 12:24:29.31ID:LvTBogUR0
いい方法をみーつけ
2018/02/03(土) 12:24:59.79ID:ROxRBp/zr
バグだろwなにちょっと誤魔化そうとしてんのw
2018/02/03(土) 12:29:16.06ID:0dr4TWncd
>>864
言語の変化についていけないやつの糞化な
2018/02/03(土) 12:30:20.78ID:nKXUpnsB0
>>860
Buttonと関数のDictionaryでできそう
試してないけどこんな感じでメソッド取ってくれば…

Dictionary<Button, Func<T, TResult>>
2018/02/03(土) 12:31:12.90ID:7uT3RC1La
メソッド内メソッドはjavaでずっと使ってたけど
クラスを小さくしていくと使う場面は限られていく
2018/02/03(土) 12:33:37.55ID:Iq/kHIZ+0
初心者っぽくていいじゃん
「この機能が存在する意味が分からないんですけど、何の役に立つんですか?」
って定番の質問じゃん
872デフォルトの名無しさん (ワッチョイ f783-j4Dg)
垢版 |
2018/02/03(土) 12:40:45.58ID:ZFgrbY8z0
使ってる奴も糞ばっかになったな。新しい機能一つ覚えただけでマウンティングしだすアホとか。
なぜその機能が糞かが理解できない脳みそ。取り巻きからして残念な言語になってしまった。
873愛知人
垢版 |
2018/02/03(土) 12:41:41.35
あらら、怒っちゃった(笑)
2018/02/03(土) 12:43:15.80ID:8oBsvnpG0
>>860
上は>>862に追加して
if (sender is Button) switch ((sender as Button).Name)
{
case "button1":
case "button2":
}
isの判定とasのキャストはControlとかToolStripMenuItemでも状況に合わせて
2018/02/03(土) 12:45:57.31ID:DOsYwXsiM
今後も言語仕様はどんどん拡張されるよ
他の言語の有名なのどんどん取り入れてってカオスになっていく

個人的には範囲指定が欲しい
1..5か1:5みたいなの
876愛知人
垢版 |
2018/02/03(土) 12:50:20.68
Enumerable.Rangeじゃだめなん?
2018/02/03(土) 12:51:56.63ID:8eNVn+fl0
>>874
せめてnameof使って書けよ
2018/02/03(土) 12:56:57.86ID:DOsYwXsiM
foreach(var i in Enumerable.Range(1,5))

foreach(var i in 1..5)

どっちがいい?
2018/02/03(土) 12:58:29.57ID:8eNVn+fl0
圧倒的に上
2018/02/03(土) 13:02:13.44ID:kCPWN5tp0
>>860
ButtonのTagにやりたいこと突っ込んどけ
2018/02/03(土) 13:06:02.52ID:DOsYwXsiM
いい方法
buttun1.Click=>{Method1();};
882デフォルトの名無しさん (ワッチョイ f783-j4Dg)
垢版 |
2018/02/03(土) 14:17:08.45ID:ZFgrbY8z0
どう書いたらいいか分からないのが糞言語の証左。
883デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 15:26:42.67ID:LvTBogUR0
証左、難しい言葉をしってるね。

>>881
エラー 2 '=>' は無効です。
ってなるが、、、
2018/02/03(土) 15:30:37.45ID:d68F6UhId
>>874
こういう実装を参考にして欲しくないな
コントロールのプロパティを自由に修正できなくなるじゃん
885デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 15:33:25.80ID:LvTBogUR0
var aa = ((Button)sender).Equals(button1) ? func1() :
((Button)sender).Equals(button2) ? func2() :
func2();
これどう?
2018/02/03(土) 15:34:12.79ID:8oBsvnpG0
>>884
ButtonのName変更ってどんな実装に必要なんだよ・・・
887デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 15:39:26.04ID:LvTBogUR0
>ButtonのName変更ってどんな実装に必要なんだよ・・・

最初はBUtton1だろ。出来上がって綺麗に整理するときにbtnSetParamとか分かりやすく書き換える。
2018/02/03(土) 15:40:26.14ID:8oBsvnpG0
>>885
それならEqualsじゃなくてsender==button1?でいいよ。キャストもいらない
889デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 15:40:45.84ID:LvTBogUR0
Button.Nameをつかうくらいなら、Tagに書き込んだ方がまし。
890デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 15:41:39.80ID:LvTBogUR0
>888
あ、そうなん?
2018/02/03(土) 15:43:31.84ID:d68F6UhId
実装後にスペルミスに気付いた、他の画面との兼ね合いで名称を統一することになった、仮の名前をちゃんとした名前に置き換えた、とか色々あるだろ
リフレクションでデータ取得する方針のせいでガチガチに名前が決められている画面を作らされたときの面倒さったらなかったわ
892デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 15:43:52.16ID:LvTBogUR0
キャストしないとインテリセンスがでないから、キャストしたほうがいいよ。
2018/02/03(土) 16:57:11.29ID:Rh9ysymEa
こんなの考えたが、
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)と同じように変数の型に
依存するのか、それともオーバーライドと同じようにオブジェクトの型に依存ずるのか、どっちだっけ?
2018/02/03(土) 20:30:42.15ID:nKXUpnsB0
ふと思ったが、ふつうにそれぞれのボタンのイベントに実装したらダメなの
2018/02/03(土) 20:34:51.83ID:Zh144c7Y0
>>894
ほとんど共通でボタン毎にちょっとだけ処理が違うとかじゃね
896デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:11:27.96ID:LvTBogUR0
グループボックスにボタンを貼り付けて、それをコピーして貼り付けると、イベントが同じところになるだろ。
だからエディット都合だな。
イベントで分けるのが一番いい方法かもしれない。w
897デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:13:35.51ID:LvTBogUR0
再表示するために tabPage1.Controls.Add(grp);で追加したgrpだけをクリアするにはどうしたらいいの?
tabPage1.Controls.Clear(); やるとボタンが消えてしまう。
2018/02/03(土) 21:27:16.93ID:nKXUpnsB0
Controlsプロパティの型はControl.ControlCollectionで
そのクラスのドキュメントを見ましょう。
Remove(Control)というのがあったのでそれで削除できそうです。
899デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:35:57.81ID:LvTBogUR0
Removeを使うのはわかるんだが、要するになにがしたいのかというと
Linqを使ってControlsにAddしたGroupBoxだけを選択して、クリアしたいということ。
その書き方がわからない。ということ。
2018/02/03(土) 21:39:38.95ID:SzFJuxtQa
再表示とかクリアとか俺様な用語法されても何言ってるのか分からないよw
901デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:46:23.78ID:LvTBogUR0
tabPage1に貼り付けたコントロール群をLinqを使って選択的に消去したいということ。これでもわからん?
2018/02/03(土) 21:49:30.86ID:DOsYwXsiM
>>901
言葉が不自由なんですね
わかります
2018/02/03(土) 21:52:32.07ID:DOsYwXsiM
煽って悪かったけど
その書き方じゃ誰にもつたわらないよ

意味がわからないけどgrpを消したいならgrpをどこかに記録しておけばいい
終わり

はい次の方〜
904デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:54:28.34ID:LvTBogUR0
解決した。w
2018/02/03(土) 21:55:50.09ID:DOsYwXsiM
>>904
よかったね
言葉遣いや表現力だけ見ると小学生かなって思うけど
906デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 21:57:07.86ID:LvTBogUR0
>903
Keyになる言葉の意味がわからないと解らないと思うよ。それが解る人にはわかる。
2018/02/03(土) 21:59:39.27ID:bTwAHw5A0
なんでこいつこんなに偉そうなの?
2018/02/03(土) 22:00:08.72ID:DOsYwXsiM
小学生だから
2018/02/03(土) 22:08:58.48ID:SzFJuxtQa
var toRemove = tabPage1.Controls.Cast<Control>().FirstOrDefault( .... );
if (toRemove != null)
  tabPage1.Controls.Remove(toRemove);

これを1行にしたいってことだったのかな?
拡張メソッド使ってControl側に自分を包含するコンテナのControlCollectionを
引数に撮るメソッドを定義しないとできない気がする

何でもいいけど、冗長でもいいから分かるように書いて欲しいよね
910デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 22:13:41.72ID:LvTBogUR0
そんな書き方しかでけん?
2018/02/03(土) 22:16:15.65ID:DOsYwXsiM
>>897
これでスタートして答えをもらおうとして失敗

次に >>899 要するにと言ってるけど何も要してないどころか条件を追加してる

そして これ >>901 への流れ

トンチンカン
最初のレスでなぜ伝わると思ったのかが分からない
2018/02/03(土) 22:23:57.61ID:SzFJuxtQa
無理矢理だなあ
Action<Control> removeMe = x => x?.Parent?.Controls.Remove(x);
removeMe(
tabPage1.Controls.Cast<Control>().FirstOrDefault( .... )
);
913愛恥人
垢版 |
2018/02/03(土) 22:34:23.85
最初のレスだけで理解できる俺は天才なのか
2018/02/03(土) 22:38:53.52ID:SzFJuxtQa
むしろエスパー
2018/02/03(土) 22:43:30.44ID:DOsYwXsiM
そして明後日の方向のレスに食いついてる
916デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 22:54:26.09ID:LvTBogUR0
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でところどころ飛ばしてしまう。
917デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:19:59.77ID:LvTBogUR0
あっ、謎がとけた。けっこう落とし穴だな。
918デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:32:01.66ID:LvTBogUR0
ケツから消していくとうまくいくんだろきっと。
まえからでもこうやるとうまく行く。
    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);
             }
          }
919デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:33:46.33ID:LvTBogUR0
さて、原理は分ったが、これを1行で書くにはどうするのか?
920愛恥人
垢版 |
2018/02/03(土) 23:40:30.32
逆にグループボックス以外を抽出してからパネルの中身全消去からの追加とかはどうかな(>_<)
2018/02/03(土) 23:40:55.06ID:OIRW+vs20
>>919
改行全部消せばいいじゃん
2018/02/03(土) 23:43:21.17ID:pHRpw+FT0
>>918
>>916のLinqにReverse()追加すれば
2018/02/03(土) 23:43:41.06ID:OIRW+vs20
>>919
なんで1行にこだわってるの?
どれだけ読みにくいソースにできるか研究でもしてんの?
924デフォルトの名無しさん (ワッチョイ 179d-mIUl)
垢版 |
2018/02/03(土) 23:49:22.30ID:LvTBogUR0
>920 それ、俺もちょっと考えた。
>921 それは最終手段にとっておいたのに。

Reverse()ってあるんか? それだ!!
2018/02/04(日) 00:42:43.56ID:OrIb/jt1a
もう気が済んだかもしれんけど、無理に何でもインラインで書こうとして
可読性落とすなんて愚の骨頂で、普通にメソッドに外だし(別に拡張メソッドじゃなくてもいいけど)
した方がいいと思うけどね

public static class Extensions
{
  public static void RemoveChildren(this Control control, Func<Control, bool> predicate)
  {
    var controls = control.Controls;
    controls.Cast<Control>().Where(predicate).ToList().ForEach(x => controls.Remove(x));
  }
}
926デフォルトの名無しさん (ワッチョイ f7f7-NsDz)
垢版 |
2018/02/04(日) 05:54:59.74ID:vxeWu10H0
https://qiita.com/taigaaa2/items/7f05ad950a57033892ae
この方法で値を保存しているのですが
cドライブに保存されている様でプログラムを他のPCに移すなどすると値が保持されていません
どうすれば他のPCでも記憶した値を使える様になるでしょうか
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況