C#, C♯, C#相談室 Part94at TECH
C#, C♯, C#相談室 Part94 - 暇つぶし2ch970:デフォルトの名無しさん
21/11/17 22:48:30.86 OY6bKJls0.net
普通の会社で使えるのは2017までなんだよな

971:デフォルトの名無しさん
21/11/17 23:11:54.33 SfknQ7Tq0.net
うち2022買ったで

972:デフォルトの名無しさん
21/11/17 23:14:07.67 iuNg9UQr0.net
まだ2021年なのに?

973:デフォルトの名無しさん
21/11/18 09:00:28.34 +Wtl3GaA0.net
ジャップには分からんだろうが世界的には9月からはもう


974:2022年だぞ



975:デフォルトの名無しさん
21/11/18 21:37:43.70 cf0G7PVa0.net
じゃあ日本は4月からもう2022年になってるのか

976:デフォルトの名無しさん
21/11/19 01:11:50.72 4qGzfQ8F0.net
コマンドが格納されたListを順番にサーバへ送信し、
1が返ってきたら次のコマンド送信、1以外かTimeoutしたら即中断みたいな処理を
ractiveでサクッと書けますか?
var cmdList=new List<string>{ cmd1, cmd2, ... };
cmdList
 .ToObservable()
 .TimeOut( ・・・ )
 .SendCommand()
 .WaitResponse()
 .PostRecv(1だったら次のコマンド送信、1以外やタイムアウトなら処理中止);
みたいな感じで。。

977:デフォルトの名無しさん
21/11/20 22:43:08.40 F7Qzv69PM.net
cmdList
.ForEach(x => { if(x.SendAsync(cts.Token).Result == 1 ) throw new Exception() });

978:デフォルトの名無しさん
21/11/20 22:58:08.09 YK5Xmj5SM.net
var results = await cmdList
.ToAsyncEnumerble()
.SlectAwait(async (c) => await c.SendAsync(cts.Token))
.TakeWhileAwait(async (r) => r == 1)
ToArrayAsync();

979:デフォルトの名無しさん
21/11/21 00:02:36.10 Z3Hc+Mmaa.net
タイムアウトで値や例外が返ってくるタイプだったらいいけど
時間経過で勝手にタイムアウト判定しろよってタイプだと詰みそう

980:925
21/11/21 00:41:13.81 7ZBVrJXA0.net
ReactiveExtentions(System.Reactive名前空間 ver5.0)を使ってます。
自分なりに書いてみましたがこのライブラリの使い方がよくわかってない状態です。
(疑問点をコメントに書きました。分かる方教えてください)
IDisposable d = cmdList
 .ToObservable()
 .Timeout( TimeSpan.FromSeconds( 3000 ) )
 .Select( cmd =>
 {
  var res = this.SendCommand( cmd ) // 自作のコマンド送信関数;
  return res;
 } )
 .Where( res => res == 1 )
 .Subscribe(
  res => /* ここで次のコマンド送信を行う書き方が分からない*/ res.ToString(),
  ex => Debug.WriteLine( ex.Message /* Timeout発生時 */ ),
  ()=> Debug.WriteLine( "Complete" /* 全ての送信完了?それとも1つだけ送信完了? */ )
);
>>935
やはりToAsyncEnumerbleからアプローチするべきなんですかね。。

981:デフォルトの名無しさん
21/11/21 00:46:46.14 7ZBVrJXA0.net
Timeout関数の中身は
TimeSpan.FromMilliseconds( 3000 ) // 3秒
の間違いでした

982:デフォルトの名無しさん
21/11/21 10:42:16.16 XHu2qeE/M.net
Rxは監視を行うもの
時系列に沿って要素が流れてくる時に使うもの
なのである要素が流れてきた時に次の要素なんてのはまだ無い
要素が最初から揃ってるListから始めるからわからなくなる
最初から揃ってるなら普通にLinqかforeachを使う
Listでなくストリームならこれでおk
var d = CommandStream
.Select(c => Send(c))
.Timeout(t)
.TakeWhile(r => r == 1)
.Subscribe();

983:デフォルトの名無しさん
21/12/10 11:57:57.31 ceXBGTs50.net
次元の違う配列ではArray.Copy出来ないのでしょうか。
例)
var foo = new int[4];
var bar = new int[3, 4];
ArrayCopy(foo,0,bar,0,4); // 例外発生 "The specified arrays must have the same number of dimensions."
1個づつコピーするしかないのでしょうか?

984:デフォルトの名無しさん
21/12/10 12:19:49.36 D7YZScOh0.net
プリミティブ数値型の配列ならBuffer.BlockCopyできるけど
まあ多次元配列なんて肩身が狭いもんだから仕方ないね

985:デフォルトの名無しさん
21/12/10 12:40:02.71 ceXBGTs50.net
classを配列に保存しているから、BlockCopyもダメなんですよね・・・
あまり数も多くないはずなので、1つずつコピー(代入)していきます。

986:デフォルトの名無しさん
21/12/10 13:17:59.80 /7sxHGOs0.net
>>940
若干アンセーフだけど行ごとにならSpan利用すればマネージ型でも出来る
for (int i = 0, len2 = b.GetLength(1); i < b.GetLength(0); i++)
foo.CopyTo(MemoryMarshal.CreateSpan(ref bar[i, 0], len2));

987:デフォルトの名無しさん
21/12/10 13:21:12.71 /7sxHGOs0.net
MemoryMarshal.CreateSpan(ref bar[i, 0], 5000)とかやっても確か例外でないから最新の注意を払う必要はある
まぁこうやってもソースの長さがデスト以内であれば問題は生じないけど

988:デフォルトの名無しさん
21/12/12 04:59:13.07 /1pFbOYv0.net
入力を検知したときにメソッドを実行する処理において、
要素Aがnullでなく(エラー防止)、Aの子要素Boolがtrueの場合のみ処理をスキップしたい場合に いい書き方はありますか?
!A.Bool でメソッドを実行にしてしまうとAがnullだったときに実行されなくなってしまうので……
ひとまずgotoを使って以下のようにしているのですが、もっとスマートな書き方ありますでしょうか
if (Input)
{
if(A != null){
if(A.Bool){
goto INPUTSKIP;
}
}
Method();
}
INPUTSKIP:

989:デフォルトの名無しさん
21/12/12 08:06:18.80 OKsF9IR00.net
null条件演算子 null合体演算子 で検索

990:デフォルトの名無しさん
21/12/12 08:23:25.29 V78zeb460.net
>>945
こう?
if (Input)
{
if (A != null && A.Bool)
{
// INPUTSKIP
}
else
{
Method();
}
}

991:デフォルトの名無しさん
21/12/12 09:36:50.05 G8rzE1470.net
>>947
それを反転させて
if (Input)
{
if (A == null || !A.Bool)
{
Method();
}
}

992:デフォルトの名無しさん
21/12/12 10:16:02.74 2rSkF5hnM.net
>>945
goto 使いたくないと言うなら A が null か、A.Bool が false の時に処理したいってことだから普通に
if(A == null || !A.Bool){ 処理 }
って書くか>>946が言うnull条件演算子とnull合体演算子を使って
if(!(A?.Bool ?? false)){ 処理 }
でいける
個人的にはこの場合だと上の方がわかりやすいと思う

993:デフォルトの名無しさん
21/12/12 10:56:54.04 MLGY87ca0.net
後藤さんが出てくると素人臭が漂ってくるからな

994:デフォルトの名無しさん
21/12/12 12:26:50.16 V78zeb460.net
例外も後藤さんみたいなもんだが

995:デフォルトの名無しさん
21/12/12 12:48:33.01 /1pFbOYv0.net
AがnullだったときにORで並べてA.Boolの条件式を使ってしまうとそんなもんないよってエラーを吐くのでは、
と思い込んでいたのですが大丈夫なんですね……!
!A.Boolだけで判定したときに怒られたので頭凝り固まってました!
ありがとうございました!

996:デフォルトの名無しさん
21/12/12 13:09:03.73 I9KyYKSc0.net
>>952
いやショート サーキット評価だからエラーにならないだけ
URLリンク(docs.microsoft.com)

997:デフォルトの名無しさん
21/12/12 13:17:35.22 /1pFbOYv0.net
>>953
ああーなるほど、ORの場合どれか1つでも満たされてれば実行されるから
左側が条件を満たしてたら右側はもうチェックされないのか!!
良いこと知れました! ありがとう!

998:デフォルトの名無しさん
21/12/12 13:23:43.83 V78zeb460.net
vb.netのorだとエラーになる

999:デフォルトの名無しさん
21/12/12 13:31:38.41 I9KyYKSc0.net
>>955
論理演算子2つ並べるのがショート サーキット評価�


1000:ネんだけど https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12181009427 次から初心者スレ行ってくれ



1001:デフォルトの名無しさん
21/12/12 14:02:55.63 WWmfWzxPM.net
>>955
OrElse 使え
>>956
> 論理演算子2つ並べるのがショート サーキット評価なんだけど
とか言う玄人w

1002:デフォルトの名無しさん
21/12/12 14:06:00.32 a4cuZ/Mwa.net
vb恐ろしいな。そんなのバグの元じゃん

1003:デフォルトの名無しさん
21/12/12 15:11:49.02 happ85M4M.net
はあ?
C# ⇔ VB.Net
---------------------
& ⇔ And
&& ⇔ AndAlso
| ⇔ Or
|| ⇔ OrElse
ってなってるだけやぞ

1004:デフォルトの名無しさん
21/12/13 09:12:51.67 7pnzZ4JB0.net
>>945
条件式をネストしたり&でつないだりと複雑にするのは難読性が高くなるから分けたほうがいいだろ
どういう条件ならMthod()を呼ぶのか明確に
if(Input){
//事前処理
judge=(A==null) ? true: //Aがnullのとき
A.Bool==false ? true: //Aの子要素がfalseのとき
false; //それ以外
if(judge) Method();
//共通処理
...
}

1005:デフォルトの名無しさん
21/12/13 09:51:11.81 g+jxvcxo0.net
>>960が分かりやすく見えない…
>>948が誰が見ても一目瞭然でいいと思うわ
シンプルな条件分岐なんだからこだわる必要ない

1006:デフォルトの名無しさん
21/12/13 11:44:51.75 zykNHKxZ0.net
skipするほうが例外的処理だろうからskip条件を明確にしてearly returnしたほうがいいと思う
論理式の細かい書き方よりも意図が伝わるかどうかのほうが大事
if (ShouldSkip(a)) {
return;
}
Method();
bool ShouldSkip(A a) {
return a?.Bool ?? false;
}

1007:デフォルトの名無しさん
21/12/13 14:01:49.98 z2L+bKXw0.net
メソッドにすんのはいいけど、>>945 が入力を検知したときメソッドを実行したいって言ってんだからその通りに書けばいい
設計書通りに条件分岐すりゃいいのに無駄に置き換えて実装する人多いけどなんなんだろうね
if(入力検知(input, A)){
Method();
}
bool 入力検知(bool input, A a){
return input && a != null && a.Bool;
}

1008:デフォルトの名無しさん
21/12/13 14:22:24.69 6wRfW5vFa.net
昼飯食いながら適当だから何か勘違いしてるかもしれないけど、>>945って要は
ある条件を満たした時だけMethodを実行したい、それだけでしょ?
だったら四の五の言わずに素直にそう書くのが一番じゃないの。
if( input && (!A?.Bool ?? false)) Method();

1009:デフォルトの名無しさん
21/12/13 14:29:51.31 KmNdaGVTa.net
求めてるのは「もっとスマートな書き方」だからな
主観的な問題だから、俺らが言えるのは「こういう書き方もある」ってのだけ
正解(どれが一番か)を決めれるのは本人だけ

1010:デフォルトの名無しさん
21/12/13 14:47:42.73 6wRfW5vFa.net
コードでも文章でも読み手に「要するにそれってどういうこと?」って思わせないのが一番。
これもコードでも文章でもそうだけど、読みにくいものは書いた本人がそこをよく理解せずに書いている。

1011:デフォルトの名無しさん
21/12/13 15:06:50.29 WUjUV8JM0.net
ReSharperが薦めるように書き換えたら、何をしてるのかわからなくなった。

1012:デフォルトの名無しさん
21/12/13 15:10:10.54 pxTkbBAYM.net
最近のc#はマルチパラダイムで構文が増えてカオスだ

1013:デフォルトの名無しさん
21/12/13 16:35:33.81 zykNHKxZ0.net
>>963,964
>>945を読む限りでは入力を検知する処理と
検知した後に特定の処理をスキップするかどうかを判断する処理は別じゃないのかな?
「A.Boolがtrueなら入力を検知しない(or 入力を無視する)」ってことなら
入力よりも先にA.Boolを確認するよね

1014:デフォルトの名無しさん
21/12/13 16:52:41.40 KmNdaGVTa.net
ちなみに回答ざっと見てこんなだな
こういうのはコードが長くなっても動作が分かりやすい方がいいと思う
>>947,948,960
おk
>>962,963
バグあり

1015:デフォルトの名無しさん
21/12/13 22:23:58.46 s0FccnDO0.net
>>968
それ。言語の表現力が豊かでも、自分やチームで一貫性を担保するのが面倒ξ

1016:デフォルトの名無しさん
21/12/14 09:16:58.78 cLXTODpXM.net
>>971
そして、コーディング規約が底辺プログラマーに合わせられて生産性が低下する

1017:デフォルトの名無しさん
21/12/14 20:46:07.43 4rMew3mV0.net
どうせ好き勝手に言語機能使って上がる生産性なんて微々たるもん

1018:デフォルトの名無しさん
21/12/14 23:18:34.83 gu+YKYdX0.net
.net の 1.1 で書くとめちゃくちゃ不便で絶望するぞ

1019:デフォルトの名無しさん
21/12/14 23:43:50.97 5qKKFixV0.net
linqがある.NET Framework3.5ですら今これでやれって言われたら不便に感じるしなぁ
使えるものは使わせてもらった方が全然楽だわ

1020:デフォルトの名無しさん
21/12/15 08:20:32.57 YtxEX99t0.net
色々使えた方が個人的に楽だと思うのは否定しないが、もっともらしく「生産性が上がる」とか言っちゃうと
意外とそうでもなかったり。

1021:デフォルトの名無しさん
21/12/15 09:41:14.43 flSodCtX0.net
>>974
特にList<T>が無いのはキツイわ

1022:デフォルトの名無しさん
21/12/15 12:10:36.77 KtX6zlRp0.net
心配しなくても今どき1.1で書いたり書かされたりすることはないでしょ

1023:デフォルトの名無しさん
21/12/15 16:03:58.38 w2vh5jVl0.net
1.1とか極端すぎるやろ

1024:デフォルトの名無しさん
21/12/15 16:14:56.34 Jy+USlABM.net
2.0の知識で止まってるヤツも多いよね

1025:デフォルトの名無しさん
21/12/15 16:57:55.56 RMHVQ2YW0.net
さすがに今どきvar使うなとかLINQ使うなとか言われないよね?

1026:デフォルトの名無しさん
21/12/15 17:25:02.67 ik5KT4gs0.net
>>981
var使うとわからなくなるというのは名称が明示的になってないだけだと思うわ

1027:デフォルトの名無しさん
21/12/15 17:31:22.22 KBNxuXv0M.net
>>982
ハンガリアン記法?

1028:デフォルトの名無しさん
21/12/15 18:19:16.59 UGnWEqDI0.net
MS公式はvar推奨してるけどさすがにintとかstringとか基本的な型はvarにはしないな

1029:デフォルトの名無しさん
21/12/15 21:30:02.16 lA94GyTo0.net
明示的に型を書かないとダメなところ以外全部varで書くよ

1030:デフォルトの名無しさん
21/12/15 21:44:12.20 M2QFYQSl0.net
最近はnew()で書けるようになったから、極力varはやめてる
Hoge hoge = new();
実装当初の想定通りlinqの戻りくらいかなvar、使うの。

1031:デフォルトの名無しさん
21/12/15 23:22:27.06 l+MEhncN0.net
new()使えるのってc#いくつからだっけ

1032:デフォルトの名無しさん
21/12/15 23:43:54.17 NZjG441V0.net
はやくおれのレベルまで上がって来い
上で待ってるぞ

1033:デフォルトの名無しさん
21/12/16 00:21:19.35 R2Peltay0.net
new()で書けるようになったけど、コンストラクタで初期設定値渡すようにしちゃうから全然使わんなぁ。
セッター潰してコンストラクタで設定するのが好き

1034:デフォルトの名無しさん
21/12/16 07:48:14.53 Ymr34XoE0.net
>>987
C# 9.0

1035:デフォルトの名無しさん
21/12/16 09:44:30.84 P4pOcLuS0.net
C#がどんどんボクのしらないものになっていってる
いっそC##やDと名乗っていただきたい
(Dは既にある、は受け付けない)

1036:デフォルトの名無しさん
21/12/16 10:15:25.85 80W3ywqF0.net
C#に毛が生えた程度だろ
C丼でええがな

1037:デフォルトの名無しさん
21/12/16 10:54:52.18 Ni3FtdydM.net
c井

1038:デフォルトの名無しさん
21/12/16 11:01:26.24 DM4zUQcN0.net
C⛩

1039:デフォルトの名無しさん
21/12/16 11:42:40.19 plhBUTFD0.net
C升

1040:デフォルトの名無しさん
21/12/16 11:47:41.44 e2PzMi3oM.net
>>991
ほんと、氷川きよしくらい変わってしまった

1041:デフォルトの名無しさん
21/12/16 23:46:42.90 vtDDQtO+0.net
if(item is {} a){
...
}
null判定でこんな書き方あるんだな。Resharperさんに提案されて初めて知ったわ。
個人的にはあまり使いたくないけど。

1042:デフォルトの名無しさん
21/12/17 00:40:01.77 fAwtu2PR0.net
>>997
それやるとaの色がローカル変数色にならず白のままになるのが不満なんだけど俺の環境だけか?

1043:デフォルトの名無しさん
21/12/17 02:39:12.84 KpFo6Hw/0.net
C林

1044:デフォルトの名無しさん
21/12/17 11:21:38.48 b89m5ifd0.net
>>997
C#9なら
if (item is not null)
って実に直感的に書けるから早くこっちにこいよ…
ところでその式でaで受ける意味なくね?

1045:デフォルトの名無しさん
21/12/17 13:42:40.65 KpFo6Hw/0.net
C極

1046:デフォルトの名無しさん
21/12/19 09:44:58.73 QHfeHH9E0.net
WinFormsを独学でやっているのですが教えて下さい
そこそこの規模のソフトは作れるようになってますが
VSで開発していくうえで、フォルダ構成ってどう考えればいいですかね
いままではDB関連をDBフォルダ
フォームはFormにまとめてさらにその中に機能別にフォルダを
細かいクラスファイルはClassというフォルダに
DBとの受け渡し(sql書いてFormとの受け渡しModelみたいなもの?)は
Modelというフォルダにまとめています
プロの皆様はチームで作っていかれる際に
会社によりけりかもしれませんが一般的なフォルダ構成の考え方ってあるんでしょうか

1047:デフォルトの名無しさん
21/12/19 09:58:37.55 eMi6YEPC0.net
そんなもの存在しないから適当でいいよ
まぁあえて口出しするならFormフォルダはFormクラスと名前が被るからやめとけって位かな

1048:デフォルトの名無しさん
21/12/19 10:00:48.95 n0pWJPWXa.net
なんのフォルダなのか理解できない
プロジェクト(visual studio上でのプロジェクト)内じゃフォルダ切ることはないな
プロジェクトがある程度大きくなったらクラスライブラリに分ける

1049:デフォルトの名無しさん
21/12/19 10:16:13.92 UEQjoSys0.net
シングルアセンブリ構造なのかな

1050:デフォルトの名無しさん
21/12/19 10:33:08.48 QHfeHH9E0.net
>>1003
そうなんですね、気をつけます
>>1004
たとえば画面数でも100超えて、機能部分のClassファイルも100越えてくると
いちいち該当ファイル探すのが面倒でフォルダに分けたって感じです
前はPHPのフレームワークとか触ったときは
たとえばcontroller model viewとフォルダも階層構造みたいになっていて
そういう感覚もあります
チームでやられていると、どこに何のファイルが散らばっているか
わからなくなったりしないのですか? きちんと仕様書があるから関係ないのですかね
やっぱりクラスライブラリ(DLL化?)もちゃんと理解しないと駄目ですよね
一人で作ってるので、DLL化するほうが手間な気がして避けてました

1051:デフォルトの名無しさん
21/12/19 10:44:47.17 n0pWJPWXa.net
どこに何がは命名の問題もあるんじゃないかな
classも変数も先頭、末尾にそれが何か分かるように名前つけてるから名前順にソートされてればすぐわかる

1052:デフォルトの名無しさん
21/12/19 10:53:09.81 UEQjoSys0.net
>>1006
機能ごとにProjectを作るんだよ。

1053:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1004日 15時間 55分 34秒

1054:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch