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

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 2317-qMUn)
垢版 |
2018/12/15(土) 11:07:07.89ID:0aSEF/I+0
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part139
https://mevius.5ch.net/test/read.cgi/tech/1538646998/
■コードを貼る場合は↓を使いましょう。
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
2019/01/06(日) 20:13:20.52ID:NF88G39c0
>>173
ttps://dobon.net/vb/dotnet/programing/arraymap.html
これでいけんじゃね?
ConvertAll
2019/01/06(日) 21:11:45.37ID:iQ1zVEqTM
>>170
AWSとか使えば簡単だよ
MSの推奨はもちろんAzureだけど、単なるVMのホスティングサービスとして使う以上のことを期待すると正直ゴミカスなので全くお薦めできない
2019/01/06(日) 21:17:12.87ID:iQ1zVEqTM
>>176
今時ConvertAllとか紹介してるゴミサイトはさっさと閉鎖すべき
2019/01/07(月) 00:48:07.98ID:voJmrOTp0
>>178
今だと何がベスト?
2019/01/07(月) 09:13:26.65ID:yGBdcOaa0
>>175>>176
いけました!
ありがとうございます
今回はSelectManyを使おうと思います
2019/01/07(月) 09:34:56.37ID:z57KVTQ70
>>166
考え方としては、例えば「3」が入力された時点で
次の入力結果は「3」か「30」〜「39」しかありえないから
11通りの2進数表示を用意しておいて次のキーが押されたらそこで合うものを選んで表示する
どんなに10進数の入力桁数が増えても毎回11通り用意すればいいのは一緒なのと
10進数が1桁増えるときに2進数表示で最後の4桁以外の文字列は使い回せるから文字列連結処理は多少減らせる

この処理がユーザーのキー入力速度より早くCPUが処理できれば多少意味がある程度だろうけど
2019/01/07(月) 10:20:00.74ID:e8LT8JMZa
>>181
そのためにReadKeyを繰り返してたらそのオーバーヘッドの方が効果を圧倒的に上回ります
出直してきてください
2019/01/07(月) 10:28:19.23ID:3j9bnJUUM
>>181について更にツッコむと、1文字ずつ処理するなら単に入力されたキーの値を普通に反映させていけばよい
わざわざ候補を事前に用意してGCに負担をかける意味は全く無い
2019/01/07(月) 15:22:57.85ID:Nhl1xZLpa
チラシを見てキャベツが1円安いからと電車賃300円払って遠くのスーパーまで買いに行くような無駄な努力に思える。
2019/01/07(月) 19:03:54.28ID:RNZAQQS50
ネタを元にボケてるだけかと思ったら
2019/01/07(月) 19:56:07.52ID:ukOyD8nn0
Json.NETを使ったデシリアライズについて教えてください。
以下のようなJsonファイルを読み込んで、リストにデシリアライズをしたいです。

[
{
"email": "foo.example.com",
"active": true,
},
{
"email": "bar.example.com",
"active": false,
}
]

しかし、デシリアライズ時に、オブジェクトが2つ以上会い場合に例外が発生します。
using ( var sr = new StreamReader( @".\accounts.json" ) )
{
var accounts = JsonConvert.DeserializeObject<List<Account>>( sr.ReadToEnd() );
}

例外
Newtonsoft.Json.JsonSerializationException

エラーの原因はわかるのですが、解決策が思いつきません。
よろしくお願いします。
2019/01/07(月) 20:12:15.21ID:RNZAQQS50
デシリアライズではまる前に
オブジェクトをシリアライズして、どういうjsonが出来るか確認することを勧める
2019/01/07(月) 20:34:39.02ID:ukOyD8nn0
>>187
オブジェクトが単体の時は[]で囲まれていなかったので、
配列として認識されないような気がします。

もう一度考え直してみます。
ありがとうございました。
2019/01/07(月) 20:52:50.47ID:voJmrOTp0
parser通さずに自力解析した方が早そうw
2019/01/07(月) 21:41:14.56ID:EmaCRb9M0
>>186
うちの環境ではそのままで読み込めた。w
ああ、json ファイルのパスや、クラスをフルパスで書くように直したりはしたけど。
あと List<Account> を Account[] に変えてみても動作した。

json パーサは Newtonsoft.Json でいいんだよね?
ひょっとして json ファイルの文字コードや改行コードの問題だったりして。VS2017 で試した。
2019/01/07(月) 22:00:13.12ID:RNZAQQS50
まあ結論としては只の配列よねw
List<>が勝手に出てくる訳もなく
2019/01/07(月) 22:27:36.78ID:LR2ZtPQc0
>>181
「10進数が1桁増えるときに2進数表示で最後の4桁以外の文字列は使い回せるから文字列連結処理は多少減らせる」
の意味がわからない。
2019/01/07(月) 22:49:30.37ID:ZGeLga+2M
BCD?
2019/01/07(月) 23:07:28.05ID:7iifCEQOa
>>191
アホ?
デシリアライズ先の型としてList<>を指定してるんだからどう見ても勝手に出てきてはいないでしょ
普通にデシリアライズできるよ
2019/01/07(月) 23:26:43.60ID:PUyuVhSj0
>>192
単純に勘違いだろ。16進数から2進数への変換なら成立するけど
例えば251と256の2進数の下4桁が違うのはすぐわかる
質問引っ張るのもまずいけど元の質問者もフィードバックくらいしてほしいな
2019/01/07(月) 23:45:26.56ID:RNZAQQS50
json.netはList指定いけたわ
低速過ぎて最近使ってなかった
失礼した
197デフォルトの名無しさん (ワッチョイ a994-mHCk)
垢版 |
2019/01/08(火) 01:42:19.06ID:+TBsMqqs0
9時と13時に定期的に作業を実行させたいので、タイマーを使ってプログラムを書きました。
似た部分が多いのでタイマー自体を配列化したのですが、「動作を停止しました」とエラーが出て動きませんでした。
タイマーの配列化って無理なんでしょうか?

System.Windows.Forms.Timer[] timerOnce = new System.Windows.Forms.Timer[2];
public GetControlsList()
{
myTimerOnce(timerOnce[0], "9:00");
timerOnce[0].Tick += new EventHandler(timerOnce_Tick);
}

// 指定時刻までの時間を計算して、Intarvalにセット
private void myTimerOnce(System.Windows.Forms.Timer thisTimer, string setTime)
{
//現在の時刻から、ターゲット時刻までのインターバルを算出
TimeSpan mySpan = DateTime.Parse(DateTime.Now.ToString("yyyy/MM/dd ") + setTime) - DateTime.Now;
int sleepSec = (int)mySpan.TotalMilliseconds;
thisTimer.Enabled = true;// タイマ ON
thisTimer.Interval = sleepSec; // 更新間隔
}

// 指定時刻になったらmethodを実行
void timerOnce_Tick(object sender, EventArgs e)
{
//実行したいメソッド
}
2019/01/08(火) 06:44:44.69ID:dT41V3TC0
アドバイス頂いた通りシリアライズを見直したところ解決しました。

var account = new Account { Email = "hogehoge.example.com", Active = true, };
using ( StreamWriter sw = File.CreateText( @".\accounts.json" ) )
{
var jw = new JsonTextWriter( sw ) { Formatting = Formatting.Indented };
new JsonSerializer().Serialize( jw, account );
}

このように書いていたので、accountをリストに変換してから行うようにしました。
new JsonSerializer().Serialize( jw, new List<Account> { account } );

レスくれた皆さん、ありがとうございます。
こちらもVS2017なのできっと文法違いが原因です。
Json形式を勉強し直します。
2019/01/08(火) 08:12:51.74ID:mtJIt88ca
>>197
そもそもWinFormsのタイマーは精度や信頼性がとても低く、時間の計測に使ってはいけない
あくまで「時々処理をさせたい」だけのときに使うもの
あなたのケースならタスクスケジューラを使うのが定石です
2019/01/08(火) 09:49:22.14ID:Sw3FA19SM
>>197
配列をnewしただけで中身のTimerをnewしてないからじゃないの
2019/01/08(火) 09:53:57.24ID:Sw3FA19SM
まずデバッグ実行することを覚えた方がいい気がしないでもない
2019/01/08(火) 12:12:53.32ID:+TBsMqqs0
>>200
まさにそれでした。
1行加えただけで解決しました。ありがとうございました。
2019/01/09(水) 07:23:03.10ID:fI4baLQf0
本当に初心者質問ですが、ライブラリはimportとnamespaceから書いていくのと、どちらが良いのでしょうか

もしくは使い分けがあるのでしょうか
2019/01/09(水) 07:48:48.51ID:c4aAB3Aqd
>>203
ここC#スレやで
2019/01/09(水) 12:18:51.14ID:fI4baLQf0
>>204
C#はusingですけどスコープ内でオブジェクト破棄する機能もusingと呼称してるので混乱しないようにimportと表現しました

なんで2つの記述方法を許しているのか、何か意味があるのか気になりまして
2019/01/09(水) 12:21:16.40ID:c4aAB3Aqd
>>205
c#にもimportはあるから余計混乱するだけ

名前空間とusingsは全然用途違うでしょ?
2019/01/09(水) 12:21:41.32ID:c4aAB3Aqd
C#というかMSBuildだけど
2019/01/09(水) 14:41:58.83ID:2h2JyjUc0
>>203
名前空間の全表記は可読性下げるので使ってないな
VSでカーソル当てれば名前空間表示されるし、今時テキストエディタでゴリゴリ書いている人でもなければ全表記する必要ないと思う
2019/01/09(水) 14:52:14.20ID:TKkGGOqYM
>>208
MediaのcolorとDrawingのcolorが混在してるときはぶっ潰したくなる
2019/01/09(水) 14:55:45.81ID:TKkGGOqYM
pathってファイルパスじゃなくて
曲線かよ死ねよとか
省略形でも違いがあったほうが絶対いい
2019/01/09(水) 19:11:30.62ID:5txyXp0A0
>>203
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-directive
usingでググればここに理由も呼び分け方(using ディレクティブ)も出ている
一般的な呼び名を使わないと調べることすらできなくなるよ
2019/01/10(木) 13:13:55.78ID:lMztlpGar
>>209
そういうの他にもある
2019/01/10(木) 20:09:22.40ID:9xQ4gBbQa
P/InvokeやCOM相互運用を書くときに
System.Runtime.InteropServices.ComTypes以下の構造体やインターフェースを使う時があるんだけど
System.Runtime.InteropServices以下に同名の物があるから、大体の場合で完全修飾かusing alias directiveが必要になって面倒なんだよなあ
.Net1.1時代の後方互換性のためにObsolete付きで残してあるんだろうけど邪魔で仕方がない
2019/01/11(金) 12:39:13.44ID:qc15f1nfD
>>211
その名前を知る事が大変ですよね
沢山本読むしかないんでしょうけど
2019/01/11(金) 12:57:28.29ID:RbVY6SmB0
>>214
この話はusingの話で質問した人もわかっているし
わからないなら分からないなりに説明したらいいだけ
オレオレ用語使ってこんなところで質問するのは普通におかしい
216デフォルトの名無しさん (ワッチョイ a57c-Iup+)
垢版 |
2019/01/11(金) 13:29:58.48ID:5RUmP2fm0
スレ間違えたことを嘘に嘘を塗り固めるのは朝鮮人の始まり
2019/01/11(金) 14:37:44.48ID:225AU0sE0
ちょっと教えろください。
int型変数二つの足し算でオーバーフローするかどうかチェックしたいのですが、
@decimalにキャストして足し算した結果がintの範囲に収まっているかif文で判断
Atry catchで例外をつかまえる
どっちがいいのでしょう?
2019/01/11(金) 14:40:44.08ID:86XGb19RM
>>217
Bdecimalではなくlongにキャストして足し算した結果がintの範囲に収まっているか判断
2019/01/11(金) 15:54:41.82ID:r18fheRy0
>>217
int_max - a < bなら
a + b < int_maxが成り立つ
でも>218のほうがわかりやすいとは思う
2019/01/11(金) 17:49:49.09ID:1orv+xc30
俺がjavaerという事がバレちまったらしょうがねえ

なんだよusingってよ
vb如きだってjavaリスペクトしてんぞ
2019/01/11(金) 18:29:52.22ID:KWycMyC0a
>>217
オーバーフローは同じ符号の値を足した時にしか起こらず、起こった場合は前後で符号が変わる。
他の人が見ても何やってるか分かることが重要ならそれで判定するのが一番だと思う
2019/01/11(金) 18:33:43.65ID:KnmjjSvJM
ラップアラウンドとサチュレーションって学生のときに聞いたのが最後だ
2019/01/11(金) 18:40:14.66ID:fFtOgUz40
すみません、初めて見る構造体が出て来たのですが

[StructLayout(LayoutKind.Sequential)]
struct INITCOMMONCONTROLSEX
{
public int dwSize;
public uint dwICC;
}

これは何構造体と読むのですか?
2019/01/11(金) 18:45:24.19ID:1+lzGhU1M
つまらん!

お前の話はつまらん!
2019/01/11(金) 18:46:13.28ID:eF6moy/g0
>>223
https://ufcpp.net/study/csharp/interop/memorylayout/
>Sequentialレイアウトでは、複合型のフィールドは宣言した順序通りにレイアウトされます。
2019/01/11(金) 18:49:12.65ID:1+lzGhU1M
イニシャライズコモンコントロールズイーエックス構造体
2019/01/11(金) 18:51:24.03ID:zVvjOIcHa
>>223
構造体名で検索したらInitCommonControlsEx関数が出てくるじゃろ
2019/01/12(土) 00:09:08.43ID:iaJ8ArIE0
VS2017でC#のプログラムを組んでます。

はじめてVS2017を使うのですが、画面の下に


準備完了 ↑ソース管理に追加

という邪魔なバーが表示されてます。
VS2010にはありませんでした。目障りなのでこれを消したいのですが何か方法はありますか?
2019/01/12(土) 00:20:55.22ID:Fl9Ups4U0
>>228
ツール->オプション、環境->全般、ステータス バーを表示するのチェックを外す
2019/01/12(土) 00:21:44.23ID:iaJ8ArIE0
>>229
ありがとうございます!!目障りだったんですよね。
2019/01/12(土) 01:04:45.40ID:CChJ5ept0
色々迷ったけど
オートフォーマットはOFFにした
2019/01/12(土) 03:22:33.67ID:S1bCJ3S10
例外処理(に限らず、エラー処理)ってどこまで徹底して行うべきなんでしょうか?
下みたいに、使うインスタンス片っ端から毎回nullチェックとかしてたら、凄まじいコード量になるんですが・・・・・
if(obj == null)
{
return msg;
}
2019/01/12(土) 03:53:00.80ID:ejfouP+Ya
>>232
さあ。
でもバグと例外は区別した方がいいんじゃないか。

そのコードは多分バグを想定してるんだよね?
絶対にとは言い切れないが、バグを想定してそれを検出するifは書かないのが普通じゃないか
いやライブラリみたいなものを作ってるならバグを想定して例外を投げるのは普通だけど
2019/01/12(土) 03:58:46.63ID:ejfouP+Ya
最後の行は引数のチェックの話ね
2019/01/12(土) 04:03:08.28ID:2xT9w9620
return msg
してるから まず例外をちゃんと使えてないんじゃ疑惑
2019/01/12(土) 04:04:51.50ID:DC6KrvaN0
デザインパターンでnullオブジェクトパターンみたいの参考にするのは?
2019/01/12(土) 04:12:05.96ID:DC6KrvaN0
nullが入るケースがあることを想定している場合にnullチェックを全部書くのがめんどいならnullオブジェクトパターン適用すればいいし
本来はnullが入ってたらおかしいケースならエラーを起こして拾わせるのが正しい構造って回答でいいのかな?
2019/01/12(土) 04:17:50.15ID:2xT9w9620
・nullが来ない想定ならチェック不要
・nullケース考慮したくないならnullオブジェクトパターン
・null来た場合にぬるり以外で知らせるならチェックする
・nullのネスト面倒ならnull条件演算子

こんな感じやろか
null非許容参照型使うという手もあるが
2019/01/12(土) 08:05:30.51ID:VHzQIvd20
読んでる入門書のLINQとラムダうんたらってのが分からなくて
手がstopしてしまっているのですが入門者向けに分かりやすく解説されてるページなど教えていただけないでしょうか?
メソッドの使い方はある程度分かったのですがそれじゃ駄目なんすかね…
2019/01/12(土) 08:39:26.90ID:0dPYYJK00
>>239
LINQやらラムダ使えなくても動くものはつくれるからまぁまずは作ってみよう
2019/01/12(土) 10:13:12.90ID:iaJ8ArIE0
最近は、自分でプログラム組まずにランサーズでハイスキルな奴に外注してるわw
中抜きでうま〜〜〜
2019/01/12(土) 10:35:45.31ID:e9xF8Gpoa
>>232
チームの方針次第
うちの場合は

nullを許可しない引数と返り値は基本的に全てチェックして例外を投げてる
めんどくさいと思うかもしれないがFluentAssertionのようなライブラリを使えばそこまで大きな負担にはならない

nullオブジェクトパターンはやればわかるがチェックするよりも手間がかかる
また必ずしもnullの場合の適切な動作を定められるとは限らない
適切でない場合にパターンを適用するとそれがnullオブジェクトかどうかチェックするといった本末転倒なことになりかねない
なのでこれが最も適切と確実に判断できる場合を除いて使用しない

C# 8.0が待ち遠しいね
2019/01/12(土) 10:44:33.52ID:CChJ5ept0
>>232
仕様と設計で解決する問題
エラーが出たときどうしたいの?
エラー出たときに別に原因とかわからんでええなら一連の処理をtrycatchで囲ったらええやん
なんか起きたらcatchに入ってくるで
2019/01/12(土) 17:18:08.40ID:XDHakXaX0
>>232
外部とのやりとりの場所は結構厳重にチェックを入れる。
自分で書いているところは適当に流す。

外部とは当該館数のパラメータや、呼び出す関数とかの戻り値ね。
try catch で囲んで、チェックして例外発行して、catch 内でまとめてトレース情報込みでログ出してスローするくらいなら大した手間じゃないじゃない。
その例なら if( obj == null ) throw new ArgumentNullException("ぼーっと生きてんじゃねーよ!"); で済む話じゃん。

>>239
コピペでもいいからたくさん書いてみる。で解決するよ。
やってるうちに理屈が分かるようになる。
2019/01/12(土) 17:23:52.90ID:iaJ8ArIE0
昔は開発現場でこっそりExcel型の2chブラウザでネットサーフィンばかりしてたな〜
座ってるだけで月70万むっちゃらくやった
2019/01/13(日) 00:23:58.00ID:X0+RFgX60
>>239
駆け出し時代オープンソース改造してた時にLINQはパフォーマンス悪いと思って見つけ次第foreachに手直しするという逆工程でLINQとラムダ式マスターした
2019/01/13(日) 00:46:53.42ID:IIPQpabmp
使えば勝手にlinqの快感にハマって抜け出せなくなる
2019/01/13(日) 04:21:19.42ID:qwE0jZig0
麻薬のような機能だなw
2019/01/13(日) 09:07:48.83ID:Xn8IPTP50
LINQもRxも使いだすと元に戻れなくなる

でも性能気にしてstructとforeachに書き直し始めると時間足りない
2019/01/13(日) 09:32:12.32ID:Z+h8nfOL0
>>246
パフォーマンスのためならなんでforにしなかったん?
2019/01/13(日) 18:27:15.40ID:X0+RFgX60
>>250
Listはしてたよ
あとラムダ式はLINQ→foreachより行数減らす意識持って1行メソッドを見つけ次第ラムダ式に直す工程で習得したな
2019/01/14(月) 23:20:39.35ID:3wGjtMyb0
ComboBoxに例えばA〜Dと4つ項目が入っていて、A〜Cは同一計算方法でDのみ特別な計算方法でコード内容が異なり且つ色んな計算をする為コードが長くなる場合の見やすくする為の最初の分岐方法とか書き方とかありませんか?
今はifで分岐した中にあれこれ結果を取ってきて結果を出してるのでifがやたら長く見辛いです。なんかいい方法があれば教えて頂きたいです。
2019/01/14(月) 23:31:33.99ID:CBheeOs80
LINQ使うと元に戻れなくなるのはわかるんだけどデバッグしづらくね?
デバッグを想定する時点で初心者なのかな...教えてエロい人
2019/01/15(火) 00:45:24.53ID:DUfu4s9fa
>>252
4っつぽっちの分岐で何がそんなに見づらくなるのかちょっと理解できんよ。
いや、煽ってるわけじゃなく本当に

各分岐先のコードが長くなるっていうのならそれぞれメソッドに切り分けるだけじゃないの?
2019/01/15(火) 02:09:17.70ID:gvlEsXBIp
>>252
if(value == d){
d用処理またはメソッド
}else {
a〜c用処理またはメソッド


これじゃダメなの?
2019/01/15(火) 04:09:30.23ID:Vsgk6Uc3K
>>252
ComboBoxにブチ込むためのクラスを書いてDは継承
2019/01/15(火) 06:09:12.86ID:rjgxVR8i0
LINQはなかなか身につかんなあ。
とりあえずforで書いといて見直してこれLINQで一行になるんじゃね?と気付いたらいそいそと書き直す感じ。
LINQ脳になってない
2019/01/15(火) 06:39:49.84ID:OSSPo6bD0
例えば処理順を意識しなくて良い場合、通常のforまたはforeachで処理するのと、Parallel.ForEachで並列処理するのはやはり並列処理の方が早い?
2019/01/15(火) 07:24:38.34ID:ohj/8QmzM
>>255
質問者の意図とは違うかもしれんがそういうコード書くと怒るやつがいた職場がある
わざわざ継承してうにゃうにゃやらんと怒る
んでできたコードが何がいいのか考えてもさっぱり意味がわからん
本人にメリットを聞いてもさっぱり理解できんというかメリットの話になると必ずボケた返しをする
ありもしない改修を想定してキチガイとしか思えない発言を連発する
そもそも仕様書や設計書に処理がその数で分岐するってあるのに
なんで普通に書いたら怒るんだよ
もうお前とはやってられん
ってとこまでいって仕様書や設計書通りに組んでるのに工数が増えてるのはあんたのせいだ
って会社間の会議になってもまだグチグチ言ってる
その場にいる全員?な状態だった
2019/01/15(火) 08:37:28.18ID:biF9zsRRd
環境次第
2019/01/15(火) 08:41:56.04ID:AEHaNlhRa
>>259
条件分岐が減るとかじゃないの?
それだけ不具合が減る理屈だが、工数が増えてるんじゃ意味ないな
2019/01/15(火) 08:50:45.78ID:OahWWfOzM
普通のケースでは継承にしても
条件分岐が別の場所に移動するだけだべ
2019/01/15(火) 09:24:06.17ID:n85zJfLmM
>>258
Parallel.ForEachはオーバーヘッドが大きい
一周に数百ミリ秒かかるくらいの粒度の大きなループでない限りは普通のforeachより確実に遅くなる
2019/01/15(火) 10:26:04.16ID:fix0rts+0
多態性は手間がかかる割に恩恵が少ないよな
2019/01/15(火) 16:18:48.41ID:R0UqBAnw0
>>257
foreachならともかくforで書いているなら苦労するだろう
2019/01/15(火) 16:22:04.50ID:R0UqBAnw0
>>259
逆のパターンなら数多見てきたけど、そのパターンは珍しいな
if分岐が10以上になるからなんとかしてと言われて継承使ったプロトタイプ渡したら、なぜか基底クラスでif文復活してたことならあるけど
2019/01/15(火) 16:36:00.01ID:0qvQfApDM
C#のforeachってpythonみたいに定義しないでindex取得出来ませんか?forにするしかないでしょうか?
268デフォルトの名無しさん (ブーイモ MM9a-RNo8)
垢版 |
2019/01/15(火) 16:37:26.00ID:Oh+57Mh2M
[_]
2019/01/15(火) 16:53:35.12ID:XrO54/Dg0
>>267
foreach単体じゃ無理

Enumerable.Select Method
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.select?view=netframework-4.7.2
2019/01/15(火) 17:42:13.30ID:AbSveg4gd
>>267
上のSELECT使った実装例はこんな感じ

foreach (var x in items.Select((item, index) => new { item, index }))
{
Console.WriteLine($"index: {x.index}, value: {x.item}");
}

Listか配列かIEnumerabelどれでやってるかは知らないけどもこれで行けるはず
2019/01/15(火) 17:49:07.53ID:u2JtKhAa0
forが完全上位互換なのになんで
foreach使うのか?
って今でも思ってるよ俺は
ループにインデックスが必要になったというただそれだけで変更するんだぜ
2019/01/15(火) 17:55:58.21ID:AbSveg4gd
indexが必要でCountもできる時はわざわざindex生成してforeach使う必要無いと思うけどもLinq使いたい時とかIEnumerabelに実装してるものにわざわざfor使わない派
2019/01/15(火) 17:58:55.44ID:AbSveg4gd
というか戻り値をIEnumerabelにして抽象化しておく事が多いから余計にforeach使うのはあるかもしれない
Linq拡張メソッド作る時とか諸々
2019/01/15(火) 19:24:57.54ID:Kk36dR3w0
とりまLINQ使って富豪的に組むだろ
2019/01/15(火) 20:11:07.93ID:LAAyKIEna
>>252
int CalcDefault();
int CalcSpecial();
int Calc() {
if (IsSpecialCase()) return CalcSpecial();
else return CalcDefault();
}
bool IsSpecialCase() => combo.SelectedValue == "D";

とりあえず最初はこれでいいよ
似たような条件分岐が増えてきたらリファクタリングしてポリモー対応できないか検討
最初からポリモーは大げさだからやらなくていい
でも後でリファクタリングしやすいように責務指向でメソッドを切っておくぐらいはやっておいたほうがいい
このへんのさじ加減は経験則だな
2019/01/15(火) 20:18:43.20ID:ToRrrvnYa
switchを無くすのに多態なんか使う必要ないね。
すくなくともC#にはデリゲートがあるんだから多態使うぐらいならComboBoxのアイテムに
デリゲート持たせた方がいいよ。

個人的にはこれも本当に可読的か疑問だけど。
分岐素直に分岐で書いた方が分かりやすいって
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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