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

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9e9f-LwdJ)
垢版 |
2018/10/04(木) 18:56:38.41ID:JnxMNCXd0
「どんなにくだらない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/1533466544/
■コードを貼る場合は↓を使いましょう。
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/11/06(火) 22:54:04.17ID:QbvaQ8DKa
1.
var ret=TestAsync();でコンパイラーエラーがでるとtaskをそのまま受けたい場合に困る
retはただのTask<bool>であってそいつのResultじゃないからそれでいいだろう

2.
そういう流れで処理をしたいのでawaitを使ってる
それが疑問に思うならスタートがまちがってる
2018/11/06(火) 22:54:57.62ID:KNaAB8gP0
これでいいのかな?
https://dotnetfiddle.net/o7udF7

>>408
Thx
2018/11/06(火) 22:54:58.69ID:tGae1nmw0
>>407
asyncメソッドと言っても戻り値は単なるTask<bool>だし
Taskにawaitが強制されたらTaskを待つ場所を選べなくなる

動作的に言えばawaitした時点で抜けて後に再開しようとする
ILSpy 3.0.1とかでasync/awaitデコンパイルを無効にして
ビルド後のバイナリからメソッド内容を見てみるといい

まずTask.ContinueWith()+TaskScheduler.FromCurrentSynchronizationContext()とか
従来の書き方を学んだ方が良いと思う、コルーチン的な物の前に
2018/11/06(火) 22:55:30.26ID:LW+aJyL/0
varについてすら理解できてないじゃん
なんで406でのvarが381でintに置き換えられるって思ったの?
2018/11/06(火) 22:57:50.35ID:QbvaQ8DKa
重い処理Aをやってる最中にBもやりたいのでawait asyncを使ってる

重い処理Aの次にCをやるのとBが実行されるのを混同してはいけない
2018/11/06(火) 22:58:30.18ID:hiXG5OoB0
全 角 に 変 換 し て み た


やべえコイツ思っていた以上に馬鹿だぞ!!!

int に変換できるとか言ってたらvarで受けてるし面白すぎんだろ
2018/11/06(火) 23:01:12.62ID:QbvaQ8DKa
初心者あおりみっともない
しかも前のレスは初心者には理解できないだろ
2018/11/06(火) 23:01:39.73ID:KNaAB8gP0
>>409
おおっ 多分これが答えだな
納得はしていないけど、納得しやすい答えかな

例えば、2については、>>404
>awaitに出会ったらそこで待機して結果が出るのを待ちます
という受け取り方もあるけど、なぜ
>それが疑問に思うならスタートがまちがってる
のかな?

で、この考え方に到達するに参考する書籍等は?
2018/11/06(火) 23:04:27.04ID:QbvaQ8DKa
>>416
いつも新刊の入門書をざっと見てるけど入門書でまともにawait asyncを扱ってる書籍はないよ
あってもごまかしてあるか間違ってる
2018/11/06(火) 23:07:21.50ID:QbvaQ8DKa
重い処理Aをタスクでやって同時にメインのスレッドを実行し続けるのが目的なので
上位のメソッドが引き続き実行されるのが期待の動作

awaitされた重い処理Aの続きのCが実行されるのはまた別の話
2018/11/06(火) 23:13:59.85ID:QbvaQ8DKa
1. 順番に処理をやってるけど別の処理も同時にやりたいな A B
2. その処理が終わったらそのタイミングで別の処理をやりたいな A → C
というのを書くのが従来の非同期処理だと面倒なのでawait asyncを使ってる
2018/11/06(火) 23:21:04.01ID:QbvaQ8DKa
上の2は従来だとコールバックメソッドだったが
今はawaitより下の行のこと

従来だと処理が終わったらコールバックメソッドを実行する
awaitだと処理が終わるまで待つ

やってることは同じでも概念が変わって見える

でもやっぱり待つと言うのと違うんだよなあ
2018/11/06(火) 23:26:37.38ID:KNaAB8gP0
ありがとう  真面目に答えてくれた人w

差しあたって、消化しきれていないけど
なんとなく見えてきたので、よく考えてみまーす

>>420
うん。awaitって、2つの意味があるんだよね。
  非同期で実行する + ここで同期する(戻り値設定とか)
でも、そこが分かりづらい
でさらに、呼び出し元のスレッドは動く だから、呼び出し元の関数が動くということなんだろうけど
2018/11/06(火) 23:26:58.31ID:QbvaQ8DKa
Aを待ったあとにCをやってほしいのに先にBが実行されてしまう
これはけしからん!

というのはスタートが間違い

AとB同時にやってるけど非同期処理Aが終わったらCをやってほしいが正解
2018/11/06(火) 23:30:08.92ID:jcRa2hVA0
>>406
> var ret =TestAsync();
retにTestAsync()が返すbool値が入って欲しいなら、
var ret = await TestAsync();
2018/11/06(火) 23:37:32.97ID:QbvaQ8DKa
awaitではどのスレッドも待ってない

元のスレッドは呼び出し元の続きを実行し続ける
新しいtaskスレッドは実行し続ける

勝手に第三のスレッドができて待機したりしない
2018/11/06(火) 23:49:27.64ID:jcRa2hVA0
await Task.Run( () => { 処理A } );
処理B
とあったら、
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
var task = Task.Run( () => {処理A} );
task.ContinueWith( (t) => {処理B}, scheduler );
みたいに置き換わる。実際はもっと複雑だけど。
2018/11/06(火) 23:51:27.64ID:LW+aJyL/0
これでMSは何目指したの?なんて煽りするほどの相手に初心者煽りと言われてもなーって感じする
そもそもソフトウェア技術でハマりやすいスレッド周りをかなり触りやすく提供してくれてる技術だと思うし、その点でMSに苦情なんて出る?
2018/11/06(火) 23:56:24.75ID:QbvaQ8DKa
さっきも書いたけど美しくないしわかりづらいんじゃないの?

数年前はもっと理解してる人が少なかった
リアルで合う人の9割ぐらいの人は誤解してたかわからないと言ってた

ググって上位に出てくるいくつかのサイトも間違いを助長するような内容ばかりだったので
誤解するのも仕方ないかなって思ったなあ
2018/11/07(水) 00:01:47.29ID:qsaRvVqe0
>>424
なるほど 最初は、async/awaitの発想って非同期処理を同期処理のように見せることだと思ってた。
(結局これが正解なのね)

Webを漁っても、元々の動機からずれていくような気がしてたんだけど、
awaitで非同期処理を挟むけど同期処理をしているものと思えば、
当初の動機との整合性は取れる。
で、async/awaitの関数は(TestAsync)と書いたものは非同期なのだから
当然呼び出し元は、そのまま動いていくと。

これで、自分の中では大きなとこの整合性はとれたのかな
2018/11/07(水) 00:02:18.96ID:dWNwSiW+a
>>426
それは煽ってるわけじゃなくて、純粋にそう疑問に感じただけでしょうw
少なくとも他人を批判的に見る程度には自分自身も批判的に見た方がいいと思うよw
2018/11/07(水) 00:20:23.00ID:qsaRvVqe0
>>425
BackgroundWorkerからasnc/awaitに飛んだから
Taskすらまともに理解していなんだけど、

TaskSchedulerとSynchronizationContextはキーワードとし覚えてる
レベルアップするために、そこを解説したものを教えてください。
2018/11/07(水) 00:35:56.72ID:+978RLDn0
>>406-407
cmd.exe とか、特定の命令を半角で書くと、5ch は受け付けない。
ちょっとした英単語の書き込みでハッキングされるとか、5ch の運営は、アホなんだろう

Mango 板で、単語の絞り込みのテストができる

例えば、ドットなら、💩e みたいな文字参照を使えば、書き込める

cmd💩eexe
2018/11/07(水) 00:38:25.44ID:T3rtNmkK0
>>424
a「wait」って名前が誤解招いている感じ
2018/11/07(水) 00:40:03.17ID:+978RLDn0
16進数の2e は間違い。ウンコが表示されたw

例えば、ドットなら、10進数の. みたいな文字参照を使えば、書き込める

cmd.exe
2018/11/07(水) 00:41:05.63ID:NkMDfY750
>>429
俺も純粋にvarの理解すら怪しいのにasync周りが難しいってそんなもんじゃないかな?って思っただけなんすけどね
別に批判的に見てるつもりはなくて俺もasync周りは難しいと思ってる
2018/11/07(水) 01:11:44.95ID:qsaRvVqe0
>>434
>俺も純粋にvarの理解すら怪しいのに
逆に聞くと、varってどう誤解するの?もっとも俺はvarを誤解してるかもしれないけどw

余計誤解されるかもしれないとおもって書かなかったけど
解説しておくとすると、そこはシンタックスシュガーだと思ってた Task.Resultを返す
だから、上のほうで、本来ならコンパイラーエラーを出すべきだと書いたのも そこら辺の理由
他の人も指摘してるけど、そこはawaitを書くべきだと自分も書いたのも、あるべき姿はそっちだろうと思ってたから

実際には、動かした段階で、Task<bool>なのは知ってたんだけど そこで気づくべきだった。
とは思うけど、誤解する心理とはそういうものだと思う。

ちなみに、本当にasync/awaitで知りたいのは モナドとの関わりあい
F#ではコンピュテーション式で、async/awaitが実装されてるらしいんだけど
どう実装されているのかが知りたい。
2018/11/07(水) 01:29:03.21ID:NkMDfY750
>>435
まずvarはシンタックスシュガーじゃないよ
メソッドの戻り型を自分で定義してるのになんでTask外れると思ったの?
定義した型と違う型が返ってくるなんて言語仕様そのものからかわっちゃうじゃない
asyncなんか関係なくTask<bool>型を返すメソッドを作って、その戻り値をbool型に入れるって、あれ?ってなるよね

どんな環境でテストしてるのかわからんけどVSとかIDEならvarの上にマウスオーバーすれば型教えてくれるよ?
2018/11/07(水) 01:42:24.43ID:qsaRvVqe0
>>436
>まずvarはシンタックスシュガーじゃないよ
というのは、どこで判断するの?
シンタックスシュガーか否かなんての 言語仕様以外の判断基準って存在するの?
delegate、匿名メソッド、ラムダ式周りなんて、旧バージョンでは許されなかった
代入が普通に許されてなかったっけ?
疑問に思った全てを、MSDNで確認するわけではないよね。

>定義した型と違う型が返ってくるなんて言語仕様そのものからかわっちゃうじゃない
いやvarだから定義すらしてないし、脳内変換では、boolだと思い込んでるから

>どんな環境でテストしてるのかわからんけどVSとかIDEならvarの上にマウスオーバーすれば型教えてくれるよ?
だから、テストした段階で、気づいていると>>435にも書いたんだけど これは、今回の一連の質問以前に知ってた
実際には、retに何が入るのかは気になるからローカルウォッチで見た
だから、コンパイルエラーの方が本来の姿だと思ってたけど…
2018/11/07(水) 01:50:14.49ID:Z88Q6V1f0
>>436
XMLDocumentにかざしたけど出ないね
2018/11/07(水) 01:50:48.17ID:Nx5407ci0
具体的にはどの行がコンパイルエラーになるべきだと思ってる?
2018/11/07(水) 02:07:33.40ID:NkMDfY750
>>437
>async Task<int> TestAsync()
TestAsyncメソッドの戻り値をTask<int>型と定義したのは君だよ?
varは右辺から型を推論する、メソッドが○○型を返しますって定義されてるからその型になる
2018/11/07(水) 04:03:10.82ID:4Q/iuGqA0
久しぶりにvarすら使えないやつを見た
2018/11/07(水) 07:40:05.39ID:Nn5ja2xC0
まあvarとawaitの合わせ技で混乱すると言うのはわからん話じゃない
C++でautoとPPLを絡めると俺も怪しい時があるし

コンパイルが通るコードを
コンパイルエラーになって欲しいと妄想したコードに勝手に改変して
コンパイルが通ると主張して出してきたくだりはさっぱりわからんがw

>>438
https://i.imgur.com/T2Wmm9g.png
出るぞ
べつに型名スペルミスしててもusingなくても出るぞ
2018/11/07(水) 07:55:13.01ID:7FHAql48a
>>385
ちょ待てよ
2018/11/07(水) 08:24:11.94ID:o5rBIXZlM
>>442
マジか
いつの間にかできるようになってやがる
2018/11/07(水) 10:07:36.67ID:qsaRvVqe0
>>440
一応、以下は煽りのつもりは無いんだけど

実は未だに混乱してるんだけどね varのとこw

var ret=await TestAsync() とawaitをつけると、bool
var ret=TestAsync() とawaitをつけないと Task<bool>

とか、でも、TestAsync()関数内のreturn retはboolなんだぜ
混乱しないか?var ret=TestAsync()の方が、
普通の関数ぽいからこっちの方がboolぽいという見方もできるし
2018/11/07(水) 10:37:39.04ID:qsaRvVqe0
これで最後にするけど、

多分初心者にとって誤解を与えるのは、
”非同期処理を同期処理のように扱える” わけではないと思う。

きちんと、Taskを理解したうえでasync/awaitに入らないと、誤解する可能性があるということ
awaitを魔法の言葉のようにとらえると、誤解の森をさまようってしまうって感じかな
awaitできるのは、Task型に対してで決して普通の関数に適用できるわけではない。

async/awaitの書式が自然に思えるのは、Taskから入った人
そこを飛ばす人間にとっては、”非同期処理を同期処理のように扱える”が逆に誤解を与える
2018/11/07(水) 10:37:56.63ID:+HyKX3eQM
>>435
F#の computation expression でも let! ret = Async.AwaitTask (TestAsync()) で ret が bool になるんだが?
君には抽象化という考え方は難しいようだね
そんなんじゃF#なんか夢のまた夢だぞ
2018/11/07(水) 10:51:40.13ID:DKcaR4dnd
>>445
右辺の型が違うんだからvarによる型推論の結果も変わるだけ
varの話をしてたのにawaitによる処理の話にすり替わってる

retがboolだろうがなんだろうがメソッドの戻り型はTask<bool>と定義したんだろ?
じゃあ疑問が出るのはメソッドの呼び出し箇所じゃなくて実装箇所じゃないの?
なんで戻り型はTask<bool>なのにreturn boolでおkなんだろう?って
ここにvarなんて関係ないのにごっちゃにするから話がこじれる
2018/11/07(水) 11:06:26.88ID:pyY+8g+op
>>445
async関数を書く立場と使う立場でごっちゃにし過ぎ

> var ret=TestAsync()の方が、普通の関数ぽいからこっちの方がboolぽいという見方もできるし
そんな見方はできないよ
関数を使う側は戻り値のシグニチャに従うだけだ
逆にawait式の戻り値がTaskじゃないのが直観的じゃない、と言うなら初心者視点に限って見ればまだ理解はできる

とは言え型推論のvarが非同期機能のawaitまで勝手に面倒を見てしまうという妄想を
まるで仕様により勘違いを誘発されたかのように語るのはお門違いだな

基礎を疎かにしているのに最短距離だけ求める欲求が強すぎるて歪んでいる
2018/11/07(水) 11:10:22.09ID:pVsScpvPM
varはわざわざ型名書かなくて済むためのシュガーだと思うの
当然、型が自明か気にしなくて済むくらい明瞭なコードなら、可読性も満たす

書き方で型が変わるシチュで、
変数名もretにして混乱してたら本末転倒かと
2018/11/07(水) 11:21:51.89ID:DKcaR4dnd
asyncが難しいことを誰も否定していないのに勝手に初心者でも理解できると解釈して、そんなことない!って文句垂れてるようにしか見えないんだよね。
基本や順序すっ飛ばして全部一気に詰め込むなんて土台無理な話なのに
2018/11/07(水) 11:33:01.55ID:+tTqHYr+0
そもそもawaitがTaskからResult取り出すものだってわかってなかっだけだな
2018/11/07(水) 11:36:32.44ID:+tTqHYr+0
あとasyncが戻りを勝手にTaskにしてくれるのも混乱のもとか
454デフォルトの名無しさん (アウアウカー Sac3-U2lQ)
垢版 |
2018/11/07(水) 11:44:16.22ID:h4FWJh3Ka
読んでてHaskellのIOモナドみたいとか思った。
asyncが>>=でawaitがreturn。
(Haskellのreturnは戻り値にIOを被せる)

実行順序がコード通りとは限らないと言う意味では遅延評価も非同期か。
2018/11/07(水) 11:46:01.13ID:qsaRvVqe0
一応読んでるよ〜

>>452
そこもまだ混乱してるんだけどね
var tas=TestAsync()
bool ret=tas.Result
とすると、デッドロックするんでしょ 理由は分かってるから説明不要

var ret=await TestAsync()
ならOKとか。違いがわかりづらい
2018/11/07(水) 11:50:22.74ID:T9rK23F2M
なんでこんなに書き込み増えてんねん
2018/11/07(水) 11:53:24.50ID:xNIAd77Ep
いつからC#はセミコロン不要になったんだ?
458デフォルトの名無しさん (アウアウカー Sac3-U2lQ)
垢版 |
2018/11/07(水) 11:57:23.58ID:h4FWJh3Ka
>>454
あ、asyncとawaitの>>=とreturnの関係逆だった。
459デフォルトの名無しさん (アウアウカー Sac3-U2lQ)
垢版 |
2018/11/07(水) 12:11:39.88ID:h4FWJh3Ka
要するにさ。
時間かかり過ぎる処理がUIスレッド占有するとプログラム上正常でもユーザーからは固まったように見えるから、非同期でUIスレッドから切り離してしまいましょうって機能でしょ?

asyncで別スレッドに切り離して、直後のコードで押したボタンとか無効化しておいて、答えが返ってきたら有効化する。みたいな。
(だからUIスレッドは他の操作もできるけど、await付きメソッドは(async部分以外は終わってるけど)async返るまで正式な終了では無い。みたいな。
んで、UI弄るのはUIスレッドのみって縛りを解決する為にSynchronizatrionContextがあると。

齧った限りはそんな理解。
2018/11/07(水) 12:12:41.51ID:j1BgkYjRd
何もドキュメント読まずに妄想だけでコーディングしようとするからこんなアホが生まれる
2018/11/07(水) 12:29:37.11ID:GX8LMMiJa
>>446
まあ気持ちは分からんでもないけど、「非同期処理を同期処理のように扱える」なんて
宣伝してる人はいないよね。
大概の記事は「同期処理のように<書ける>」となってるんではないか。

違うかもしれないが、あなたはasyncで修飾されたメソッドの内側の視点と、
外側からの視点の区別がついてないんじゃないか。

「同期処理のように<書ける>」というのは、あくまでasyncで修飾されたメソッドを
書いてる時の、内側の視点に立った場合の話。

先にTaskをある程度知らないと混乱するのはその通りかもしれないが、
知らなくても「async/awaitの書式が自然に思える」とは思うけどな

>>455に書いてるような落とし穴が分かりづらいのはその通りだしたぶん大方が同意するところ。
だから非同期メソッドは糞、と言いたいならそれはないんじゃないかと
2018/11/07(水) 14:33:31.51ID:uHgdkwYaM
馬鹿は犬のクソでも拾ってろ
2018/11/07(水) 15:23:16.06ID:B5IB+WEZ0
>>460
そしてそんな池沼解釈を自慢げに広めて馬鹿の量産を狙うんだよな
マジで害悪
464デフォルトの名無しさん (ワッチョイ 3eeb-ZA70)
垢版 |
2018/11/07(水) 16:08:24.07ID:RZxjCpbR0
C#に関しては特にそうだけど、QiitaとHatenaは検索から除外したほうが良いよ
2018/11/07(水) 18:02:56.35ID:Z88Q6V1f0
>>464
qiita助かってるよ
javascript関連かなり助けてもらった
2018/11/07(水) 18:03:21.43ID:Z88Q6V1f0
hatenaも
2018/11/07(水) 18:04:06.24ID:B5IB+WEZ0
こうやって馬鹿が量産されるわけだ
2018/11/07(水) 18:25:46.93ID:GPEu9teNa
めるか機械翻訳に慣れているなら
stackoverflow英語版見に行けばほとんどのことは書かれていると思うよ
2018/11/07(水) 22:06:05.59ID:F0eFVJRp0
Dispose();
リソースを解放ってどういう意味ですか?
470デフォルトの名無しさん (ワッチョイ 4ee8-MyS3)
垢版 |
2018/11/07(水) 22:24:06.37ID:EkNn3I7h0
デバッグ時にスレッド数分のウィンドウが出て
一斉かそれぞれでステップインしていけたりしないかなあ
471デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/07(水) 23:36:12.44ID:fWOqg0Pc0
頭ワルイヤツが頭ワルイ日記を読んで
ネトウヨやパヨチョンや放射脳になる

コレと同じ

タチがワルイ頭ワルイのが量産される
コレは低学歴知恵遅れに顕著
2018/11/08(木) 06:47:12.34ID:2O0gVFLm0
c#に限らずググって見つかったページを鵜呑みにするだけならキータだろうがハテナだろうがダメに決まってるだろ。
2018/11/08(木) 07:53:34.07ID:HzGiMKkRd
配列について。
例えばクリックイベントが起こるたびに配列に1つずつ入れたい時、使いたい1次元配列を宣言して、要素数を1つずつ増やしたいときってどうすればいいですか?
2018/11/08(木) 07:59:27.65ID:t5YueCJxp
arraylist
2018/11/08(木) 08:00:45.70ID:HzGiMKkRd
一番上のパブリックで宣言時はやっぱ一個は確定でつくるものですかね?
476デフォルトの名無しさん (アウアウカー Sa9d-Gc0T)
垢版 |
2018/11/08(木) 08:16:23.72ID:Tu3rCJEka
>>473
whileの代わりにイベント使うと考えればおk
2018/11/08(木) 08:53:08.32ID:YlmbbEml0
可変長なら配列じゃなくてList<型>を使えばいいよ
2018/11/08(木) 09:02:34.53ID:CSIZeDt+0
ワッチョイ 8a7e-zV7r
2018/11/08(木) 09:25:03.69ID:CSIZeDt+0
ああごめん 間違えて書き込んじゃった

いいレスしてるなぁ抽出しようとして
2018/11/08(木) 22:05:15.41ID:62lAQ4k70
>>474
過去の遺物
2018/11/09(金) 08:06:06.00ID:XmmzP5eBa
先入れ先出しとかならQueueを使うかな
2018/11/09(金) 14:44:37.04ID:beO0HsiNM
先っちょだけ抜き差しするならstackやな
483デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 09:47:43.85ID:sUbsN3PYp
質問します。
C#初心者。プログラミング初心者です。
よろしくお願いします。

csvファイルがあって中身は

a,b,c,d
e,f,g
h,i,j,k,l,m,n

のような
行によってカンマの数(1行ずつ読み込んで配列に入れた場合は要素数)が違います。

プログラグの処理としは
このcsvファイルをの内容を1行ずつ読み込んで
xmlまたはjsonファイルに変換したいのですが
どのような処理をすれば
行によって要素数が異なるこのデータ達を
変換できるでしょうか?

よろしくお願いします。
2018/11/10(土) 09:52:04.57ID:HbWc37XyM
Split使えば配列に変換してくれるでしょ
485デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 09:59:03.63ID:sUbsN3PYp
Splitメソッドで配列に格納するところまではできてますが、その後の要素数の異なる配列を
xmlやjsonの要素に入れる際の処理のコードが腫れ上がって困ってます。
配列の要素数のパータンに応じて
If (配列の要素数=3){…}
else If(配列の要素数=4){…}
else If(配列の要素数=5){…}

のように
配列の要素数に応じてコード量が
多くなってしまいます。

他に処理の仕方はございますか?
486デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 10:31:22.39ID:sUbsN3PYp
If(3<配列の要素>7){


オブジェクト名.xmlのタグ名1= 配列名[0];
オブジェクト名.xmlのタグ名2= 配列名[1];
オブジェクト名.xmlのタグ名3= 配列名[3];
オブジェクト名.xmlのタグ名4= 配列名[4];
オブジェクト名.xmlのタグ名5= 配列名[5];


のようにすると
配列の要素数とxmlのタグ数が違う場合にエラーがでてしまいます。

例えば上記のコードだと
配列の要素数が5以外の場合はエラーになります
2018/11/10(土) 10:46:41.57ID:kamloJld0
>>483
入力データフォーマットはわかったので
出力データフォーマットを書いて見てください
それが曖昧だからどうやったらいいかわからないんじゃない?
488デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 11:21:38.15ID:sUbsN3PYp
ルコード
namespace Sample.model
{
public class PersonModel
{
/// <summary>
/// ID
/// </summary>
[System.Xml.Serialization.XmlAttribute("id")]
public String ID { get; set; }
/// <summary>
/// 名前
/// </summary>
[System.Xml.Serialization.XmlElement("firstname")]
public String FirstName { get; set; }
/// <summary>
/// 苗字
/// </summary>
[System.Xml.Serialization.XmlElement("lastname")]
public String LastName { get; set; }
/// <summary>
/// 誕生日
/// </summary>
[System.Xml.Serialization.XmlElement("birthday")]
public String Birthday { get; set; }
}
}
489デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 11:23:23.72ID:sUbsN3PYp
ファイルを読み込み処理
.
.
string data =1行ずつ読み込みこんだデータ;
string xml[]= data.Split(,);

/シリアライズする為のPersonsインスタンスを生成
Sample.model.PersonsModel model = new Sample.model.PersonsModel();
model.Persons = new List<Sample.model.PersonModel>();
//インスタンスに値を設定
// Persons1
Sample.model.PersonModel person1 = new Sample.model.PersonModel();

If (3<配列の要素数<8){

person1.ID = data[0];
person1.FirstName = [1];
person1.LastName = [2];
person1.Birthday = [3];
model.Persons.Add(person1);


//出力先XMLのストリーム
System.IO.FileStream stream = new System.IO.FileStream(@"D:\DATA\EXPORT.XML", System.IO.FileMode.Create);
System.IO.StreamWriter writer = new System.IO.StreamWriter(stream, System.Text.Encoding.UTF8);

//シリアライズ
System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Sample.model.PersonsModel));
serializer.Serialize(writer, model);

writer.Flush();
writer.Close();
2018/11/10(土) 11:26:08.88ID:q+mWhUVWa
>>483
var data = File.ReadAllLines("path/to/file.csv")
.Select(line => line.Split(","));

var jsonText = Newtonsoft.Json.JsonConvert.SerializeObject(data);
491デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 11:27:19.41ID:sUbsN3PYp
person1.ID = data[0];
person1.FirstName = [1];
person1.LastName = [2];
person1.Birthday = [3];
model.Persons.Add(person1);


ここの処理に困っています。
この場合は読み込みだデータの配列の要素数が4以外の場合エラーになります。
エラー原因は要素が4未満の場合は
指定したxmlのタグの数に満たないためだと考えられます
492デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 11:28:55.94ID:sUbsN3PYp
間違えました
data[0]ではなく
xml[0] でした
493デフォルトの名無しさん (ササクッテロル Spcd-WqUE)
垢版 |
2018/11/10(土) 11:33:51.32ID:sUbsN3PYp
>490
ご指摘ありがとうございます。

要素数が異なる配列を
xmlタグ要素に入れる処理の
ご指摘を頂けると幸いです。

読み込んだ1行のデータの配列の要素が異なる場合の処理はどのように書くのがスマートでしょうか?
2018/11/10(土) 12:23:15.91ID:h+MQ7FTQa
>>491
要素が足りない場合に、Birthdayなどをどう書き込むべきかによる
何かしらの既定値を書き込みたいなら
string GetOrDefault(string[] xml, int index, string defaultValue)
{
if (0 <= index && index < xml.Length) { return xml[index]; }
return defaultValue;
}
のような補助メソッド作って
person1.Birthday = GetOrDefault(xml, 3, "1000/01/01");
のように取得する

要素が足りない場合にはBirthdayなどを書き込まないなら
xml出力の方では、PersonModelクラスのメンバーにDefaultValue属性を付けて
その属性で指定した値を格納しておけば書き出されなくなる
JSONの方も同じように書き出さないように出来ると思う
2018/11/10(土) 12:35:22.80ID:2+OzQsKxM
>>493
サルなの?
仕様も決めないでどうやるもこうやるもねぇよ
じゃあ、全部key,valueでいいよ
csvに存在するすべての要素をkey,valueで出せ
keyのフォーマットはcolumn-rowな
xmlでのタグ名はdata
属性はkeyとvalue
2018/11/10(土) 13:04:57.13ID:q+mWhUVWa
>>493
var persons = File.ReadAllLines("file.csv")
.Select(line => { var a = line.Split(","); Array.Resize(ref a, PROP_COUNT); return a; })
.Select(a => new Person() {
ID = a[0],
Name = a[1],
...,
LastProp = a[PROP_COUNT - 1]
});

var json = JsonConvert.SerializeObject(persons);
2018/11/10(土) 15:54:29.53ID:48CyTBFD0
jsonって名前=値ペアの連想配列は順序が保証されないので
順序を保証したい場合は配列で囲って [{名前: 値}{名前: 値}] みたくすると思うんですが、
データ保存用途として見た場合使い難くないですかね?
シリアライズした時も処理系によって順序が保証されないから単純diff比較も使えずパースして比較する必要がありますよね
これって問題にならないんですか?
2018/11/10(土) 16:48:27.38ID:gqodC/ga0
名前と値で取れるんだから、順序関係ないだろ?
2018/11/10(土) 16:49:31.82ID:gqodC/ga0
つか、シリアライズした結果がいつでも同じだと思うのか?
2018/11/10(土) 17:04:14.17ID:hLxIIZfE0
>>498
テキストだからdiffしたいって言うのは割とよくある要望
2018/11/10(土) 18:05:23.42ID:48CyTBFD0
たとえばweb屋なら画面のチェックボックスとかの状態をjsonでデータ管理するとして
そのデータから設定仕様書とかを起こす時に困るんじゃないかな
なんかここだけアルゴリズム依存で時代と逆行してるような気がしてイマイチなんですよ
2018/11/10(土) 18:07:52.91ID:/C4Raf5+p
んなもん仕様書の書き方次第だろ。
2018/11/10(土) 18:26:43.69ID:ZJVvB/9K0
なんかよくわからないけど、このJSON君はお金出して誰かに作ってもらったほうがいいんじゃねえの?
2018/11/10(土) 18:31:49.77ID:jXgJ1KMYM
JSONがイマイチだというお前の小言にこのスレはつき合わなければならないのか?
C#に関係ないんだが
2018/11/10(土) 18:41:55.53ID:kamloJld0
俺もjsonはイマイチだと思う
要素があるのかないのかわからん
2018/11/10(土) 18:45:43.38ID:jXgJ1KMYM
文句があるならこいつに言ってこい
https://plus.google.com/+DouglasCrockfordEsq
嫌ならママに聞いてもらうか穴掘って叫んでろ
2018/11/10(土) 18:56:12.67ID:Y9Dl3F80M
自宅の壁にでも書いてろ
2018/11/10(土) 19:01:40.71ID:/crW2tCF0
c#とオブジェクト指向の勉強にオススメの本ありますか?
今まで組み込みのcばっかやってきたので、こっちの世界の定石みたいなものを身に付けたいのです
■ このスレッドは過去ログ倉庫に格納されています