ふらっと C#,C♯,C#(初心者用) Part128 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2017/05/02(火) 22:05:40.13ID:OPFlvhxj
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。

内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。

なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

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

■前スレ
ふらっと C#,C♯,C#(初心者用) Part127 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1489498042/

■関連スレ
C#, C♯, C#相談室 Part94 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1492843013/

■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2017/05/26(金) 15:15:25.80ID:V0QADimW
>>525
先ず何がしたいのか言えよ
2017/05/26(金) 15:21:51.18ID:B4KqQKUi
>>525
C# string isnumberでググれ
いくらでもでてくる
2017/05/26(金) 15:22:13.46ID:sdCJMym9
テキストボックスに突っ込まれた文字列が数値かそうでないか判断したいんだきっと
でもisnumberじゃ駄目だったよイマココ
int.parseだきっとint.parseが求める答えだったんだよ!


シラネ( ´∀`)b
2017/05/26(金) 15:26:56.97ID:V0QADimW
俺だったらconvert.toint32だな
2017/05/26(金) 15:32:43.39ID:/9nVrKkw
俺なら正規表現を使う
2017/05/26(金) 15:39:55.03ID:nLIvGLmM
なんでお前等は嫌みな回答しかできないの?
2017/05/26(金) 15:44:35.17ID:IbAmlhQI
>>529
判断したいのならTryつけようよ
>>525
むしろChar.IsNumberとか知らなかった
文字列 数値 変換 とかでググるとTryParseがすぐ出てくるはず
outが嫌なら別の当たって
2017/05/26(金) 15:59:29.40ID:IgcvauO6
符号付きとか全角とかアラビア数字とかHとかどう判定したいのっと
2017/05/26(金) 16:30:48.38ID:F6wIZe6/
なるほど!
やっぱりTryParseメソッドが良さそうですね
>>529さんのおっしゃる通りでした!
確かにこの質問だけでは>>526さんや>>534さんのような問題も出てくるんですね!申し訳ありませんでした。判別したかったのは一般的な全角と半角の数字のみでした。
>>526さんChar.IsNumberに渡すのはstring のような文字列型も渡せるのではないのですか?
>>530さんConvert.toint32メソッドは文字や文字列を渡すとスローされるのではないのですか?

526
529
531
533
534さん相談に乗っていただきありがとうございました!
2017/05/26(金) 16:42:29.54ID:sdCJMym9
>>532
プログラムの回答って必要最小限でぶっきらぼうに回答すると全部嫌味に見える
そういうつもりはないんだよ
2017/05/26(金) 17:21:30.79ID:VWRnjUMH
アルファベットのIVX使ってギリシャ数字書くやつが居るから面倒なんだわ
2017/05/26(金) 18:23:18.38ID:bEaQUHBT
>>535
ないと思うけど、国外向けのプログラムを作る時はロケールも意識しないとあかんよ
2017/05/26(金) 18:44:14.72ID:YpZka8l7
>>535
> Char.IsNumberに渡すのはstring のような文字列型も渡せるのではないのですか?
Char.IsNumberにStringを渡せるオーバーロードの引数は
Char.IsNumber(String, int)
この文字列の何番目の文字を判定しますか? ってこと
2017/05/26(金) 18:51:35.84ID:bEaQUHBT
そんなオーバーロードあるのかw
stringのインデクサがあれば要らないはずだけど
2017/05/26(金) 19:03:32.42ID:2W2wzaM7
最近.net2.0の案件ばかりで泣きたくなってくる
2017/05/26(金) 19:15:44.49ID:4GVMWdle
>>541
かわいそうに…
2017/05/26(金) 19:16:58.08ID:C1R8iru0
古いものの方が安心感がある
って人多いよね
何の根拠もないんだけどw
2017/05/26(金) 19:58:52.45ID:w0WYW3h/
>>543
あるだろ
バカがいじらねぇからw
ウィルスより質が悪いって認識されてんだろ
2017/05/26(金) 20:13:06.21ID:bEaQUHBT
>>543
ほとんどの場合は君が被害妄想全開で勘違いしてるような理由じゃなくて
再テストするコストの問題だと思うけどね
2017/05/26(金) 21:39:41.16ID:Ym5et5f0
>>541
この業界は9割以上がレガシーの保守らしいぞ
日本人はソフトになるととにかく新しいものを作りたがらない
2017/05/26(金) 22:02:23.90ID:Heb9aC5z
失敗の可能性にお金を払いたくないだけですな
とても便利になろうとも失敗の可能性があるからには手を出したくないって方が多い印象
2017/05/26(金) 22:24:11.81ID:Ym5et5f0
それが最大の失敗だよな
ミスを恐れて何もしないで結果、損をする
ダメ人間そのままじゃないか
2017/05/26(金) 22:26:22.91ID:bEaQUHBT
子供の論理だねそれw
2017/05/26(金) 22:27:57.00ID:bEaQUHBT
っていうか、どんな会社でも君が無給の勤労奉仕でやるっていうのならダメだって言わないと思うよ。
コストなんか問題じゃないんだって本気で思ってるのなら是非やったら?w
2017/05/26(金) 22:30:46.44ID:wJyNnfgg
スレの主旨とそれ以前に板のローカルルールくらい守れよ
2017/05/26(金) 22:34:19.73ID:V0QADimW
>>541
なんでそんな古い.netを使うの?
2017/05/26(金) 22:40:09.73ID:6mvWqLXP
>>549
スレのルールすら守れない子供は余所に行こうね
2017/05/26(金) 23:13:53.33ID:6Pwsd9SO
>>552
昔作ったから
2017/05/27(土) 01:19:14.36ID:rsPE4izq
使用しているapiをすべて記録してあればバージョンアップ時に楽なのかもな
2017/05/27(土) 08:05:10.08ID:2waTjXRv
記録しても変更できないんじゃ意味ないよ
変更を容易にするために日頃からリファクタリングをすること
これが唯一の正解なんだよ
塩漬けは最もやってはいけない行為
2017/05/27(土) 08:13:13.30ID:MuqnBgBV
>>556
そうだね
ずいぶん昔にソース管理に登録されてから変更のないシステムを一部改修することになって、本番稼働してるコードと同一かどうかを調べるのが大変なクソ現場です
2017/05/27(土) 09:01:34.21ID:SDTaiU/Z
async await つかってますか
2017/05/27(土) 09:54:28.11ID:2waTjXRv
Taskをラップした方がわかりやすいし他の言語にも移植しやすい
2017/05/27(土) 09:58:59.18ID:dfyKY7Wk
UWPに至っては、半ば強制的にasync await使わされます
ライブラリがそれ前提で作られているからね
2017/05/27(土) 10:24:26.01ID:reRwAhMh
今時PythonやJavaScriptにもasyncがあるのに何を言っているのか
なんだかんだC#のやり方は正しくて他の言語もすぐに追従する
2017/05/27(土) 10:25:05.62ID:IYBRhAj3
使いはするけど仕組みはよくわかってない人が多いんじゃないかな
実際はreturnしてるけどそういう風には見えない
2017/05/27(土) 10:36:00.65ID:IYBRhAj3
async awaitの説明サイトがあんまり初心者もは優しくないんだよな
どれもいまいちというか
何故かTaskの説明ばかり

重要な事にはほとんど触れてない
2017/05/27(土) 10:39:17.27ID:8fRknhmf
C#は突出して新しいことをやっているわけではないが
まだマイナーだけど光るものを見つけてきてメインストリームに持ってくるときの
取捨選択とデザインのセンスが神がかっているという印象
2017/05/27(土) 10:45:11.69ID:2waTjXRv
>>561
Java
2017/05/27(土) 13:41:30.68ID:p4c408zN
>>563
非同期(スレッド)を理解せずに非同期メソッドが使えるはずがなく、
そもそも非同期自体が初心者が気軽に使えるような機能じゃないんだから当たり前だw

っていうか、@ITの記事はちょっと説明が足りない部分はあるけどよく書けてるでしょ
あれで何が不満なんだ?
567デフォルトの名無しさん
垢版 |
2017/05/27(土) 13:59:40.73ID:gzircrhE
C#でintの配列を保存したファイルを読み込んでint配列に設定したいんですが
まずbyte[]に読み込んでそれを変換するという形になりますか?
一番効率の良い方法ってどんなでしょうか?
System.IO.FileStream fs = System.IO.File.OpenRead(path);
byte[] b = new [4*32];
fs.Read(b, 0, 4*32);
fs.Close();
int[] = n = new [32];
コピーはひとつずつする以外にどういうやり方があるでしょうか?
2017/05/27(土) 14:10:30.20ID:VKoRAsZa
>>567
var buffer = new int[ 32 ];
using( var fs = File.OpenStream( path ) )
using( var reader = new BinaryReader( fs, Encoding.Ascii, true ) )
{
for ( int i = 0; i < buffer.Length; ++i )
{
buffer[ i ] = reader.ReadInt32();
}
}
2017/05/27(土) 14:34:06.49ID:gzircrhE
>>568
そういう読み込み方があるんですね。ありがとうございます。
2017/05/27(土) 14:51:03.74ID:djXMvCo4
>>567
一番効率が良いというとやはりポインタにしてC++で言う所のreinterpret_castだけど
C#ではunsafeになり非推奨なので、基本形は>>568のようなBinaryReader/Writerになると思う

汎用的な所だとバイト配列と数値型の変換を行うBitConverter、IntPtrを介して遣り取りするMarshal.Copy
UnmanagedMemoryAccessorのバックエンドとなるSafeBuffer(ジェネリック及び構造体配列が指定可能)など
うちSafeBufferは抽象クラスなので http://ideone.com/P6ZpjV みたいな実装を自前で書く必要あり
571570
垢版 |
2017/05/27(土) 15:29:18.13ID:djXMvCo4
1つ忘れてた、Buffer.BlockCopyでバッファ自体をコピー可能、プリミティブ配列同士ならこれが最もシンプルだったような
Stream.Readの一部実装はArrayなら何でも読み込めた気がするけど、無理矢理渡す方法がアレなので…
あとSafeBufferの配列読み書きはMarshal.AlignedSizeOf<T>(内部メソッド)のバイトサイズでアライメントされる
2017/05/27(土) 15:40:23.00ID:IYBRhAj3
ポインタ操作ってリトルエンディアンは保証されてるのか?
2017/05/27(土) 16:00:40.64ID:5EjoFYzo
Bufferなんてクラスが1.1の時代からあったのか知らなかったw
>>567みたいなのはbyte[]でまとめて読んでint[]にunsafeかCopyMemory使って
コピーしてたなあ

>>567は配列の要素が固定なら固定サイズバッファの共用体使えば
コピーなしでいけるんじゃないかな
2017/05/27(土) 17:01:09.52ID:uuvh7wIS
質問の主語がわからんが、int配列のデータをWriteして、1バイトづつReadしたら、もちろん逆になってるよ
2017/05/27(土) 17:45:11.27ID:gIqbrIjJ
環境依存じゃないかって言ってるならたぶん理念的には環境依存なんだろうね

68kみたいにビッグエンディアンのC#の動作環境があったとしたら、
その環境ではbyte[]を*intで正常に読めないと思う
2017/05/27(土) 18:16:22.09ID:dfyKY7Wk
まあファイルI/Oはメモリー操作に比べると思いっきり遅いから
何やっても大して早くならんけどね
2017/05/27(土) 18:26:00.76ID:eydHjhDC
話題とは関係ないけどこれC#にあったっけ?
>File.OpenStream
2017/05/27(土) 18:27:21.11ID:gIqbrIjJ
>>576
だからこそパフォーマンスが必要なら1つずつチビチビじゃなくて一度になるべくまとめて読み書きするんですよw
2017/05/27(土) 18:32:14.66ID:S8Hvv/fS
>>578
基本的なことだけど、バッファがあるからアプリケーションレベルで小細工する必要はないよ
2017/05/27(土) 19:01:40.80ID:gIqbrIjJ
>>579
Windowsのアーキテクチャーに詳しいわけじゃないけど、
書き込みは確かにディスクキャッシュにバッファリングされるから
プログラム側でまとめて書いても効果薄いかもしれないけど、
読み出し時にはHWレベルでもOSレベルでも大きなキャッシュなんか
用意してないはずだから、プログラム側でまとめて読む意味はあると思うよ
2017/05/27(土) 19:10:38.40ID:nge3QdkF
>>577
Java と勘違いしてるか IO.FileStream( ) 辺りと混同してるんでしょ
2017/05/27(土) 19:12:01.62ID:nge3QdkF
>>579-580
それ以前にメソッド呼び出しだってコストはかかるわけで
2017/05/27(土) 19:22:03.52ID:PYJf2o92
>>567
なんでそんな事したいのか言えよ
2017/05/27(土) 19:29:20.90ID:VKoRAsZa
>>577
正しくは、File.OpenRead()だね。
良く確かめずにコピペしてたら駄目だなw
2017/05/27(土) 20:12:08.55ID:VKoRAsZa
>>580
検証したことないけど、FileOptions.SequentialScan指定してFileStreamを作成したらprefetch効かないかな。
2017/05/27(土) 20:52:47.13ID:dfyKY7Wk
>>580
ディスクの読み書きってさ、最小限でもセクターって単位で処理するんだが今のWindows10だと4096バイト有るんだわ
だから1バイト読んでもメモリーには最小でも4096バイト入るわけだね
2017/05/27(土) 20:59:07.50ID:gIqbrIjJ
>>586
HDDの物理層の知識はゼロだけど、セクターってのはファイルシステム上の概念であって
最小の読み出し単位じゃないと思うよw

SSDみたいなフラッシュメモリーには最小の書き換え単位が存在するけど
最小の読み出し単位は存在しない
2017/05/27(土) 21:03:14.20ID:WiwmRK76
物理層も高速化のためにセクタ単位で読んでるはずよ
ファイルシステムより低位の概念
2017/05/27(土) 21:06:30.48ID:+Wc4u9QX
>>587
ファイルシステム上の最小概念はクラスタ
セクタじゃない
2017/05/27(土) 21:12:40.87ID:dfyKY7Wk
>>587
ディスクってさ、回転するからそれとシンクロして読まないと一周待たないといけなくなるんだよね
だからディスクは決まったバイト数をシーケンシャルに読むのが当たり前なんです
で。その最小単位をセクターと呼んでwindows10だと4096バイト有る
SSDはそんなこと無いけど、HDDと同じ振る舞いで動くようにセクタ管理しています
2017/05/27(土) 21:14:04.21ID:WiwmRK76
Windows10だからというよりHDDが新しいからだと思われ
2017/05/27(土) 21:19:00.20ID:dfyKY7Wk
>>591
7かVistaあたりで2Tの壁が取っ払われた時セクササイズが変わったようだ(前は512)
2017/05/27(土) 21:20:55.03ID:nge3QdkF
定義は色々違うけど概ね
セクター ... 物理的に読み書きできる単位
ブロック... 論理的に読み書きできる単位
クラスタ ... ファイルシステムの割り当て単位
って言う場合が多い
なお HDD でも1バイトだけ読み出したり書き換えたりはできない
必ずセクター単位の読み書きになる
2017/05/27(土) 21:27:42.99ID:sdz07quX
>>564
そんな感じだよね
自分みたいな老体にはちょうど良い
2017/05/28(日) 00:11:01.44ID:HK/67GFs
今時OSどころかBIOSでさえ、ディスクの物理的なセクターとか管理できてないけどな
2017/05/28(日) 12:23:16.31ID:2K8JxE4j
UDPでデータをBeginiReceiveで非同期受信したらToastで受信文字列を表示させたいんだが、以下みたいなバックグラウンドスレッドからGUI操作はできませんみたいなのがでる
Java.Lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

これ対処どうしたらいいかな
Javaのやり方は見つけたけど、Xamarinだとどうしたらいいかいまいちわからん「
2017/05/28(日) 12:33:51.75ID:X8MhB+Ic
xamarinスレがあるのに何でここで聞くの?
2017/05/28(日) 12:38:59.53ID:2K8JxE4j
あ、ごめんw
Xamarinスレと思って素で間違えた
失礼しました

ちなみにSynchronizationContext使ったら解決しました
2017/05/28(日) 20:16:37.95ID:dc5zy2FD
ブラウザコントロールを使ったアプリを作りたいんですが、
WinFFormsでもWPFでも、webサイトを開くと、ブラウザが古いって言われてマトモに表示できません。
新しいブラウザコントロールはどうやって使用したらいいでしょうか?
2017/05/28(日) 20:18:18.68ID:BVKFrymy
ブラウザ普通に使えばいいじゃん
2017/05/28(日) 20:24:15.70ID:LqX4nhhl
Electronにでも乗り換えてiframeでいいよ
2017/05/28(日) 20:38:08.43ID:X8MhB+Ic
>>599
「c# ie バージョン」でググれば解決策出る
2017/05/28(日) 20:54:57.63ID:Q4IaIxAm
>>599
"c# webbrowser ie バージョン"でググると色々出てくるよ
要はレジストリを弄る必要がるんだが、プログラムから変更して戻すパターンも有るから
探すと良いよ
2017/05/28(日) 20:57:31.19ID:OzzF/wdK
>>602
599じゃないけど幸せになれた
605デフォルトの名無しさん
垢版 |
2017/05/28(日) 21:52:44.46ID:9tRj7diM
WPFのデータバインディングって速度速かったりするん?
コントロールとDBをリンク出来るような感じって思って良いんだよね?
2017/05/28(日) 22:14:28.21ID:kC4qoZB1
>>605
件数と使う「Control」によるらしい
607デフォルトの名無しさん
垢版 |
2017/05/28(日) 22:17:03.35ID:9tRj7diM
>>606
じゃあXMLに保存された1万件の音楽情報を
グリッドに展開するとしたら?
2017/05/28(日) 22:32:41.86ID:WRn0Vp2w
データバインディングの動きを理解してない以上
手を出さねーほうが無難じゃね〜の?
2017/05/28(日) 22:59:20.62ID:kC4qoZB1
>>607
一万件程度なら楽勝かと
2017/05/29(月) 06:23:33.57ID:KA+g5PFR
$$$4.3$$$
"V"="1.3335412","0","1","3Q",
611デフォルトの名無しさん
垢版 |
2017/05/29(月) 16:23:55.26ID:NQQqCKG9
↓このような処理があった時にbutton1を押して無限ループのタスクを実行した後に
button2のクリックイベントからtaskを止める方法ってありますでしょうか?どなたか教えてください

Task task;
private async void button1_Click(object sender, EventArgs e)
{
task = doTask();
}
private async Task doTask()
{
await Task.Run(() =>
{
while (true)
{
// 無限ループ
}
}
}
private async void button2_Click(object sender, EventArgs e)
{
// ここでtaskを止めたい
}
2017/05/29(月) 16:29:32.48ID:lQKC7nKu
>>611
フラグ作って無限ループ中にチェック
button2のクリックでフラグセット
2017/05/29(月) 16:38:30.94ID:KWmGTlOy
>>611
C#だとCancellationTokenSource ってのを使うのが定石だね
詳しくはwebで
2017/05/29(月) 16:57:00.21ID:XexF9nJM
>>611
こういう場合、無限ループの中でどんな処理を行う予定なの?
2017/05/29(月) 17:10:58.74ID:pjx27QrG
>>611
外側から強制的に止めたいとか思ってるならその発想は危険な考え違い
616デフォルトの名無しさん
垢版 |
2017/05/29(月) 17:31:52.87ID:NQQqCKG9
>>612
ボタン2はタスクを止める処理と書きましたが
実際にはonとoffの処理を兼ねているので
フラグを使った制御を行うと、例えばボタンを連打した時におかしな挙動なってしまうような気がします。

>>613
CancellationTokenSource ってタスクの中から制御するのかとおもってたのですが
外からでも制御できるんですね。調べてみます。

>>614
スクレイピングです

>>615
ちょっと気になるのでもう少しだけ詳しく教えて頂けますでしょうか?
2017/05/29(月) 17:49:34.30ID:pjx27QrG
>>616
普通に考えれば、ループを抜けるにはループの継続条件がfalseになるように変えてやるだけ

それなのに>>611みたいな質問をするのは、制御構造を無視して強制終了したいとか
考えてるんじゃないかという印象を持った。

普通はそんな必要はないよね。
そんな必要があるのは、デッドロックするバグがある、ソースをいじれないライブラリを利用する時ぐらい。
2017/05/29(月) 17:56:22.13ID:guqVR5DS
適切な処理をせずにスレッドを強制的に止めるのは設計がよくないという話、まあ気持ちは分かるけどね
2017/05/29(月) 18:00:17.76ID:cnTBcIoG
その前に終了処理したいのか一時停止したいのかで変わるだろうな
2017/05/29(月) 18:00:51.67ID:oHsWfsZc
>>617
Waitで長時間待ったりしてることもあるから、
こういうのはキャンセルで止めたほうが確実だよ
621デフォルトの名無しさん
垢版 |
2017/05/29(月) 18:15:18.42ID:NQQqCKG9
皆さんありがとうございました
フラグで制御すると無限ループ内のいたるところでgoto文を書かなきゃ行けないので
まずいかなと思っておりました
やっぱりキャンセルで止める方法を調べてみます。
たくさんのご意見大変参考になりました。ありがとうございました!
2017/05/29(月) 18:32:30.18ID:KWmGTlOy
>>617
フラグじゃHttpClientなんか止まらんでしょ
https://msdn.microsoft.com/ja-jp/library/hh551741(v=vs.118).aspx

CancellationToken 使って止めるのが普通です
2017/05/29(月) 19:24:40.20ID:pjx27QrG
>>622
俺の理解が間違ってるのかな?

確かにCancellationTokenSource使えばユーザーコードなしても実行前のタスクをキャンセルすることは
可能だと思うけど、一旦動き出したタスクを強制終了なんか出来ないと思うけど...
2017/05/29(月) 19:30:56.57ID:cnTBcIoG
外部exeとかもそうだけどキャンセルするからといってプロセスをすぐ殺す必要はないんだよな
>>623
安全に中断とかでなく止められれば何でもいいんだろ
質問者はもういないしスレ違いの方に行きそうだからその辺でやめてくれ
2017/05/29(月) 19:33:24.08ID:HUcfMRFq
>>623
俺も強制終了はされないという認識
タスク内のコードがトークンのキャンセルフラグチェックして終了処理をする必要があると思ってる
626デフォルトの名無しさん
垢版 |
2017/05/29(月) 19:52:24.02ID:NQQqCKG9
質問者です

強制終了させる必要はなかったので
結局キャンセル入れてタスクのループから抜けるということにしました
↓一部抜粋ですが以下のような感じです。これ便利ですね勉強になりました

Task taskTest = Task.Factory.StartNew(() =>
{
while (true)
{
try
{
cancellationTokenSource.Token.ThrowIfCancellationRequested();
}
catch (OperationCanceledException oce)
{
break;
}
}

cancellationTokenSource.Dispose();
cancellationTokenSource = null;
}, cancellationTokenSource.Token);
■ このスレッドは過去ログ倉庫に格納されています