◎正当な理由による書き込みの削除について: 生島英之 とみられる方へ:ふらっと C#,C♯,C#(初心者用) Part145 ->画像>6枚
動画、画像抽出 ||
この掲示板へ
類似スレ
掲示板一覧 人気スレ 動画人気順
このスレへの固定リンク: http://5chb.net/r/tech/1570446977/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980 を踏んだ人は新スレを建てて下さい。
>>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part144
http://2chb.net/r/tech/1563258983/ ■関連スレ
C#, C♯, C#相談室 Part95
http://2chb.net/r/tech/1508168482/ ■コードを貼る場合は↓を使いましょう。
http://ideone.com/ https://dotnetfiddle.net/ ■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index https://docs.microsoft.com/en-us/dotnet/standard/class-libraries http://referencesource.microsoft.com/ ・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html ・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
c# windowsフォームにファイルをドラッグ&ドロップしたらファイルのパスを取得みたいなコードはネットにありますし、そのままビルドしたら正常に動作しましたので良いのですが、 ファイルをドラッグした瞬間にパスを取得することは出来ますか?
>>3 普通にやると一番早く取得できるのはDragEnterやDragOverイベントかな
もしドラッグを始めた瞬間に取得したいのなら
全プロセスに対してOle32.dllのDoDragDrop呼び出しをフックして
プロセス間通信でパスを通知、とすれば出来るのかもしれないけど初心者がすることではなさそう
質問失礼します textboxに入力を終えて確定したことを知り自動的に フォーカスをtextboxから別の決まったコントロール(buttonとか)に移動したいのですが フォーカス移動のコードをどこにどう書いたらいいのか分かりません
>>7 ケースバイケースでは?
同じ機能のTextBoxが一つしかなく、他で使いまわす予定もないなら
Formに書けば十分。
複数使いたかったり汎用的で他で使いまわしたいなら
(a) TextBoxを継承してそこに書く
(b) UseControlにTextBoxとButtonをペアで配置してUseControlにフォーカス移動のコードを書く
このいずれか。
>>8 ありがとうございます
なるほど、(a)かなあ
ところでtextboxの入力が確定したことをどうやって取得すればいいのかも分からないんです
それも教えてください、すみません!
あ、それはTextプロパティが変化したかどうかを見ればいいのか? でもそれじゃイベントハンドラがどうしたらいいのか分からない Textの変更を始めたというイベントハンドラって取得できるんですかね?
それも駄目か やっぱり何らかの方法で変更が終了して リターンを押して確定したことを取得しないといけないよね?
わかった _TextChangedか! ありがとうございました
昔だったらkillforcusなんだけど c#はなんだろう?
あった多分これで検索すれば c# textbox validated event
WPFアプリにてタスクバープレビューの右上の閉じるボタンから閉じた時のイベントを取得することは出来ないのでしょうか? 上記の方法で閉じると一見終了されたように見えてもプロセスは残ってしまうため、メインウィンドウの閉じるボタンを押したときに呼ばれる後処理メソッドを呼ばせたいのですが
こっちの環境では普通にClosedイベント発生してるし特殊な終わり方はしてないようだが…
どういう方法で閉じようと、ClosingやClosedは経由するよな
C# + Oracleで自社内向け業務アプリ作ることになったんだけど、..net coreでなく、net frameworkのWinFormsでいいよね? ユーザーはせいぜい1200人程度なんだけど、.net coreランタイム入れる手間を考えたくない。 WinFormsって結構大きなデメリットになったりする?
Formで複数のNumericUpDownを使ってます 値の変化はValueChangedイベントを使用してます あるNumericUpDownを変化すると別のも連動します 値を変える場合一時的にイベントハンドラを無効にしてます 今は-=で無効にしてますが他にイベントハンドラを無効にする方法はありますか?
勘違いしてるみたいだけど.NET coreはインストール不要(自己完結型)でビルドできるよ
core調べてみたら便利そうだな 調べるうちにだんだんUWPとWPFの違いが分からんようになった WPFでUWPのコントロール使えるなら、UWPは制限きついだけか?
Win限定なら作れる でも現実にはある程度のユーザー数のある業務アプリなら.NET Framework の方が遥かに配布は楽だよ ClickOnceが使えるからね .NET CoreはSCDができるのはいいけど、配布や更新に関して良くも悪くも単なるexeができる以上のサポートは何もない ヘタにzipで配っちゃったら後で地獄を見ることになる
あと、今から業務アプリを新規に作るんならそもそもクライアントアプリではなくWebにすべきだ Webなら配布の心配なんか最初から要らないし、.NET開発におけるメインストリームだから情報も豊富だし将来性もある
>>19 フラグ使ってイベントハンドラの入り口でreturn
質問なんですが DataGridViewでテーブルを表示させてるんですが、中のデータを変更してもDataGridViewが更新できません class Person { public int ID; public string Name; } class PersonList { public List<Person> Data { get; } public PersonList() { new Person { ID = 1, Name = "tanaka" }; new Person { ID = 2, Name = "kimura" }; } } PersonList personList = new PersonList(); DataGridView1.DataSource = personList.Data; 今は無理やりデータソースを一度Nullにして消して再読み込みしていまうs private void Button1_Click(object sender, EventArgs e) { DataGridView1.DataSource = null; DataGridView1.DataSource = personList.Data; } これでは画面が一度消えてちらついたり、セル幅がリセットされたり、いまいちです DataGridViewの再読み込み再描画でうまい方法あるでしょうか?
PersonにはINotifyPropertyChangedを実装して 各プロパティのsetでPropertyChangedイベントを発生させる 要素の追加削除に対応するならList<T>の代わりにBindingList<T>を使う
>>28 さんくすです
何やらうまくいきそうな感じですが、実際に書くのは難しそうです
少し調べてみます
ASP.NET(VS2013) でWebアプリを作っています。 データベースから取得したデータをGridViewにBindしています。 特定のカラムを編集したくて OnDataBound イベントにて以下のようにしてTextBoxを追加しました。 foreach (GridViewRow rw in GridView1.Rows) { �TextBox txt = new TextBox(); �txt.Text = rw.Cells[2].Text; �rw.Cells[2].Controls.Add(txt); } この後、TextBoxの値を取得したいのですが、 foreach (GridViewRow rw in GridView1.Rows) { �TextBox txt = (TextBox)rw.Cells[2].Controls[0]; �xx = txt.Text; } ではうまくいきません。Controlsがないようです。 どうすればTextBoxの値を取得できるでしょうか。
・extBox txt = (TextBox)(rw.Cells[2]).Controls[0];
>>31 >>30 です。
ダメです。~.Controls.Countが0なので、インデックスの範囲外になってしまいます。
ProcessクラスにはDispose()があるようですが、 var processes = Process.GetProcesses(); とした時点で上記のProcess[]内のProcessたちを全てDispose()しないとメモリリークなどしてしまうのでしょうか? それとも実際にハンドルなどを参照したものだけDispose()すれば良いのでしょうか?
>>33 https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,1554 ReferenceSourceを見ると
GetProcessesByName()が内部でGetProcesses()を使っていて、それの戻り値配列に使わない場合はDispose()しているから
GetProcesses()を直接呼び出している場合でも戻り値配列の各ProcessをDispose()したほうが良さそう
GC管理下にあるからDisposeを呼び忘れていても、ファイナライザが呼び出されて少なくともメモリーは回収されるとは思う
>>34 ありがとうございます
一応全く使わないProcessもDisposeしておくことにします
クラスA内にインスタンスメソッドBがあったとして、長くなってしまったから一部をメソッドCとして外に出すとします このCはBから呼び出される以外どこからも参照されません。本当にちょっと分離するためだけに分けているのです このときCの修飾子はどうするのがいいのでしょうか。publicは論外として、ただ単にprivateでいいんですかね staticとかつけた方がいいですか?クラス内で変な使われ方するのを防いだ方がいいかなとか思ったのですが
そのソースを自分しか触らないのであればprivateでいいと思う 自分で作っているんだから変な使われ方をされることもないだろ? もし他の開発者が触る可能性があるんならローカル関数を使えばOK
privateにしてコメントに注意書きしておけばいいと思うが メソッド名の頭にアンダースコアつけるとか DoSomethingFromBOnly()みたいな名前にしておくとか
全部public クラスAを継承したクラスA2で メソッドBをちょっと変えた メソッドB2を作りたいときに メソッドCを呼べない欠陥クラス
>>36 普通にprivateにすればOK。
誤用されるリスクは分割したメソッドに固有の問題じゃない。
それは命名と抽象化が不適切ならどのメソッドにも起こりうる。
だから分割したら誤用されるんじゃないか、って発想はかなり変だ。
staticはインスタンスメンバーを使わないなら付けるべきだが、付けたからって
誤用されるリスクが減るわけじゃない。
ローカル関数は、
(1) 分割したメソッドを何度も呼び出す。
(2) その時に必ず同じ変数を引数として渡す(それが冗長に感じる)
こういうケースじゃなきゃ積極的に使う理由はない気がする。
メソッドBからしか正常に動作しないメソッドCという構図ならそもそも設計が怪しい メソッドB以外から使われることがないだろうくらいの感じなら 万一使われても別に困らないしprivateで問題ない
>>41 は?
>>39 のケースで普通に困るだろ
ボケてんかよ
>>44 でもまあ拡張性に優れてないのは元からっぽいから、分けて書くことに始まった問題じゃないじゃん?
全部publicおじさんなんかどう見ても荒らしなんだからNGに放り込んどけ
>>39 のケースを解決しようととりあえずprotectedにすればいいと思うだろ?
ところがメソッドB2の処理の途中に
クラスXの処理を絡ませなければならないことになった
しかし、クラスA2はクラスXを呼び出すと循環参照になってしまうためそれができない
なのでクラスEにメソッドB3を作成することになった
ときにメソッドCはprivateでは呼び出すことができない
ここまで解決しようとするとメソッドCはpublicにしておくしかない
そしてこれはよくあることだ
皆さんは、Windowsノートパソコンで開発されてるのでしょうか? それともsurface?MacBook Pro?iPad Pro? プログラミング用にMacBookをすすめるサイトをよく見ますがC#ではやはりWindows機? 個人的にはThinkPadかなと思ってますが 皆さんはどんなもんですか
>>47 > そしてこれはよくあることだ
ねーよ
よくあるとしたらお前の設計力が無さすぎ
そもそも
> メソッドBをちょっと変えた
> メソッドB2を作りたいときに
の時にBからB2をコピペして改変する時点でアホ丸出し
>>51 え?じゃあどうするん?
話の主旨とそれるけど
virtualにしてもやっぱりメソッドCは呼べんやろ
それで?
どうしたいって?
>>52 アホすぎる…
クラスAをベースクラスにして変更部分をvirtualで差し替えてA1(これが今までのA)とA2を作る
変更部分にCを呼ぶコードがあるならCはクラスA1にだけあればいい
変更部分にCを呼ぶコードがないならCはクラスAに置いとけばいい
>>53 え?なんかよくわからない
>>39 みたいにかけない?
継承先でメソッドCを呼ぶ必要があるときどうだって?
今開発中のもので初めて例外を補足しない強制終了が起こったのですが、原因としては唯一のunsafeであるstackallocだと思われます var stack = count <= 20 ? stackalloc ulong[count] : new ulong[count]; 動的なサイズですが上記のように一応サイズ制限はしていたのですが、ulong[20](160byte)程度でもスタックオーバーフローは起こり得るんでしょうか?
>>54 ちょっとは勉強しろよ...
両方の継承先で呼ぶ必要があるならベースに置けばいい
どっちか片方だけでいいなら必要とする継承先に置けばいいだけ
まともにコード書いたことないのか?
>>56 残りスタックが少なければ起こりうると思うけど例外吐いてないなら別の要因じゃないかと思う
>>56 イベントログを見てStackOverflowExceptionであることは確認した?
>>56 それコンパイル通るのか?
?の第2オペランドと第3オペランドの型があってないように見えるが
>>64 え?継承元のprivateって呼べないよね?
古いコードを見ているのですが if (false) {// なにか処理} がたっくさんあるんです。 到達できないコードが検出されましたって大量に出て当たり前だよ!って 仮に何か意味があるとしたらどんな理由が考えられるでしょうか 全部消せと思うのですが何かわたしの知らないテクニックだったらまずいですし
テスト用なんじゃね 必要なくなったからfalseにしているだけでは
テストとかデバッグ用の処理じゃないかな #if falseにすれば警告は除去できると思う
>>65 継承元のprivateを呼ぶ話なんてしてないだろ
>>53 をちゃんと読めよ
>>70 じゃあ、お前、一連の流れを理解しないでレス付けたな
もうようないわ
Properties.Settings.Defaultについて教えてください DataGridViewのセル幅の設定を保存したいのですが、いい方法はあるでしょうか? セルが20個ほど並んでるのですが、Settings.SettingsにはInt[]の配列が選べないし プロパティバインディングも項目がありません、たくさんのIntを保存するにはどうしたらよいでしょか?
>>66 謎だねw
#ifディレクティブやコメントアウトを選択しなかった理由は
IDEでシンボル検索した時に引っかかるようにしたかったから、とかも考えられるけど、
まあ多分単純に書いた人がアホなだけだろうw
仮にそうう理由があるとしてもfalseなんてリテラルをそのまま書くのは意味が分からん
json.netで文字列にして保存とか・・・そこまでやるならってのはナシで
>>71 バカの逆ギレかよ
念の為に言っておくけど元々
>>47 程度の要件では派生クラスからCを呼ぶなんて必要ないってことな
まあ君には一生理解できないかもしれないけどw
>>75 レスサンクス
カンマで区切って、文字列を数値にして
今それっぽい事をやってみたんですが、なにやら挙動があやしい
>>76 れすさんくす
やはり文字列になってしまうのでしょか、int[]あれば便利なのに
>>80 さんくす 数字カンマで区切ってsplitですか、簡単にできそうですね >>81 保存する種類をsystem.collections.specialized.stringcollectionとゆう文字列のコレクションを使って .addと.clearでいろいろやってるうちにwidthが0になったりと Properties.Settings.Default.cellwidth = new System.Collections.Specialized.StringCollection(); for (int i = 0; i < DataGridView1.ColumnCount; i++) { Properties.Settings.Default.cellwidth.Add(DataGridView1.Columns[i].Width.ToString()); } こんなんです、これは捨てます string.Join(",", array)で保存 array=text.Split(",").ToArray()で復元 スマホで書いたからミスってたらごめん
>>49 非光沢液晶のパソコンでプログラミングすることをすすめます。
>>84 さんくすです
それは答えですね、やってみます
>>47 本来クラスA2に置くべきメソッドB2を
循環参照になってしまうからという理由で別クラスに作るというアプローチに問題がある
不要な循環参照は避けるに越したことはないが 絶対に回避しないといけないものではないしな 設計的に妥当かどうか
>>87 さんくすです
型を増やすのは難しそうで、ちょっと敬遠してたのですが
いちどやってみます
遅くなりましたがありがとうございました。とりあえずprivateでやってみようと思います。 しかし恥ずかしながらローカル関数って初めて知りました……こんなんあったのか
ローカルクラスとか初めて聞いたんだが Javaか何かと間違えてないか?
内部クラスつまりクラス内クラスのことかもな ローカルクラスとは言わないけどな
匿名クラスのことだろ LinQの関数の戻りとかでたまに使う
var hoge = new { Name = "Masashi", Hage = true }; こんな感じで宣言出來ると思う
class hoge { class fuga {} class moge {} } こういうやつ 呼び方は知らん
Java 用語だったのか。 < ローカルクラス クラス内だけじゃなくてメソッド内でも作れるみたいだけど。 匿名クラスは無名クラスだと思ってた自分。 この流れでしょうもないことを聞いてみる。 static なメンバ変数の修飾子というか、 static でないメンバ変数の this.[変数名] の this に当たるようなのってなにかないですか。 [クラス名].[変数名] で ok なのだけど、[クラス名] の部分を固定でやる方法ないかなと。
for(int i = 0; DataGridView1.Columns.Count > i; i++) { DataGridView1.Columns[i].MinimumWidth = 20; } これってもっと簡単に書けませんか?
全回しするときは基本的にforeachを使う ただlinqのforeachを使ってよいのかはよくわからん。パフォーマンス悪いと聞くし
LinqにForEachはない あれはリストのメソッドだよ
>>103 >>104
さんくすです、LINQってことはSelectをつかうんでしょうか
>>105 さんくすです、パフォーマンスは落ちてもかまわないんで
最初foreachで書こうと思ったんですが、わからなく
ん? for (var c in DataGridView1.Columns) { c.MinimumWidth=20; } よりも短く描きたいってこと?
>>108 さんくす、面白い書き方ですね、ただMimimumWidthが出てきませんでした
少し変えればよさそうだけど、どこをどうかえれば
>>110 var をDataGridColumn に変えれば出る
えーそんなわけないでしょと思って確認したら
ColumnsのDataGridViewColumnCollectionは非ジェネリクスのIListしか実装してないのか・・・
DataGridViewってVS2005以前の書き方で実装されてるのね
となると、かっこ悪いけどキャストをかませて
for (var c in DataGridView1.Columns) { (c as DataGridViewColumn).MinimumWidth=20; }
と書くくらいしかないか、
>>103 のとおりDataGridView.Columnsを変数にするくらいしかなさそう
あ、forじゃなくてforeachか ちゃんとIDEなりVSCodeなり立ち上げて書かなきゃだめね、失礼
抽象クラスとインターフェースの使い分けのコツを具体例で教えて下さい!
>>116 使い分ける必要はない
常にインターフェイスを使う、でいいよ
抽象クラスはインターフェイスを使った上で、どうしても実装の大部分が重複してしまうような場合に稀に使うことがある、という程度のもの
全く使わなくても問題はない
>>100 所属クラスを示す汎用のエイリアスのようなものがないかなーと。
でも using static ディレクティブ自体を知らなかったので勉強になりました。これを定義すれば結果として同じ事出来るし。
ありがとう。
昔の人は言いました「100人のプログラマーがいたら100通りのオブジェクト指向がある」
>>112 さんくすです出ました
foreach(DataGridViewColumn c in DataGridView1.Columns) { c.MinimumWidth = 20; }
>>113 さんくすですキャストのほうでもいけました
8からデフォルト実装も入るからますます使いどころが
WinFormsで、フォーカスが当たってない時でもキー入力を取る方法ってありますか?
ああ、パスワードスキミングするならむしろそうじゃないと都合悪いかw
必死でない頭絞って やっと浮かんだ用途がそれなのか? 残念な人だこと…
1ヶ月位VBAを触って今日Visual Studio Express 2017をインストールしました せっかくならVBAの癖が着く前に…と思ったのですが、VBAで書いたプログラムに互換性は無いでしょうか?
>>131 ここ、C#のスレだよw
VBAは20年前に死亡宣告されたVB6の親戚。
今のVisual Studioに入ってるVisual Basicとは似てるけど別物。
もちろんC#とは似ても似つかない
>>131 VBAとC#/VB.NETは別物
あとなんでVS2017のExpressをインストールしたのさ
わざわざ機能制限版のExpressを使うとかマゾプレイヤーかな?
>>132 1から勉強しなおしになるでしょうか?
Visual StudioでもC#を使えると思っていました
>>133 社内のライセンスとセキュリティの関係でExpressしかダメと言われてしまいました
>>134 質問の内容が変わっているよね
VBAで作ったものはVB.Netに手直し程度で動かせるようになるものができる場合もあるけどC#は書き方も完全に別物
ここで聞くより自分のPCで動かしてみたほうが早い
>>135 そこはVisual Studio Codeやろ…
>>134 C#を使えないなんて言ってないよw
VBAとC#は完全に別の言語だと言ってるだけ
VBAの知識はC#を覚える上でほとんど役に立たないよと
用語と名付けルールについていくつか教えてください まず、class Asdf{}の入れた物(Asdf asdf; でいうasdf)は、何と呼べばいいんですか?変数でいいのでしょうか? また、Asdfの入ったものを自動プロパティで宣言したい場合、一文字めを大文字にすべきなのでしょうか? Asdf Asdf{get; set;}なのか、Asdf asdf{get; set;}なのかどちらが正しいのでしょうか
>>139 Asdf asdf; のasdfは変数名でいい
プロパティ名はCamelCase(先頭大文字)にするのが慣習、自動実装プロパティかどうかは無関係
>>136 失礼しました
まずは色々と触ってみます
>>138 早とちりしてしまいました
基本から勉強してみます
ありがとうございます
>>140 ありがとうございます
大文字かどうかは、クラス名とプロパティ名が一緒になってしまっていいのか結構疑問に思っていたのでスッキリしました
Pythonでは文字列をコマンドとして実行するのにevalとexecの2つあるみたいですが C#で文字列をコマンドとして実行するには、eval以外の関数はありますか?
subprocess.popen subprocess.call subprocess.call_hogehoge もっとあるぞ
フォーム間でのデータの受け渡しを行うクールな方法を教えて下さい。 今は以下の2通りの方法ででやっています。 ①互いの公開プロパティ(public get / private set)を参照しあう。 (互いに相手フォームへの参照を通じて取得するので疎結合になり切れていない) ②データ保持用クラスを作って、そのインスタンスを参照する。 (データ保持用クラスが増えまくって、だんだん管理困難になりそう)
WpfやUWPなどではDIコンテナってものを使うのが流行りだが、WindowsFormsでも存在するそうだ こっちは使ったことがないからお薦めはわからんがググって探してみるといい まあクールってことならWindowsForms捨てるのも一つだね
>>149 WPFやUWP自体がほぼ全くと言っていいほど使われていないのに流行りも何も
DIコンテナは主にWebで利用されるもので、デスクトップアプリではあまり使われないよ
アプリの起動を遅くする原因になりやすいし、エンドユーザーにバイナリを直接配布するタイプのアプリではそもそも実装を差し替えたいというニーズ自体が稀だからね
DIコンテナはこの場合関係ないのでは? 結局素直に②でやるのがいいと思う
>>146 クールな方法というか堅実・定石な方法
フォーム間のデータのやり取りなら②
相手のフォームに依存するとテスト時や改修時に困るでしょ
原則として相手の画面やクラスの事は知らないに越したことは無い
その設計でもデータ保持用クラスの管理が大変になることは無い
管理が大変になる場合は設計がおかしい
画面遷移の組合せ数分クラス作るとかアホなことすれば大変だろうけど
wpfのCheckBoxについてですが、Contentに文字を設定するとその文字の表示範囲もチェックオンオフの感知範囲になってしまいます これを無効にして純粋にチェックボックスの□のみをクリック範囲にすることはできないのでしょうか? CheckBoxのContentに文字を設定するのではなく、横にTextBlockを置くなどしないと無理でしょうか?
>>154 手段としてはその通りだと思う。
しかし、あのちっさいチェックボックスに正確にマウスを当てないと反応しないってのは、
使い勝手からするとどうかと思う。誤クリックが多いというなら、そもそもの配置場所が悪い
>>154 PreviewMouseDownイベントを追加して
e.OriginalSourceからVisualTreeHelper.GetParent()でVisualTreeを親方向にたどっていき
途中に"checkBoxBorder"というNameのBorderがあればe.Handled=true;で無効化出来るかもしれない
出来るかもしれないが一般的にCheckBoxはテキスト部分をクリックしてもオンオフ出来るものだから
その一般的な挙動を逸脱するよっぽどの理由がなければ止めておいたほうがいい
>>156 >157
ありがとうございます
具体的にはListBox内にCheckBoxを配置しており、チェックとは別にListBoxから選択時に多少のインフォメーションを表示するといった形にしたいためContentも含めると誤クリックが発生してしまいます
とりあえずは文字とCheckBoxは分離する方向でやってみたいと思います
先日C#を始めたものです Hello Worldを記述出来ました エクセル等のオフィスソフトに対応している初心者向けのサイトは無いでしょうか? よろしくお願いします
>>161 epplusが手軽だと個人的には思う
サイトはいくつかあるからググって
プロパティで、StringをDateTimeのようにnull許容できるようにしたいのですが、可能でしょうか? public DateTime? test1 { get; set; } ← 可 public String? test2 { get; set; } ← 不可 DapperでDB操作してるのですが、DBゆえにnullがあるのでどうしたものかと
C#8.0の新しい文法を使う意図だったら「#nullable enable」のディレクティブをつけないとnull許容参照型にならないよ そうでなければ、stringは参照型だから?をつけずとも普通にnull許容
>>162 帳票作成でC#使うなんてよくある話だろ
>>168 Stringはそもそもnull許容なのですね
Dapperでデータ取れないのは別の事情がありそうなので調査してみます
ありがとうございます
>>171 帳票作成でC#を使うこととC#でExcelを操作することはかなり違うけどな
>>174 日本語が理解できないのか?
> こういう意図でC#を使う人は少ないと思うからそういうサイトもあまりないのでは
>>162 はその少ないサイトって話だろ…
データを取得したんですが
第三正規系までできません。
こちらのデータを第三正規系にお願いします。
第一正規系はやりました。
おすし名,おすしID,店舗ID,価格,データ取得日時,店舗名,おすし説明,色,分類,大きさ
まぐろ赤身,MGR-0000,KRA,120,2019/10/18,くら寿司,さっぱりうまい。上出来,鮮やか,赤身,小さい
まぐろ赤身,MGR-0001,SSR,110,2019/10/18,スシロー,こってりうまい。おすすめ,濃い,赤身,大きい
まぐろ赤身,MGR-0002,HMZ,90,2019/10/18,はま寿司,まずい。食えたもんじゃない,汚い,赤身,小さい
まぐろ赤身(漬け),MGRZ-0000,KRA,140,2019/10/18,くら寿司,漬け。さっぱりうまい。上出来,鮮やか,漬け,大きい
まぐろ赤身(漬け),MGRZ-0001,SSR,130,2019/10/18,スシロー,漬け。こってりうまい。おすすめ,濃い,漬け,大きい
まぐろ赤身(漬け),MGRZ-0001,HMZ,100,2019/10/18,はま寿司,漬け。まずい。食えたもんじゃない,汚い,漬け,小さい
>>175 日本語理解できてないのはそっちやろ…
>>174 は「帳票作成でC#を使うこととC#でExcelを操作することはかなり違う」に対する反論
>>176 このスレのタイトルを3回声に出して読んでみようか
>>177 頭大丈夫?
それとも
> 帳票作成でC#使うなんてよくある話だろ
をごまかしたくて必死なの?w
>>182 鸚鵡返ししかできないならROMってりゃいいのに…w
>>184 夜中までレスしてる
>>182 に言ってやれよw
どこもかしこもマウントレスバトルばかり なぜひとはあらそってしまうのか…sigh…
しかも、内容が思いっきりくだらない マウントを取るためだけにレスをしたとしか思えないくだらなさ
C#は見かけ上は一見C++に似たような顔で欺いたVBだな。
すまんが、インターフェイスとオートプロパティーとがよくわから人だけどさあ interface IPerson{string Name();} class Person : IPerson {public string Name{get=>"Taro";}} これじゃなんでIPerson.Name();を実装したことにならないの?正しくはどうすればよかんべえ?
自分で気づいて今インターフェイスをstring Name{get;}にしてみたらできた すまん、191のは無視してくれ・・・・
インターフェイスがメソッドで実装がクラスだからダメ
ListViewをLargeImageListとして使って、かつ画像は非同期的に読み込んで反映させていきたいんだけど、 ImageListを変更しても画像が差し変わらない。アイテムを選択したりすると変わる。 差し替え後に強制的に反映させるにはListViewをRefleshするしかない?
ListViewItemのVMにINotifyPropertyChanged実装しとらんのか?
RichTextBox.Textプロパティに数MBの文字列をセットすると 5秒くらいフォームがフリーズするので Task/async/await的なコードを試したのですが 別スレッドからコントロールにはアクセスできないと怒られ それではとInvokeメソッドを使ってみるも 今度はアクセスで怒られない代わりにまたフリーズ。 上手いこと非同期でTextプロパティにセットする 方法はありますかね。
>>197 数MBの文字列程度でフリーズした経験はないけど、その環境でフリーズするのなら非同期にしても解決はしないよ
Invoke使おうがその文字列の処理にそれだけかかるのだからどうしようもない
非同期にするのは処理中にキャンセルするとか他のGUIからの入力処理をする目的じゃないと
ありがとうございます そういう回答がいただけただけでも助かります 違った角度からの解決策を考えます
事情が許されるなら、俺ならRTFをHTML変換してブラウザコントロールで表示させるけどね
試してなくて妄想だけけど、SuspendLayout/ResumeLayoutとか?
UIスレッド自体が輻輳してるんだからそんなことしても無意味w 別のプロセスか別のUIスレッドで動作させるか、 あるいは小分けにしてちょっとずつ更新するしかないと思うよ。
クラス継承の意義がイマイチ分かりません 継承したいクラスをフィールドに持たせ、共通して呼び出したいものはインターフェースとして定義するではダメなのでしょうか? 単にその両者をいっぺんにやるためにあるという理解で良いんでしょうか?
>>205 それで正しいよ
現代のオブジェクト指向においては継承は基本的に悪であって、極力使うべきではない
アポロ13って映画に「何のために作られたかではなく、何に使えるかが重要」って台詞が出てくるけど、 意義とか考えるのは(重要だとは思うけど)後回しにして、どういう使い方ができるかに 注視した方がいいよw あと、オブジェクト指向関係で教条主義的なことを言う奴の話は眉に唾して聞いた方がいいw これほんと
>>209 悪の帝国Microsoft製だししょうがないなw
Windows上でVisual Studioを立ち上げて.Netアプリ開発をする以上 お前も悪の帝国の軍門に下って生きるしかないのだ
>>205 例えばフレームワークが用意してるControllerクラスを継承して20個くらい個別のコントローラーを作る場合と
個別のコントローラーにControllerクラスを持たせて呼び出しを委譲できるようにする場合
前者はカスタマイズしたい部分だけ書けばいいけど
後者はControllerの機能を呼び出すためにはすべてのクラスに委譲メソッドを用意する必要がある
Controllerのメソッドを20個呼び出したいなら20x20で400個委譲メソッド定義をしないといけないしテストもしないといけない
自動生成することも可能だけどそれを考慮しても必要になる労力とコンポジションで得られる柔軟性が見合わない
それぞれメリット・デメリットあるからそれを判断して使い分けるのが良いと思う
正しいと思うけど、継承のメリットを論じている段階でその例はたぶん通じない。ちんぷんかんぷんだと思うよ
そういえばc#になってから継承なんて使った覚えがないな
継承を使うとしても、KeyedCollectionみたいな用意されたabstractクラスの具象を書くくらいかな クラシックなWinForms/WebFormsと格闘するなら継承ありきなんだろうけど
List型からカンマ区切りの文字列にしたいのですが、先頭や最後にカンマがくっついて欲しくありません こう言う場合ってどう書くのですか? string s = ""; int i = 0; foreach(var l in data){ if(i == 0) i = 1; else s += ","; s += l.ToString(); } 自分なりにも書いてみたのですがなんか素人感が半端ないです どうか正しいかっこいい書き方を教えてください、お願いします
var s = string.Join(",", data);
Goは
>>205 のような考えで継承廃止したんじゃなかったっけ?
コーディングコスト削減メリットよりも階層複雑化によるデメリットの方が大きいから、やるならインターフェースでやれって考え方だったと思う
天下のグーグルがそう言ってるからには継承が悪という考えもあながち全否定は出来ない
var s = (data.FirstOrDefault() ?? "").ToString() foreach(var l in data.Skip(1)) s += "," + l var s = "" foreach(var l in data) s += "," + l s = s.SubString(1)
>>222 Rustもそうだね
MSやAWSが最近推してる
null許容型に属性のrangeが有効か否かを調べたいんだけど、msdnを見ても書かれてない こういうときってどうやって調べるの??
Rangeということは「最小値と最大値」の範囲内かどうかなわけで nullが範囲外なのは自明だからそもそも意味がなくね? nullは特別に範囲内ってのなら「最小値と最大値」であるRangeじゃなくて他の方法で表現せざるを得ないよね
>>226 単純にnull許容型にrangeの属性を付与できるか否かってだけが知りたい
それを調べようとしてもmsdnに記載が見つからないって話
これはtestが0-100になるように有効だろうけど
[range(0,100)]
int test
このrangeは有効なのか?って話
int?にはrangeは無効で101とか入れれますよーとかはないよねって調べたい
[range(0,100)]
int? test
>>227 range属性自体はstringに対してだろうが付与出来るし、変数への代入を阻止するものじゃない
それが有効かどうかはrange属性を使って検証する側の問題
ASPについて質問です MVCにできてWebFormsじゃできないことってどんなのがありますか?
>>229 できる出来ないの基準は?
既存コントロール使わないで全部時前で処理するなら、出来ないことが重い浮かばない
原理的に出来ないことは無いが大変さが違う それこそMVCで組みづらいとか EFとの相性とか WebAPI作りたいとか 他言語や環境と混ぜづらいとか つぶしが効かないとか まあ新規でWebFormsはやめとけと
>>229 WebFormsは.NET Coreおよび.NET 5以降ではサポートされない
今から新規に使ってはいけない
>>221 >>223 ありがとう
こんなの全然知らなかったよ
System.Collections.ConcurrentにConcurrentListはないようですが、スレッドセーフなListはSyncronizedCollectionを使っておけということなんでしょうか?
>>237 ConcurrentListが無いのは、Listは外部ロックを使わない並行処理との相性が悪いからだろう
追加と参照のみならいいが、削除や途中への挿入があるとインデックスがほとんど意味を持たなくなってしまう
インデックスが指してる要素が他のスレッドによる変更の影響で突然コロコロ変わったら使い物にならないのは容易に想像できるだろ?
SynchronizedCollectionを使うとかそういう話じゃなくて、Listインターフェイスの設計が本質的に並行処理と相容れないんだよ
あるソフト使ってて、これ使いたいなって機能があるんだけど、なんて検索かけたらいいのか分からないので知っている人いたら教えてください。 WindowsフォームアプリでVisualStudio2015で開発しています。 [欲しい機能] 例えばWindow内が横3段に分かれいるとすると ------------△--------------- みたいに境界が表示されててそこをクリックすると部分的に隠したり、表示させたりできる機能 今作ってるアプリが監視系で画面上に常駐するので、出来るだけWindow内の邪魔なボタンとかは隠しておきたいのでこの機能が欲しいです。 知ってる方いたらよろしくお願いします。
>>238 > 追加と参照のみならいいが、削除や途中への挿入があるとインデックスがほとんど意味を持たなくなってしまう
それマルチスレッドじゃなくても起きるだろ
>>239 折りたたみできるpanel とかそんな感じ?
>>240 程度問題だよ
マルチスレッドなら尚更問題になるのは明らかだろ
結局、インデックスに依存する一連の操作の単位で外部ロックを取る必要があるから、concurrentである意味がない
>>242 バカなの?
インデックス使って途中挿入削除されたら問題なるのはマルチスレッドには関係ない
そもそも挿入削除してるのにインデックスで処理するのがおかしいと気づけ
>>243 シングルスレッドでの同期処理ならプログラマが意図しないタイミングで変更が加えられる可能性は少ないだろう
そもそも途中挿入しないならConcurrentBagでいいよね
自分で答え出てるじゃん
本質を理解できない馬鹿に説明しても無駄なことがよくわかるなw
>>239 XPの時代のエクスプローラーのタスクパネルみたいなUIだと思うけど
たぶん標準では存在しない
折り畳みできるコンテナを自分で作れば、それを別のPanelの中に入れ子にして
AnchorとDockをうまく設定すれば似たようなことは一応できると思う。
PanelじゃなくてFlowLayoutPanelを使ってもいいかもしれないが、
たぶんかえって使いづらくなりそう
>>241 そうそう折りたたみって言葉がしっくりきます。
試しに「折りたたみ panel」あたりで検索したらやりたい事が出来そうなサイトが見つけられました。
SplitContainerとクリックイベントを使ってどうにか出来そうです。
また、境界部分にも三角形△などの目印を付けるやり方が載ってるサイトも見つかりました。
いいヒントになりました、ありがとうございます^^
頭に0個の参照って表示されてる関数が無数にあるんですが、これ要するに全く使われてないってことですよね 全部消してしまいたい……と思ったのですが実行する中でその関数が呼び出されるような可能性ってあったりするんでしょうか
リフレクションとかで呼べば参照カウントされないんじゃない
なんかのライブラリとかで、publicで公開してるやつとかか?
複数のパネルをドラッグドロップできるようにしたんだけど マウスが別のパネルに重なったときにパネルがいれかわってしまうんだけど これを防ぐにはどうしたらいい?
>>255 「パネル」をドラッグドロップしている?
一番上または必要なパネル以外のドラッグドロップを受け付けないようにしたら
>>255 マウスダウンで「掴む」じゃん
マウスドラッグで「移動」するじゃん
マウスアップで「置く」じゃん
ドラッグ中の処理は移動なのにどうしてマウスダウンで掴んだやつ
以外が動いちゃうん?
マウスがパネルに触れた時点でフォーカス変わったりしているとかだろ 最低限の動きするミニマムコード使って検証する方がここで聞くより解決しやすいと思うがね そこでわからなかったらそのミニマムコード出してまた質問したらここの人も答えやすい
>>253 あーなるほどでもそんな上等な書き方出来る人が作ったわけじゃないからなさそうですね
>>254 他の似たようなソフト作る時に使ったソースコードそのまま組み込んだっぽいですね見た感じ
List<(string, int)> list;があった場合、listの中からlist.item2が最大の要素(string, int)を得るにはどうすればいいのですか? var l = list.Max(x=>x.Item2);みたいにしたいのですが、int型が帰ってきてしまいます
OrderByDescending.FirstOrDefault
>>262 だと計算量のオーダーが増える
先に Max で最大のItem2 (maxItem2)を求めておいて list.First(x => x.Item2 == maxItem2) のほうがマシ
経験上、こういう汎用的すぎるユーティリティ関数を自作して多用するのはお勧めしない 個人開発ならいいけど、多人数での開発になると新しいメンバーとの間で記述方法に差異を有む原因になり、結果的に負債化していくんだよ ダサくてもこういうのは毎回ベタに書いたほうがいい
>>262-265 どの方法も一見正攻法ではないように見えるため、人に教えてもらわないことには勇気を出して書けませんでした
ありがとうございます
>>265 計算量のオーダー気にしてんだろ?
他の奴が違う書き方して増えたら大変じゃん
あ、どうでもよかった?
素直に int max = list.Max(tuple => tuple.Item2); var maxValueItems = list.Where(tuple => tuple.Item2 == max); でいいじゃん int に重複がない前提なら Dictionary 化した方が捗る
なんかいいロガー知らない? 3つのテキストに警告・注意・情報がそれぞれ安全に吐けるロガー
>>272 最近は ASP.NET Core の Microsoft.Extensions.Logging を使うのがMS推奨の最先端
公式に拘らないならSerilogなんかも流行り
>>261 list.Aggregate( (result, next) => result.Item2 > next.Item2 ? result : next );
O(n) で一度しか走査しない。
ただし、複数該当しても 1 つしか返さないし、Aggregate メソッドは LINQ to Entities 非対応。
質問はこっちでいいんかな? webviewってWebBrowserのGetElementのような事ってできないんですかね? テキストに入力したりボタン押したりしたいんですけど、検索してもなかなか見つからないんです 誰か教えてください!
c# web 自動ログイン当たりでいっぱい記事が出てくるんじゃないの?
>>276 できるよ
前にtwitterにログインする処理作ったわ
WebBrowserのHtmlElementみたいなオブジェクトは用意されてない webView.InvokeScriptAsync("実行したい処理をすべてJavaScriptで記述") みたいな書き方で地道にやるしかないんんじゃ
GUIに組み込む必要が無いんならSelenium使えば
なるほど、JavaScript書けば操作できるわけですね
やってみます!
ありがとうございます
>>281 WebBrowserだと、なぜかjQuery使ってるサイトでエラー出るんですよね
レジストリ加えてie11で動くようにはしてるんですけどjQueryで引っかかるんです
でWebViewでと思って質問した次第なんです
ああごめん、webviewか webbrowserと勘違いしてたわスマン
>>275 ありがとう
これ、SQLの感覚とはえらい違うのね・・・・
>>284 これよりクエリ式のLINQはもっと酷いと思う
ASP初心者だけど がっつり学べるオススメの本とかありますか?
ASP.NET Coreのことなら日本語のまともな本はない Classic ASP.NETやMVCのことなら.NET5で廃止されるから今から始めるのはお勧めできない
coreなら「プログラミングASP.NET Core」一択でしょ。
>>288 Classic ASP.NETってこの下のこと?
そもそもがASP.NET Coreなんか学んでどうすんの?と思うおじさんであった…
>>291 それを使ってるプロジェクトにアサインされたら仕方ないだろ
ASP.NET Coreは.NET縛りでWebアプリケーション作れ言われたら一番マシな選択肢じゃないのか
linux+nginx+ケストレル+asp.net coe+ef+postgresql もはやデフォルトスタンダード()だろ 最安でシステムができる
>>294 + Visual Code が一番安定
ぶっちゃけC#の未来ってどうなの? 来年の.NET 5でクロスプラットフォーム化が加速するようだが
クロスプラットフォーム化だのcoreだのは将来投資あるいは保険みたいなものじゃないの? 本気でそっちの方にいく将来像を持っているわけではないと思う。 UWPもぜんぜん普及しないし、 建前はともかく実態的には.NET Frameworkと一心同体という状態が 今後も続くんじゃないのかな 知らんけど
最早coreのほうがmsにとっては主軸だよ microsoftはwindowsよりazureの方に重きをおいてるし
仕事でiPhoneやAndroid開発するときはC#使うことが多くなってきた
,net coreを主軸にしたばかりにMSの製品が沈没していく未来しか見えない
米国だと内製が主流だから、受託じゃ怖くて使えないようなものも自己責任で比較的カジュアルに使える開発現場が多いんだよ .NETの先端は、もはやOSS利用にいちいち申請が必要だったりするようなジャップ企業には縁のないものになってしまった
>>304 Azureねえ
仕事で2年使い込んだけど、二度と使いたくないわ
C#に魂を捧げる覚悟ならいいけど、それ以外も使う予定があるのなら絶対に選んではいけない
魂をささげてはないけどほぼC#しか使ってない 異常に効率が悪いが仕方ない どうしても必要ならpythonやTS(JS)使うけど
>>306 俺はAWSよりAzureを選択した国防省の判断の方が信用できると思うわ
>>308 MSはちゃんとアメリカに税金払ってるし、クラウドプロバイダによるOSSタダ乗り問題に対する姿勢などについてもMSは比較的真摯であり、そういう意味では確かに信用できる
しかしAWS, Azure両方を実業務において一年以上使った上で、サービスとしてはあらゆる面においてAWSの方が遥かに上だ
サービスとして新しいものが作られてるのはAWSという感じがする ポリシーが一貫してる気もする
>>310 AWSは一貫性が高いし、一度作ったサービスは責任を持って継続的に統合し続けるよね
Azureは思いつきのように低品質で他サービスともロクに統合されていないサービスを出してすぐに廃止したり「v2」が出てリプレースされるケースが多い
本当に馬鹿らしくなる
>>301 ザマリンですよね?
あれってJavaと比べて速度どうです?
あんまり変わらないです?
俺もXamarin使ってるけど、起動時だけちょっとモタつく印象かな。 Android。
C#ってTwitterでの検索が困難だな #が無視されてしまう
デザインパターンって何見て知ればいいんですか? おすすめの本とかありますか
formをスクロールバーでちょっと下にスクロールしてから パネルを追加するとLocationのポイントが下にずれてしまいます panel.Location = new Point(30, 60) これがスクロールした画面を基準にしたポイントになるので yの60がずれてしまいます これを防ぐにはどうすればいいでしょうか
自己解決しました 一旦this.Autoscroll=false; にしてから描写がおわってからtrueにすればいけました もし他にいい方法あったら教えて下さい
ワイPG、ASP案件にアサインされ無事WebFormsで強行することに成功する いきなりCSHTMLとか言われてもわからん
view engineは選べるやろ つっても1日もあれば理解できる内容だから 既存のviewを使い回すわけじゃなければ素直にRazor使ったほうが楽
>>321 RazorってMVCとセットってイメージだが違うのか
Razorの判断は今週末にどれほど理解できるかで判断してみます
Razor自体は何も難しくないがHTMLやJavaScriptの経験が必須だぞ
>>323 やっぱりか
昨日コレ買ってRazorが一切出てこないから残念です
>>322 MVCならWeb Form用のview engineでもRazorでも簡単に変更可能って話
ASP.NET Web Formsの場合はたぶん無理、できたとしてもハードル高いと思う
質問なんですが ゴミ箱に送る方法で簡単な方法ないの?VisualBasicを参照するしかないの? C#使ってる人はゴミ箱に移動するって使わないのだろうか?
使わないね 利用したいケースも思い浮かばない そもそもファイル削除は極力しない
そもそもC#の用途として、今時デスクトップアプリを作ってる人自体が絶滅危惧種だろう WebアプリやUnityゲームでゴミ箱が必要だと思う?
winformなんだけど ひたすら流れてくるログを表示してくれる フォームに埋め込めるコンソールウインドウみたいな コントロールってないだろうか 折り返しとか最大保持行数とか設定できるやつ
>>327 そのVBのアセンブリは.NET Frameworkに標準で入ってるもんなんだから十分簡単な方法では
ファイラー作ってる人は ゴミ箱に入ってもらわないと困るかもな エクスプローラーのゴミ箱からもとに戻す その一点だな
>>332 ないと思うけど、そんなのTextBoxでもRichTextBoxでも
新しい行を追加する時に既に「行数 ≧ 最大値」だったら
先に先頭行削除してから追加するだけと違うの?
何も難しくない気が
>>332 ConsoleControlってのでできそうだけど
ListView使って自分でやったほうが早そう
>>335 先頭行削除するときに先頭行以外の部分をコピーする必要があるから
ログの量とか速度が速いと困るかもしれない
リスト系はリスト系で1行目の途中から2行目の途中まで選択してコピーとかできなくなったり
>>338 行数は上限があるんだから増えないのでは?w
それに速度が問題になるようなケースならリアルタイムで逐次的に表示更新する
意味ないのでは?
だーれも目で追えないと思うよw
>>340 お前は問題を履き違えている
Stringのコピーなんか人間の体感スケールで見ればそれ自体は大したコストではない
問題は、Stringの再作成時にテキストボックスの内容全体を更新しなければならないこと
いや、速度がどうとか言う人がいたんで、 逐次的な表示更新が間に合わないなら 最新n件をキューにためておいてUIの都合でおっとり更新したらいいんじゃないか、 って言いたかったのでは?
なんかいろいろすいません テキスト系のコントロールだと全書き換えになって遅いし List系だと折り返しがしづらいしで 表示だけに特化したコントロールはないかなと思ってました 表示と同時にログはファイルにも記録しているので ドバッと来て追いきれない時はファイルでじっくり見ます 画面はあくまで気になるログが出ていないか 確認する程度のものです
「c# log viewer」とかでググって出てきた奴を片っ端から試す もし満足できるものが無かったら自分でコントロール作った方が手っ取り早いと思う ログのパースが不要なら簡単にできるでしょ
>>344 テキストボックス使ってログを流すときは最新のログを数十行とかだけ表示するようにしたら遅くなることはない
必要なら全体表示に切り替えできるようにしとけばいい
いやテキストは遅いしチラつくし… コンソール見たいなログ表示ってやっぱり 作るしかないのかな
>>347 RichTextBoxでチラついた経験は無いけどダブルバッファリングを有効にしてみたら?
https://ideone.com/SlZEBm 表示が遅いとは思わない
テキスト折り返したいならDataGirdView
ConsoleControlってのはコレ
https://github.com/dwmkerr/consolecontrol >>348 試してみたよ、速度はそこまで悪くなかった
ただ最新のログを表示してくれないので、以下のコードをtextrollに追加してみたんだけど
スクロールバーが激しく上下に移動して
バグったようにちらついてダメだった
log.SelectionStart = log.Text.Length;
log.Focus();
log.ScrollToCaret();
>>349 ありがとう試してみる
>>330 さいきんはデスクトップアプリつくらないのか、よもまつだな
>>328 削除は危険だからなあ
>>331 さんくす、でもなにやらむずそう
>>333 さんくすね、十分簡単なんだけど、ゴミ箱に移すという基本的なことが標準でできないのかなと
>>334 そうそうそんなかんじで、ファイルを整理するのにゴミ箱ほしいなと
>>350 ログ表示って何も考えず表示したら勝手になんねっけ?
textBox1.AppendText(s);
これだけじゃねっけ?
クロスプラットフォームというお題目に従えば ゴミ箱はOS依存な機能であって基本的なことというわけでもないし…
ちなみにループの中なんかでラベルの表示を変えたいときは label1.Update(); みたいにやらんと表示してくんないよ そういうのはおk?
>>349 試してみたよ
ログを追加したときに最新行を表示してくれる機能がなかった
中身は結局RitchTextBoxみたいだね
ログはどんどん溜まっていく一方で、古いログを消す機能は実装されてないみたいだった
なかなかこれってものはないもんだなぁ…
>>350 ScrollToCaret使わなくても組み替えて最新の行をAppendTextで出力するだけでいい
そもそもスクロールしない行数にしたらいい。80行にしてあるのは「この程度では遅くならない」例のためだけ
>スクロールバーが激しく上下に移動して
表示が早いからだよねそれ
何を既に試して、その上でどういう要件が満たせないから困ってるのか、 最初から書いて欲しいよね 後出しで「それだとこういう不満がある」とか言われてもみんな気分悪くなるだけじゃないの
結局、ログがどうあったらいいかよくわかってないんだろ そもそも「誰が」「どう使う」ためのログなのか?わかってなきゃ この世に存在しない無敵のログ表示を求めて彷徨い歩くだけだ
最初に言った通りコンソールウインドウみたいなのが欲しいんだよね 最新のログが一番下に表示されて、勝手にスクロールしていくような ログが延々と流れてくるので保持行数は200行程度として できるだけ軽いのが欲しいんだ
200行程度ただのtextboxで十分では? 200万行の打ち間違い?それか1行数万文字あるの?
TextBoxに1行100文字のn行の文字列を設定し、最下行を表示させるのにかかった時間 (@Ryzen 3700X) 2行:2[msec] 20行:4[msec] 200行:8[msec] 2,000行:60[msec] 20,000行:563[msec] 200,000行:5,624[msec] 2000,000行:測定不能(OutOfMemoryException) 備考 TextBoxに1万行設定した場合、設定にかかる時間はそんなでもないが、TextBoxを変形させる(ウィンドウサイズ変更に追従させる等)のに時間がかかる 5万行になるとまともに変形しない
視認するデバッグコンソール程度で重いも軽いもないと思うが 骨董品レベルのPC使ってるのか? リアルタイムで見るログならログレベルで絞ればいいのでは?
直近200行のリングバッファを表示するだけではダメなのか 2000,000行保持してまさか目視するわけじゃないよな 200行以前はファイルにでも吐いておけば
200行程度List<string>で保持して更新あるたびにaddとremoveして都度Textboxを更新でなんの問題も無いと思う 気になるならListをQueueにでもすればいい ごちゃごちゃさせる程でもない単純な要件なんだから実装もそれに倣えばいい
>>350 Double Bufferingでもチラつきが激しいなら
再描画を一旦停止してTextBox更新してから再開
https://dobon.net/vb/dotnet/control/beginupdate.html >>358 AppendText使いつつ最大行数を超えた古いログ削除できる?
>>332 の件、ちょっと気になったのでTextBoxで試してみた
(a) SelectedTextを空文字で上書きして先頭の行を削除、
その後AppendTextで新しいログを追記
(b) Linesを一旦List<string>にコピーして先頭行の削除と
新しいログの追加を行った後、Linesに書き戻しキャレットを末尾に
移動しScrollToCaret
(a)の方法でやると確かにスクロールバーがプルプルするw
(b)の方法ならそれはほとんど起こらない(完全ではないみたいだが)
(a)の方法でも、先頭行を削る時に一気に10行とか削れば
そこまで気にならない印象
そもそも高速でログを流すのでなければ表示の切り替えはそんな目立たないと思うんだけど
>>369 (a) を参考に空文字で上書きするときにTextBoxからFocusを外してスクロールバーが動かないようにできないかと思ったけどうまくできなかったw
削除時にスクロール位置動かなければうまくいきそうだけど手段が他にすぐ思いつかない
他に思い付いたやり方は3つ
・AllocConsole()使ってコンソール画面を表示してそこにログを流す
コンソール画面閉じるとプロセスも閉じるのでその対策が必要
・348にRichTextBoxを2つ用意して交互にバックグラウンドでスクロールさせた後に表示する
・348で最新のログを一番上に追加していく
いや、難しくしてるのは意味のない要件だって 細部まで詳細に思惑通りに動くコントロールが要求されるなら1から全部作るしか無い TextBox等のすでに提供されてるコントロールを使うならそれに則った要件に変えればいいだけ 内部の動作ログを画面上に出してほしい要件はちょいちょいあるけど、俺個人はいつも上部を最新にするかスクロールさせないかの仕様を取る 何なら画面のチラツキなんて目を瞑ることもあるし最新行への追従をさせないこともある 楽に実装したいからそういうコントロール使ってるんだもん どうしても要件変えられないなら低レベルAPI使って描画制御からやりゃほとんど対応できる 対応しただけのコストに見合うメリットがあるかは知らん クライアントの強い要望とか言われたらするしか無いだろうけど
>>372 俺もDataGridViewにして上部を最新にしちゃうな
大体タイムスタンプの列あるし
そういえば昔、グリッドだかリストコントロール+それとは別のコントロールとして縦スクロールバーをつけて 擬似的にスクロール可能な全行表示コントロールを作ったことあった。 実際としてはグリッド・リストに一部のデータを表示しているだけってヤツね。 経験としては割に合わないからやめといた方がいいと思う。
zedgraph以外で使いやすいグラフ描画ライブラリをご存知ないでしょうか。
何が良くて何が悪いのか、それがわからないと提案できないぞ
>>350 >>348 の試してみたけど
新しいTextを設定する時に描画を停止してやれば普通に使える
描画を一旦停止させる方法は
>>368 のリンク
private void texroll(string st)
{
roll.Add(st);
if (roll.Count > 300) roll.RemoveRange(0, 100);
using (new SuspendRedraw<RichTextBox>(log))
{
log.Text = string.Join("\n", roll.ToArray());
}
log.SelectionStart = log.Text.Length;
log.Focus();
log.ScrollToCaret();
Application.DoEvents();
}
もうimage上じゃなくpictureboxに直接描画したほうがよくないかなw
>>375 使いやすいかどうか知らないけど
最近使い始めたLivechart
関数ポインタの配列的なことをマネージコードでやるにはどうすればいいの?
イベントハンドラ以外にマルチキャストを使うのはお勧めしない 古臭い黴の生えた機能だよ
>>383 ,384,385
arrayから取り出して実行するところのコーディングが分かりません
void(*ptf[n])(void);
ptf[0] = func1;
ptf[1] = func2;
ptf[2] = func3;
...
(*ptf[i])();
こういうのをメゾットでやるには、マネージコードではどうすればいいんだろう?
>>387 var funcs = new Action[] { Func1, Func2, Func3 };
funcs[ 0 ]();
とか
var func = funcs[ 1 ];
func();
C#で関数を値として受け渡すためにはデリゲートっていう型を使う
>>391 「マネージコード」は「馬鹿でもわかる」と読み替えればだいたい間違いない
palallelで同じbyte[]を読み書きしてみたら 思ったより処理が早くないんだけど 排他処理とかで重くなっていたりとかある?
何でも非同期にしたら速くなるわけではない 理由は排他制御とかTaskの生成コストとか色々 高速化するにはうまくやる必要がある
スレッドプール使うといっても生成コストは結構高いので一瞬で終わる処理だと逆効果
Parallelは処理の分割とかスレッドプールの管理はしてくれるけど 排他制御はしてくれんやろ?
やっぱそうか…単純に単純に処理が重いんだね 見直してみますありがとう
structをpublicにしても各メンバーは一括でpublic扱いにならないのなんでなん?親分がpublicなら子分も暗黙的にpublicやろがいと思いまして。
>>398 誰に対するpublicなのか勘違いしてね?
>>398 全部publicつけるように習慣づけとけばいいよ。
>>398 お前の親が知人にお前のことを紹介するとき、お前の机の中のエロ本やパソコン内のエロ画像フォルダを勝手に公開されたら困るだろ
WPF始めたばかりでThumbを使ってドラッグでコントロールを移動をしたかったんだけど これってそもそも中にラベルやボタンを置けない仕様なのかな…? とりあえずtemplateを使って無理矢理borderとbuttonを置いてみたけど 今度はborderからはDragStartedもDragDeltaもThumbに届くのに、buttonからは届かない Thumbってどういう風に使うものなんですかね… ウインドウのタイトルバー的な感じに置くものなのでしょうか
他のUI要素の部品として使われることを想定してるもんだからね
例えばラベルにThumbの機能を持たせようとするとどうしたらいいんだろう? thumbのテンプレートにラベルを置いたとして、ラベルのテキストやbackgroundプロパティを tumbのプロパティとして定義することはできるのかな…?
Thumbの機能ってのはよく分からんが、「ラベルにThumbの機能を持たせる」のに Thumbにラベルの機能持たせるとか主客転倒してるように思える
基本的にThumbってのは「マウスのドラッグで操作する」ことを表すもので そのドラッグにどう意味づけするかはThumbではなくてThumbを持っている要素が決めるもの スクロールバーならドラッグをスクロールとして扱うし スライダーなら値の増減を表す
もしかして俺の理解がおかしいのかな 普通のウインドウみたいにタイトルバーをドラッグしてコントロールを動かしたい場合って <dockpanel> <thumb> <label> みたいにするものなのかな、それとも <dockpanel> <label> <thumb> が正しい? 本当は <thumb> <dockpanel> <label> みたいにしてdockpanelのボタンとか以外の場所は ドラッグ移動可能にしたいのだけど…
正直全然説明が理解できんが DockPanelをルートとしたウィンドウ内ウィンドウ的なのが存在してて それのタイトルバー的なのをマウスで掴んで動かしたいってことでいいのか まあThumbの出番は無いだろうな
>>413 そういうこと!
なんだけど出番ないのか…どうしたらいいんだ…?
ドラッグできる部分をBorderとかで定義して そいつのMouseLeftButtonDown/MouseMove/MouseLeftButtonUpイベントでDockPanelを動かすコードを書く
public class Person { string name; int age; public read() { // ファイルを読み込んでnameとageに入れる }} こんなクラスがあるとします。1クラスに1役割ということでここからPersonクラスとPersonReaderクラスに分けることを考えます。 そのときPersonReaderは以下の2種類ってどちらがベターでしょうか public class PersonReader { private Person person; public PersonReader(Person person) { this.person = person; } public read() { // ファイルを読み込む処理 person = ~ }} Public class PersonReader { public Read(Person person) { // ファイルを読み込む処理 person = ~ }} readに引数無いほうがきれいな気がするんですけど、readerにもオブジェクトの参照持たせるのは不味いような気もします。 よろしくおねがいします
>>416 あんまり教条主義的に考えない方がいいのでは? 特に事情がない限り // ○○ファイを読み込んでこのインスタンスのフィールドとプロパティーを更新する public void Load(string path) { .... } とか、 // 〇〇ファイルから新しいインスタンスを作成 public static Person FromFile(string path) { .... } こんなの方が使いやすいのでは? win32apiをc#から呼ぶのは色々大変です 少し調べたらVanara.PInvokeのnugetがありました 日本語の記事が余り無いようですがどんなもんなんでしょうか?
>>416 C#を使用している限りでは、このコードでメモリリークの問題は起きないはずです
それでもどうしても心配だというなら弱参照にしてください
>>417 あーまぁ今回の例だとそうかもしれないですね。
ただ実際の開発だとxmlを読み込むんですけどちょっと処理が膨大で。読み込む先、今回で言うところのPersonクラスも相当でかいので分けないといかんだろと
>>416 正直どっちも勘弁してって感じ
インスタンス生成の責務をファクトリに割り当てる頻出パターンなので
ファクトリやファクトリメソッドのキーワードでググればいいと思う
ファクトリクラスはusing Personしても参照を持つ必要はない
>>420 personは分解できないの?
そんな巨大ならpersonを分解して
xml読み込んでパースした情報を保持するやつ
パースした情報からpersonの部品を作るやつ
personの部品からpersonを作るやつ
みたいに段階踏むかなぁ
nugetなんて誰でもリリースできるんだから著名じゃないライブラリの良し悪しは中々情報は得にくいだろうね。 頑張って元言語の記事読むしかないんじゃない?
まじかよ nugetはどっかの技術検査受けて 認められたのだけがnugetにリリースされてるんだと勝手に思ってた
>>420 どうしても分ける前提なわけね。
まあPersonReader がPersonのインスタンスを持つのは普通に変だよねやっぱり。
どこにも必然性がない。
PersonReader が状態を持つ必要がなければstaticクラスのstaticメソッドでいいはず
どうでもいいけど、
// ファイルを読み込む処理
person = ~
じゃなくて、例えば
// ファイルを読み込む処理
person.Hoge = ~;
person.Hage = ~;
person.Piyo = ~;
...
だよね多分?
最近のVisualStudioなら暮らすライブラリのプロジェクトで[ビルド(B)]-[パッケージ(P)]をクリックするだけで nuget登録用のnupkgが出来上がるよ あとはnugetにログインしてWeb上から適当に情報入力して登録すればすぐ反映される 悪意のあるパッケージとかどうやって識別してrejectしてるのか正直不思議 それとも表沙汰になってないだけでnpmみたいな汚染が日常的に起こってるのか さすがにストアアプリよりははるかにマシだけどNuGetも玉石混合、というかゴミパッケージのほうが多いと思うよ
>>428 自分で作ることは滅多にないけど、標準で用意されてるのは時々使う
FlagsAttributeやDllImportAttributeなんかは比較的良く使われているのではないだろうか
使わない人は全然使わないだろうけど
>>429 初学でASP.NET Coreのソースおっかけたりしても意味わからんくて困っている
調べてないけどxmlからデータクラス生成するくらいなんかのライブラリに投げちゃいかんの?
>>430 Attribute自体はプロパティやメソッドに付与して、コンパイラやライブラリに対して追加の情報を与えるだけ
Attributeが具体的に何を意味をするのかは、それぞれのAttributeによる
ASP.NET Coreのソースだったら、Validation関係かな
>>428 自作はenumにラベルつけるのに作るくらいかなぁ
enumの定義値とメニュー上の表示文字列対応させるみたいな感じ
多言語対応とかあるような案件じゃ使えないけど
すでにあるのはちょいちょい使う
TestとかBenchmarkとかは属性ありきだったりするし
>>434 enumにラベル付けるのは自分も作ったよ
多言語対応は第2引数にロケール指定出来るようにして多重定義するようにした
>>435 そのやり方だと対応言語増やすときに再ビルド必要になっちゃうよね
enum以外にも定義が必要な語句は多そうだからそういうのは外に出す方を取るかなぁ
まぁケースバイケースだろうけどね
>>436 属性ではリソースキーを指定して、文字列リソースを引っ張って来るようにした方が
文字列リソースが分散しなくて良いね
属性をキーにするぐらいにあらenumを直接キーにすりゃいいじゃんw 素直に拡張メソッドてToString定義した方が早いよw
>>434 それ自作しなくてもDescriptionAttributeが標準であるよ
拡張メソッドが使える以前はenumと相互に暗黙変換できるクラスを作って そこに変換メソッドを書いてたけど、あれは実にあほらしい作業だったなあ
>>439 実際にはenumとラベルを相互に変換したり複数対応させたり等々ケースに応じて細かな要件が出てくるからそういう拡張をするときのベースとして使ってる
あとキャッシュしないと遅いから自作側でキャッシュ処理も含めて作ることが多い
descriptionだとその属性自身を機能拡張したいときにしづらくない?
BindでEnumToStringConverter作るからそこでやるだろ。そこでリソース文字列を引っ張るようにする
チャートエリアとか図解したサイトないですか? シリーズだかなんやら意味分からん
C++のライブラリのちょっとした機能使いたくて現状C++でexe作ってそれをprocessで呼び出してる構造なんですけどなんかデメリットあります? 一応ラッパーもあってC#に一元化も出来るんですけどまぁ遅い。それに実行ファイル配るときに一緒にdllわさっと渡さないといけなくて。今はC#とC++のexe2つ渡すだけです ソースコード別になっちゃって管理がめんどいくらいしか思いつかなかったんですけど、なんかトラブルの種になりそうなことありますか?
>>421 -
>>422 >>425 参考になりました。ファクトリ周り全然分からなかったので勉強します。
フォーム上に左1/4が欠けた円を表示させたいです。 FillEllipseで円を書いてFillRectangle背景色で1/4を塗りつぶせばいいや と思ったら、FillRectangleが隣り合った塗りつぶしたくない図形も塗りつぶしてしまう。 なにかいい方法は無いでしょうか?
>>444 別に現状で不満ないなら良いのでは?
配布するものならexeが複数あるとC++の方のexe起動してうごかねーっていうのがくるかも
あと動かす環境が変わったときに両方のexeの再ビルドが必要になる可能性があるとか
環境まで言い出したらexeかどうかなん些細な話かもしれんが
>>446 DrawPie、FillPieがあるわけだが
すいません。 扇形ではなくて、左1/4のところでまっすぐカットしているという意味です。 図形の説明難しいな・・・。
よくわからんが、SetClipで描画範囲を指定すればいいんじゃないの
円弧の端と円の中心、もう片方の端と円の中心でそれぞれ線分を引いた形じゃなくて 円弧の端と端を1本の線分でつないだ形? まあGraphicsPath作ってFillPathすればいいんじゃない
>>446 境界線が不要でただ塗りつぶすだけならこれが一番簡単だね public void FillSlicedEllipseL(Graphics g,Brush brush, RectangleF rect, double ratio) { var clip = g.Clip; var sliceRect = rect; sliceRect.Width *= (float)ratio; g.SetClip(sliceRect, CombineMode.Exclude); g.FillEllipse(brush, rect); g.Clip = clip; } 必用ならパス作るしかないか >>444 Process経由の場合はDLL使ったAPI呼び出しに比べると
マーシャリング/アンマーシャリング、エラーハンドリングが面倒になりがち
現状そこに不満がないなら無理してDLLに変更する必要はないと思う
あと一応バイナリリソースとしてdllやexeをC#のアセンブリに埋め込んで1ファイルにすることも可能
(リソースからexeを取り出して起動したりDLLをロードしたりするための追加コードが必要)
>>443 NGワードに引っかかってリンク張れない…
「mschart series chartarea」でグーグル画像検索すると沢山表示されるうち2件位は希望の情報だと思うよ
EXEもLoadLibrary出来るのよ。 なので関数をexport出来れば、どちらでも使える
いろいろありがとうございます。
説明ヘタですいません。
https://ja.wikipedia.org/wiki/%E5%BC%A7_ (%E5%B9%BE%E4%BD%95%E5%AD%A6)
の上から2番めの図のABで円の端を切り落とした形状です。
任意の半径をしていするとこの形状が表示できるようにしたいのです。
隅っこがAB直線で欠けた円ですね。
https://ja.wikipedia.org/wiki/%E5%BC%A7_ (%E5%B9%BE%E4%BD%95%E5%AD%A6)
貼り付けたら後ろがハイパーリンクじゃなくなってますが、コピペしていただくとwikiのページが開きます。
やっかいなのは 欠けた円の半径を任意に変更したいのでGraphicPathで円に接する直線を引くのが難しいこと 欠けた円をたくさん描くので、rectangleやgclipでやると隣の欠けた円にも影響を及ぼすこと なんですよね。 clipならできるのかなぁ。
それもできないなら一度 どっかのピクチャーボックス(wpf?winforms?)に貼り付けて 欠けた円を作ったあとで それを必要な領域だけくり抜いて持って来ればええよ
vs2019でc#フォームアプリを作ろうとするとデフォが.net coreなのね .net frameworkはやたら下の方に出てくるしこっちもデフォはユーザコントロール用だ
>>457 おおーこれです!
ありがとうございます
Properties.Settings.Default を変数dに入れて クラス内のpublic変数にしたいんだけど 何かうまい方法はないだろうか 記述が長すぎるから短縮したいんだよね
usingは無理でした 名前空間はPropertiesだけで Properties.Setting.Default のエイリアスや参照は作れないようです privateだと参照が作れるんですが publicにするとDefaultが internal sealedで定義されているため エラーになっちゃうんですよね…
そりゃそうだろ internalでいいじゃん using static hoge.Properties.Settings; で Default.fuga なんて書き方もできるけど
publicなgetter setterもったラッパーでも作っちゃえば?
以下のプログラムについて質問お願いいたします。 --- 以下プログラム --- public static int TwoAdicValuation(ulong x) => TwoAdicValuationTable[(x & ~x + 1) % 67]; static readonly int[] TwoAdicValuationTable = InitializeTwoAdicValuationTable(); static int[] InitializeTwoAdicValuationTable() { var table = new int[67]; table[0] = -1; for (var i = 0; i < 64; i++) { table[(1UL << i) % 67] = i; } return table; } --- 以上プログラム --- 上記の TwoAdicValuation メソッドは、 ・引数 x がゼロのときは -1 を返す ・それ以外の場合、引数 x が 2 で割れる回数を返す という動作をするようです。 例えば TwoAdicValuation(2*3*5) は 1, TwoAdicValuation(2*2*2*17) は 3, TwoAdicValuation(19) は 0, TwoAdicValuation(0) は -1 を返します。 しかしプログラムを読んでみても、 何がどうなってそのような動作になっているのかどうしても理解できません。 何かお分かりになることがあれば どんなことでも構いませんので教えていただけないでしょうか。 どうぞよろしくお願いいたします。
Ruby で説明すると、 2進数で、右から連続する、0の数が、2の累乗を表す。 0b は、2進数 0b0101(5) → 奇数 0b0110(6), 0b1010(10) → 2^1 0b0100(4) → 2^2 0b1000(8) → 2^3
>>473 なんか1年ぐらい前にも同じネタがあった気がするんだけど...
コードよく読んでないけど、要するに2進数で見た時に
「値が1の最下位ビットの位置」を求めてるだけだと思うよ。
2進数で2で割ることは右に算術シフトするのと同じなのは分かるよね?
あと、奇数とはbit0が1の数なのも分かるよね?
だから「x が 2 で割れる回数」と「値が1の最下位ビットの位置」は同じになる
>>475 × 算術シフト
〇 シフト
要するにLSBが1になるまで右シフトを繰り返した、その回数を求めてるんだと思う
知らんけど
>>474-477 ありがとうございます。
色々と実験してみた結果、
x & ~x + 1 が、x と 2で割れる回数が同じ、
1UL << i の形の値になることがわかりました。
ただ、どうして x & ~x + 1 と 1UL << i が
結びつくのかまだ理解できておらず、
67 で割った余りを計算する理由も分かっていないので
引き続き考えてみようと思います。
もし他にもヒントがあれば教えていただけると嬉しいです。
よろしくお願いいたします。
Ruby で作った! そんな、67 とか、訳の分からないロジックを解析しても、仕方ないだろ。無視すべしw def func( num ) return -1 if num == 0 # 2進数の文字列にして、逆転して、左から探す num.to_s( 2 ).reverse.index( "1" ) end nums = %w(0 5 10 4 8).map!( &:to_i ) # 数値の配列 p nums.map { |num| func( num ) } #=> [-1, 0, 1, 2, 3]
>>473 tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
x=1, ~x=254, x&(~x+1)=1
x=2, ~x=253, x&(~x+1)=2
x=3, ~x=252, x&(~x+1)=1
x=4, ~x=251, x&(~x+1)=4
x=5, ~x=250, x&(~x+1)=1
x=6, ~x=249, x&(~x+1)=2
x=7, ~x=248, x&(~x+1)=1
x=8, ~x=247, x&(~x+1)=8
64と67の関係は、16と19, 32と37でも同じ結果が得られそう
ぶっちゃけbrainfuck系のコードなのでビット演算を理解すればあとは忘れていい類だと思う
>>478 わかったわ
x & ~x + 1 は、最下位の1のビットだけ残す計算
ビット反転して1を足すことで、最下位の1まで繰り上がり
他のビットは必ずどちらかが0になるのでandで消える
で、67で割った余りを求める理由は、2^t を67で割った場合
tが0~63の範囲ならユニークな値になるから
最小サイズの配列のインデックスを返す値として
最も適していたということだな
なかなか面白いプログラムだった
文字列にするとかいう高コストの処理をしないためのアルゴリズムなのに無視すべきとか何言ってんだw 競技プログラムとか触ったこと無いの?
>>480 そいつはいろんな所に湧いて出てくる有名人だ。スルー推奨。
>>482 を修正
>で、67で割った余りを求める理由は、2^t を67で割った場合
割った余りを求めれば
>tが0~63の範囲ならユニークな値になるから
tが1~64の場合だな
かなり洗練されているが読みやすさとしては
仕事で扱うには勘弁してほしいw
ところでまさかこれ課題じゃねーよな?
>>479 ありがとうございます。
Ruby を扱う技術が私には無いので
アイディアだけお借りして C# に翻訳してみたところ、
期待通りに動作いたしました。
ちなみに、他の方から実行速度に関するご指摘があったので
オリジナルと比較してみたところ、私の書いたコードでは
オリジナルよりも 250 倍程度時間がかかってしまうようでした。
とはいえ読みやすさは良いプログラムの重要な条件なので、
場面に応じて使い分けるのが良さそうですね。
>>481-482 大変わかりやすいご説明どうもありがとうございます。
>>481 > xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
>>482 > x & ~x + 1 は、最下位の1のビットだけ残す計算
いただいたアドバイスを元に↓のような実験をしてみて理解できたと思います。
00101100 (44)
11010011 (~44)
11010100 (~44 + 1)
00000100 (44 & ~44 + 1)
>>481 tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
>>482 > 67で割った余りを求める理由は、2^t を67で割った場合
> tが0~63の範囲ならユニークな値になる
なるほど!実験してみて、確かにそうなっていることがわかりました。
40 人のクラスの中で同じ誕生日のペアがいる確率は 90% 近いと
聞いたことがあるので、なんだか不思議な感じがします。
>>481 > 64と67の関係は、16と19, 32と37でも同じ結果が得られそう
すごく興味深いです。私も実験してみたところ、
1 と 2、2 と 3、4 と 5、8 と 11 という感じになったのですがあってますか?
また、「16と19, 32と37」というのをさらっと書いてくださっていますが、
これは実際に調べてくださったのですか?
それとも、きちんと数学を勉強していればすぐに分かることなのでしょうか。。。
>>485 > ところでまさかこれ課題じゃねーよな?
学校の課題というわけではないのですが、
本来は自力で解くべきものだと思います(汗)
ごめんなさい。。。。
>>487 限定された範囲で、規則性があるものは、理論的に説明できないだろ。
ちょっとしたトリビア
355 / 113 = 3.141592 92035
円周率と、小数点以下6桁まで一致するとか
コレクションの初期化子で複数を同じ値でまとめて指定する方法はないでしょうか? Pythonの、l=[False]*100みたいなことをやりたいのですが、 var l = new List<bool> { False, False・・(100個分)}ぐらいしか思いつかず・・
>>490 Enumerable.Repeatでググろう
>>487 16、32、64はビット数
ついになる数はそのビット数の次の素数
ruby君はほんとひどいな 自分が軽く触れそうな話題にだけ飛びついてわからない部分は謎理論で適当な回答しかしない
>>492 > ついになる数はそのビット数の次の素数
レスありがとうございます。
私も最初そのように考えたのですが、
16 の対が 17 ではなく 19 なので
そういうわけではないようなのです。
ちなみに 16 の対が 19 になるというのは
>>481 さんが書いてくださっており、
私のほうでも改めて確認しているので、
間違いではないと思います。
>>494 ほんまやね、すまん
ここらへんは整数論の話だから得意な人に聞けば話は早いんじゃないかな?
フェルマーの小定理から決まるのかな?って思うけど俺自身は整数論詳しくないんで解説できないわ
>>495 レスありがとうございます。
フェルマーの小定理について調べてみました。
フェルマーの小定理から分かることとして、p が奇数の素数のとき、
(2^0)%p と (2^(p-1))%p はともに 1 になるようです。
つまり
>>482 さんの言葉をお借りするなら、
奇数の素数 p がビット数 n 以下のとき
t が 0~(n-1) の範囲で変化すると (2^t)%p がユニークにならないため、
ビット数 n の対としてn 以下の奇数の素数は不適切ということになります。
ただ、フェルマーの小定理は p > n のときに (2^t)%p がユニークになることを
保証するものではありませんし、そもそも奇数の素数じゃなくても
ビット数 n の対としてn 以下の数が適切でないのは当たり前な気がするので、
フェルマーの小定理から直ちに欲しい情報が得られるというわけではないようです。
とはいえ、関連しそうな分野が分かっただけでも大きな前進ですので、
もう少し詳しく調べてみようと思います。どうもありがとうございました。
ついでにガロア体も調べると、 QRのコード化で楽になるよ:-p
>>491 ありがとうございます。下記でうまくいきました。
var l = Enumerable.Repeat(false, 100).ToList();
>>498 もしfalse限定ならC#のbool変数の初期値はfalseに決まってるからbool配列100個を作るだけで目的のものは作れるよ
trueの場合はRepeatすることになるけど、falseなら配列宣言で済ませたほうがパフォーマンスは良い
100個程度なら微々たる差ではあるけど
>>498 のは値型だからいいけど参照型でやると楽しいことになる
値型でしか使ったことなかったけど調べたら参照型は複製してくれないのかよ! やっぱforループしか信じられねえわ
>>500 Pythonで[[0, 1]]*10とかやって、恐ろしいことになったのを思い出しました
今はちゃんと[[0,1] for _ in range(10)]としてますが、C#でも同じですね
それにしてもPythonから移ってくると、C#は難しいですね・・
>>497 レスありがとうございます。
いろいろなビット数 n の対になる数を調べてみると、
必ずしも素数になるとは限らないものの、
調べた範囲では全て p^k(p は素数、k は自然数)の形になっていました。
で、教えていただいたガロア体というのは要素の個数 p^k の集合ということで
ビンゴかと思ったのですが、
どうやら私が考えているのは p^k を法とする剰余環というものらしく、
k = 1 で無い限りガロア体とは本質的に異なるもののようです。
しかし色々と調べれば調べるほどこのあたりの分野から答えが見つかりそうだと
思えてきたので、もう少し頑張ってみようと思います。どうもありがとうございます。
>>501 newするRepeatをGenericで作ればいいよ
whereで値型と参照型分けるようにして作ってそっち呼ぶようにすれば気にする必要もなくなる
インスタンス生成が多くなるようなプロジェクトではよく使う
ゲーム系なんかだと結構使われること多いんじゃないかな?
>>501 LINQ の速度が許容できるなら、こんな感じでやろうぜ。
Enumerable.Range(0, 100)
.Select( i => new CertainClass { ... } )
.ToList();
for 文ダサい。
LINQ覚えたてで使いたくてしょうがなくてイキって書いたコードに見えるわ
Visual Studio2019で新プロジェクトを作ろうとしたらWindows Forms App(.NET Core)がさも推奨かのように上の方に出てきますが、 Windowsで使う想定のWinFormsアプリを作る場合も.NET Coreで作ったほうがいいんでしょうか?
>>507 言わせんなよ
というMSの気持ちを察しろ
ロードマップではこれからcore主流になるんでしょ
CoreってWindowsに標準でインストールされてるの? ユーザーに別途インストールさせるようなことない?
されてないし今のところWUで配るような予定も無いとさ 逆にインストール不要なcoreのランタイムそのものを同梱して配布はできる
>>506 手続型は可読性と保守性が低い。使うなら局所的に、隠蔽して使うのが吉。
どんな場合でも LINQ とは言わないが、データ変換が主な場面ではメソッドチェーンや遅延評価できる LINQ 推奨。
ちょっと条件変わったときに途中で引っ掛けにくいよね あ、ここ、フラグでcontinueいるわ あ、i%10==0毎に処理いるわ あ、i±Nまで見る必要あるわ とか、for文のが圧倒的に拡張性が高い
foreachがインデックスも定義できれば もっと活用の幅が広がるのだけど
インデックス付きSelect/Whereとかでええんちゃうの
ループ内を雑に拡張して後で困るのが嫌だからLinqとLinq拡張ライブラリを使う n件ごと、前後n件なんて頻出処理だしなおさらね
>>501-502 Ruby でも、ブロック無しで、Array.new すると、同じ参照を使ってしまうが、
ブロックを渡せば、ブロック内で個々のインスタンスを作れる
p ary = Array.new( 2, [ 0, 0 ] ) #=> [[0, 0], [0, 0]]
ary[ 0 ][ 1 ] = 2
p ary #=> [[0, 2], [0, 2]]
ary_2 = Array.new( 2 ) { [ 0, 0 ] }
ary_2[ 0 ][ 1 ] = 2
p ary_2 #=> [[0, 2], [0, 0]]
>>513 設計せずに書き出すダメプログラマー丸出しの発言だな。そうやってできるのは、いちおう動くけどバグが埋れてて、変数ダンプしながらフローを追わないと挙動がわからない可読性の低いコードになるんだよ。
君のいうことは、インデックス付き Select や GroupBy & SelectMany や TakeWhile なんかを組み合わせれば簡単にできるよ。
もともとは System.Linq の Enumerable.Repeat が参照型では Shallow Copy になるってことから始まったのだから Select 使って Deep Copy にすることでいいんでないの。
>>522 グロって書くと画像のサムネイルをモザイク化できるけど、 Ruby君の発言もモザイクにならないかな。見たくない。
>>524 [Rr][Uu][Bb][Yy]でNGしとけ
どこまで本気なのかネタなのかよくわからないけど個人的には
>>505 は選択しないなあ。
普通にforで回して埋めると思う。
理由は、そのコードを<読む時>に思考力の消費量がより少なくて済むと思うから
(a)
var list = Enumerable.Range(0, 100).Select(i => new Label()).ToList();
(b)
var list = new List<Label>(100);
for (int i = 0; i < list.Count; i++) list[i] = new Label();
一瞬で何やってるか理解できるのは(b)の方。
これは構造化(= パターン認識)の威力。
(a)も十分読みやすいけど、(b)に比べると若干高コスト。
(a)を好むのは多分巨大なコードを書いてメンテナンスしたことがない人だと思う。
>>526 慣れだ慣れ
普段使ってる方がしっくり来るだけだ
普段から書いてりゃ慣れるしLinqの遅延評価が役立つ場面なら積極的にlinqの方を選択する 可読性なんてその人そのプロジェクトで変わる 難読可したコードとかまでいくなら気にするのはわかるけど、この程度の差ならどっちでも良い 他言語から入ってきた人ならlinqが馴染みやすいこともあるだろうし、Cからやってる人ならforが馴染みやすいかもしれない ただそれだけ
そのコレクションが固定長だったら、だけど
自分だったら
var array = new Label[100];
と配列で宣言したうえで
>>526 の(b)だな
listをわざわざforループで添字アクセスするのはちぐはぐだし
配列を明示的に使って固定長であることを明示的に表すべきだと考えるロートル人間なので
>>526 aのほうが遥かに読みやすい
ある範囲に対してそれぞれ新規インスタンスを選択
してリストにした物
って言葉として読んだまま理解できる
突然 i=>new Label は厳しい 「i」ってなんやねんってまず思う
そのへんは _ にしちゃうなー 匿名の引数では言語仕様としての破棄パターンとみなされる文脈ではないけれど
C#というかアルゴリズムの質問になっちゃうかもしれないんですけど aというテキストファイルがあってそこにはb cという2つのファイル名が書いてある bを見るとdと書いてあって cにはファイル名書いてない このときaを読み込んで最終的に手元にa b c dの4つのファイル名を取得したい。まぁList<string>に格納される感じでしょうか 再帰で書くんだろうなぁとは思いつくんですが、再帰が大の苦手でどういう終了条件でどういう戻り値の関数を作ればいいのか考えつきません 手助けいただけないでしょうか
IEnumerable<string> ReadFilePaths(string filePath) { /* 再起なしでファイルパスをすべて読み取る */ } IEnumerable<string> ReadFilePathsRecursive(string filePath) => ReadFilePaths(filePath) .SelectMany(i => ReadFilePathsRecursive(i)) .Append(filePath) ; はい
>>510 ランタイム同梱でexeを配布できるから問題ない
不要な引数は_だね 破棄パターンはまだ言語仕様になってないけど要望も多いし議論も進んでるからそう遠くない未来には入るだろう すでに導入されてる言語もあるし 俺個人的には526のbみたいなlistなのかarrayなのかよくわからん制御のほうが混乱する
>>526 >(b)
>var list = new List<Label>(100);
>for (int i = 0; i < list.Count; i++) list[i] = new Label();
list.Countは0なのでループの中身は実行されない
一瞬で何やってるか理解できてる・・・?
>>526 LINQ が万能ではないことは認める。使う人を選ぶ技術でもあるし。
だが、Enumeration の操作にいちいちカウンタ使って境界テストしなければならなかったり、if, break, continue でフローを追わなければならなかったりするのは、レビュアーや運用・保守者を泣かせるコードになることが多い。
モダンな言語がここ10年のあいだに参照透過性や関数型を追求する方向に進化しているのは、そういう可読性、保守性、開発効率性を意識しているから。
ちっちゃいコードなら手続型で好きなように書けばいいんだよ。大規模開発やビジネスロジックが重要な場面では関数型で書くのが適してる。
まあ、LINQ もあまりやりすぎると読みにくくなるのだが。
>>533 aをrootノードとしたツリーとして対象をとらえれば
習ったことを生かせるんじゃないの?
>>537 ほんとだ引数capacityじゃん
Linq使っててよかった
MSのDocs(?)の日本語版ってマウスオーバーでオリジナルの英語版が読めなかったっけ? 対応してるページと対応してないページが混在してるのか? Docsって何やねんw
>>534 凄い……いや理解するのに10分以上かかったけど確かにこれで出来てる……
ありがとうございました勉強になりました
LINQは慣れると意図が読めるけど forは何のためにループ回してるのかは解りづらくなりがち 数学的な問題や複雑な処理を書く場合LINQの表現力はすごいけど、慣れてない人が理解できるようになるのは大変 LINQやRxなしで同等のコード書くのはもはや考えられない
プログラマなら普通は逆だよね? linqというかSQLはただの集合論のはずなのになぜかforの代替で使われたりする linqはループを隠ぺいしているだけで実際はループしてる
Linqが本当に集合論を表してるなら途中でエラーがでてもデフォルトで残りの処理を終えるはず そしてエラー含んだ集合が手元に残るはず
>>547 > forは何のためにループ回してるのかは解りづらくなりがち
流石に
> for (int i = 0; i < list.Count; i++) list[i] = new Label();
の意図がわからないならプログラマーやめるべきだと思うわ
やりたいことは何かを書いてそれを実現する具体的な方法をライブラリにお任せするのがLinq(宣言的) やりたいことは何か全くわからないけどそれを実現する具体的な手続きだけは知りたくないことまで細かく書くのがループ(手続き的) 何をしたいのかわからないコードよりしたいことが書いてあるコードのほうが親切
>>549 例外で全部ぶった切ってもいいじゃん
決め事の話だからどっちも筋は通ってる
基本LINQでいいかなってなる List.ForEachは使わんが
>>550 そらそうだな
こんなコード書いて仕事になるやつおらんやろ
>>551 そうそう それが言いたかった
>>554 そりゃこんなコード「だけ」じゃ仕事にならんけど、仕事でその手のコードを書くことはあるだろ
大体の場合においてやりたいことだけをlinqで書けはしない 普通の処理をすべてLinqに置き換えられるならそれだけでいいが そんな世界どこにもない 実現不可能な話でlinqがいいなんて現実的じゃない
標準で書けたところでそれって本当に効率的なのか疑問な場合がある ループなら一回でmax min両方とれる linqで標準で書いたとしてMAX MIN二回ループが回る
基準はシンプル 状態の更新を伴うものはループで書く
プログラマがヘボでクエリとコマンドの分割がうまくできてないとLinqが綺麗に適用できないことがある しかしLinqはクエリであることを忘れてはいけない コマンドで汚染されたループをLinqでは書きにくいと主張するより先にリファクタリングすることをおすすめする 速度最適化が必要な場面はあるが常に速度最適化が求められるわけではない 速度よりメンテナンス性が重視されることの方が多い
本当に集合論ならループの順番などという概念がない が実際にはある MS自体はシーケンス(連続、並び)と言ってるが一部のオタが勝手にSQLと同じ集合論だと言ってるだけ
どちらとも使えるのが正しい姿で必要に応じて使い分けるのが筋 所がlinq信者は全部lnqでいいforは使わなくていいと言う
Linqでももともとやりたいことをそのまま表現できるパターンは少ない それでどちらにしてもコードに落とし込みをする段階がある 処理に応じて手順を分解してコードにする 実際にそれをやるのがプログラムである 手順が分解できない、他人の書いた手順を理解する気がないならプログラムする気がないと言うこと
信者うんぬんの前に正しいスペル・大文字小文字でLINQと書けない人がテクニカルなことを主張しても説得力ががが
説得力などなくていいよ 酒飲んでごろ寝してスマホでかいてるんだから適当だよ
>>534 これもイテレーター使った方が読みやすい気がする IEnumerable<string> ReadFilePathsRecursive(string path) { yield return path; foreach (var path2 in ReadFilePaths(path)) foreach (var path3 in ReadFilePathsRecursive(path2)) yield return path3; } } 循環する可能性を考慮しないのって普通にヤバイと思う
俺社環で{}省略していると糞扱いされるので迷わずLinq選ぶわ
>>561 LINQ をまともに使っている人は LINQ の得手不得手を知っているから LINQ が万能だとは言っていない。
データ処理の多くの場面ではカウンタ使ってプリミティブに手続書くのは非効率だと言っているだけ。
逆に手続型信者 (老害ともいう) は不必要な場面でもカウンタ使ってイテレーションを書き、コードをいたずらに冗長化するねっていうこと。それに対する有効な反論がない。自分にとっては読みにくいっていう個人的感想ばかりじゃないか。
誰かが言ったとおりこれは慣れだよ。初めは確かにとっつきにくいが慣れる。そして戻れなくなる。
>>562 趣味グラマーならそれでいいよ。だが、ビッグデータやデータサイエンティストの時代になって業務ユーザもコード読むようになったこのご時世。
運用が止まって、下手くそなコード読んでトラブルシュートしなければならない身にもなってみて欲しい。センスない奴が書いたプリミティブな手続をダンプしながらフロー追っかけて修正し、リグレッションテストして、一定時間内に通常運用に戻すのは地獄。
無意味な宗教戦争にしないために、みなさんが前提や目的や利用場面をもう少し明確にすることを提案する。
下請けで隠蔽工程のコーディング担っているプログラマは LINQ のありがたみなんてわからなくても当然。レビュアーや PM や使う人のことを考えず、自分のスキルでとりあえず動くものを行数書いて月給もらえればいいんだから。
LINQでDB通信タイミングコントロールできなくなって 泣きを見る話は聞いたが
>>570 LINQ to Entities のことかな?
LINQ to Entities は残念ながらまだ発展途上だね。(もう 10 年にもなるのに。)
業務ロジックも書けなくはないが、.NET プラットホームや DB 実装などへの依存性が強すぎて、かなり工夫する必要があり、汎用性がなくなってしまう。
Select, Where (, OrderBy, Take, FirstOrDefault, Join)くらいしかまともに使えないと思っていた方が無難だと思う。となると DB アクセス回数と無駄なデータ取得が増えることになり、性能が出ない。
また C# 9 あたりで予定されている Records がないとデータ変換ロジックが非常に書きにくい。
.NET 5 になれば期待できるのではないかと思うけど。
>>557 おっしゃる通り、LINQ は Reduce 系処理の効率性がよくない。そこは工夫する必要あり。
ただ、Aggregate を使えば、一回の走査で Max, Min 両方同時に取れると思うよ。
標準のLINQでは効率的に処理できないなら 効率的に処理できる拡張メソッドを定義してそれを使うべき 流れの中でforやらforeachを使われると可読性が落ちるしテストもしにくくなる
そういうオナニーされるとそれこそ読みづらい フレームワーク作ってるんでない限り、チーム開発で拡張メソッドを自作するのは本当にやめてくれ
開発組織のコード管理能力やチームメンバーのリテラシーに合わせて判断することだとは思うが 拡張メソッド作れないって縛りプレイはできれば勘弁して欲しいな
拡張メソッド無しはさすがにしんどい そら上位のnamespaceにstringやらintのextension大量に作るとかやられるのは勘弁してほしいがちゃんと整理されてるなら問題ないじゃん
拡張メソッドを使わないというオナニーではないのだろうか。
Linqの構文を本家のSQLに逆輸入すれば良いのに
そういや、Max、Min句が対象とした個別要素を返すってのは酷い気がするな IEnumerable<T>に対して使った時にT型で返すように何故しなかったのか全く理解できん
多少非効率でもなるべくもともと用意されてる機能や関数を使うのが分かりやすい派です
MoreLINQ使えばMinBy/MaxByがある (複数返すからTじゃなくIEnumerable<T>的なのが返される) リスト埋めるやつもMoreLINQ使えば比較的読みやすい var labels = new List<Label>().Pad(10, _ => new Label());
>>581 そりゃ欲しいのは最大値や最小値なのに複数の要素が返ってきても面倒なだけだし
>>584 ま、その通りなんだけど、581 が言いたかったのは、該当要素 T を返す拡張があってもいいよね、インデックス付き Select とかあるんだからさ、ってことでは?
>>583 有益な情報ありがとう。
>>585 そういう拡張があってもいいなと言うならわかるが
> Max、Min句が対象とした個別要素を返すってのは酷い気がするな
と言うのは思慮が浅すぎ
generics, trait だろ。 has-a, interface, duck typing など、継承じゃなくて包含 Ruby では、<=> 宇宙船演算子があれば比較できる。Comparable
どうかな
個人的にはどちらか一つだけしか選べないとしたら
>>581 の実装の方が合理的だと思うけど
単純にそっちの方が需要多いと思うし、二度手間にはなるが現状の実装は
>>581 的実装で代替できる(変換結果の最大値は変換関数から求められる)のに対して
逆はどうやっても不可能だから
>>588 上位互換の方がいいっていうのはわかる。でもそれは LINQ to Object だけを考えた場合ね。
LINQ は LINQ to Entities という OR マッパーも強く意識しているから、標準 SQL 互換の機能も大事であり、どちらか一つという選択を強いるなら現状になる。
別に難しいもんじゃないんだし作りゃいいんだよ どういうのがベストかが状況によってたやすく変化する処理だと思う 値が欲しいのか要素が欲しいのか、一つで良いのか全部列挙するのか だから標準としては1回走査で済んでsum等の算術系と同じような入出力になる現仕様を選んだんじゃない?
なんかよくわからないけど、SQLとの互換性ならTが返ってきた方が遥かにSQLに近いでしょ
??SQLで集計関数使ったら元のレコードはわからんめえ
>>591 わからないなら無理に噛み付かなくていいから。
LINQ to Entities の設計思想と実際の実装がどうなってるのかある程度理解できるようになってから出直して。
Tを返すと戻り値がIEnumerable<T>になる 流石にそれをMax関数と呼ぶのは抵抗がある
まず最大値を取る その値を持つ要素の集合をselectする 確かに無駄だな SQLはどこかで最適化してるのかな?
MAXはMAXだけどそういう用途の関数?があってもいいかもね というかすでにあるんだろうか?
>>596 標準ではない
使ったこと無いけど583が紹介してるものか自作するか
自作しても数行だしググればコードは転がってるよ
個人的にはこういうやつは上げだすとキリがないんで現状で十分かなと思ってる
標準で山ほど用意されても何があって何を自作しなきゃならんかがわからなくなるんで本当に基本的なものだけあればいいかなと思う
SQLで書けるものはだいたい書けるようなってないと使いづらいよやっぱ
SQLだとストアドあるけど、LINQで書けるの? インラインビューとかも
それは流石にLinqのせいじゃなく、例の変な人が言ってるフレームワーク等で吸収する部分じゃないか?
>>595 SQLの場合はインデックスがあるから一般的にO(log n)で最大値のキーが取得できる
LINQ標準でMaxByと同じことをやる場合はちょっと効率悪いけどOrderBy使う
O(n)にするためだけにAggregate使った拡張メソッド作るよりも
走査する件数を減らすことを考えたほうがよかったりする
LinqとSqlは根本的に別物なので使い分けろ 当たり前のことだな
>>600 DDLもLINQで書けるようにしろとか言いそうな勢いだなw
>>602 LINQ to Object vs LINQ to Entities でインデックスの有無は大きいよね。テーブルごとに特性とサイズを考えて、AsEnumerable でやるか AsQueryable でやるか機能配置の決め手になることがある。
OrderBy 使っていいなら、こんな感じかな?
public static IEnumerable<T> MaxBy<T>(this IEnumerable<T> src, Func<T, IComparable> selector) =>
src.GroupBy( selector ).OrderByDescending( x => x.Key ).Take(1).SelectMany( x => x );
>>600 , 601
ストアドは DB の機能だから、フレームワークでは実現できないよ。
フレームワーク側でエミュレートできたとしても DB との間で通信が頻繁に発生することになるから、性能が出ないと思われる。
DB のストアドを呼ぶことはできるはず。
>>608 横からすまん。
Code First で DDL 相当のことが「かなり便利に」できるわけだが、DDL やるのに LINQ でなければならない理由を教えてほしい。
>>609 初めからLINQの話してて、何がベストかなんて話してない
LINQって便利なんだけど今一歩物足りないよな 何が足りないのかと言われても難しいが
前処理はストアドで定義してアプリはストアド叩くのが定石やろ
>>610 LINQ にこだわるなら、こだわるだけの理由が必要。
スレに貢献している人を茶化すなら、茶化すだけの知識なり、思想なり、技術的裏付けが必要。
>>611 ,612
どちらの意見もわかる。
LINQ to Object に閉じるなら十分。足りない部分はライブラリ自作すればいいし、そのパズルが楽しかったりする。
でも、LINQ to Entities に踏み込むと足りないことだらけ。本質的ではないところで相当な工夫が必要だし、工夫しすぎると汎用性がなくなって使い物にならなくなる。
LINQ to Object で組み始めたロジックを LINQ to Entities 互換に拡張することを考えている時間が結局ムダになることも多い。
両者、似ているようでギャップがかなり大きいところに物足りなさを感じる。
最初から全くの別物なのに似ているというだけで変な期待をかけて勝手に裏切られた気持ちになる人が少なからず居る 別物と割り切って名前もインターフェースも変えれば初学者が迷わずに済んだだろうな
>>617 そうだね。裏切られたとは思わないけど、当初の期待はかなり高かった。
でも、LINQ to Entities の情報が少なすぎて別物だって理解するまでに相当な時間がかかってしまう。
誰も頼れる人がいない中、ネット情報のみの独学でみっちり3週間かかったよ、まともに使えるようになるまでに。
EntityFrameworkなのかEntityFramework Coreなのかはっきりさせとけよ…
>>619 わからなかったからどちらも試したよ。
Framework のバージョンによって作法が大きく異なるのに、ネットはバージョンを示さず情報が混在しているのも混乱する大きな要因だった。
まともに使えないものがまともに使えるようになったと言ってる時点でまともな人間でないのは明白
>>624 君は読解力ないのかな?
局面によっては使えるかもしれないけど、業務ロジックを完結させるには役者不足、LINQ to Entities はまだまだ発展途上だね、今後に期待、と一貫して言っているのだが。
一次ソースも二次ソースも充実してないのは発展途上でこれからもまだまだ移りゆくものだからだとも思ってる。それがわかるのにけっこうコストがかかったよ、そのあたりが個人的に物足りなさを感じるところかな。
あぁなるほど データアクセスに業務ロジックをバリバリ書いてしまうタイプの人か
>>625 一次ソースはバージョンに関しては混乱しない。それは二次ソースの話。一次ソースが混乱させるのは、LINQ to Object から Entities へ移行するにあたって、重要かつ基礎的なコンセプトをまともに解説していないこと。
たとえば、IEnumerable の派生である IQueryable はアップキャストするだけで AsEnumerable で評価されてしまうとか、引数となるラムダ式が全く同じ記法なのに IEnumerable では Func で IQueryable では Expression だとか。
これらは分かってしまえば当たり前だし、うまく設計したものだなと感心するけれど、初学者にはトラップでしかない。
君はこれら暗黙の前提を一次ソースで知ったのか?
だとしたらどこにガイドがあるか教えてほしい。
一次ソースに当たれというのは一般的なお約束だけれども、LINQ to Entities に関しては、コンセプトや実装の難しさに比して一次ソースがかなり脆弱で不親切だと思うよ。
617 の言うとおり Object と Entities でインターフェースを変えて設計するか、あるいは、移行に十分な情報を一次ソースが用意するか、どちらかだと思う。そのどちらでもないことがアンチを生んでいる原因ではないかと。
>>627 もちろんレイヤー化はするし、機能配置はしっかり設計するよ。
ユーザーはコード見なくていいって時代じゃないんでね。
>>630 ,631
業務ユーザが LINQ to Entities に手を突っ込むの、ガイジだよなぁ、わかるぞ。
だがね、人のやらないことを先鞭をつけてやらねばならない場合もあるのだよ。
ひととおり技術評価した結果、本格的に導入するのは時期尚早という判断で別の技術つかうことにした。.NET 5 以降に期待してる。
え、業務アプリで普通にLINQ to Entities使ってるけどなんかマズい問題でもあるの? 単純に手軽で使いやすいと思ったから使ってるんだけど・・・・
>>633 問題ない。Dapper開発元のStackOverflowでさえEntityFramework Coreを併用してる。
LINQのmaxやminで最大最小が求められるけど 最大、最小の値を持つオブジェクトを取得する方法はないのかな?
>>635 new {
Max = src.Max(),
Min = src.Min()
}
>>628 それらを区別することがはたしてLINQの目指すべき理想なのかね
>>639 それらってどれのことだろう?
LINQ to Object と Entities のことかな?
両者の設計はよく考えられたシームレスで美しいデザインだと個人的には思うよ、違いをしっかり理解できた後ならね。違いが分かりにくいというのは言語設計の問題ではなく、MS Docs などガイドの問題だと思う。
何が理想的な設計かは人によって感じ方が違うのではないかな。
あ、EF4, 5, 6, Core と進化する間に名前空間や正規関数などがコロコロ変わっているあたりは、場当たり的で汚いと思う。何か制約があって実装をやり直した、その苦労の跡が垣間見える。Core から後方互換を捨てて綺麗に作り直そう感があるから、.NET 5 に期待している。
ごめんちょっと話が横に反れちゃうけど、このスレ見たり書き込んだりしてる人って MicrosoftDocsって日本語/英語どっちを見てるの? 当たり前のように原文ですらすらと読んで理解してるものなの? MSDNが廃止されてDocsになったはいいけど特にAPIリファレンスとか日本語訳の品質が酷すぎて辛い 自分は英語ほとんど読めないんで、Chromeで日本語版、FireFoxで英語版+Google翻訳をそれぞれ表示して 3タブ切り替えながら読み進めてくなんて効率の悪いことをやってるんだけど、みんなはどうしてるのか気になった MSの一次ソースに当たるのも↑の理由でしんどいんだよね・・・ もう潤沢な日本語訳が提供されるような時代じゃなくなったんで英語のできないPGは退場せざるをえないのか
docsは辞書的に使うことがほとんどだしそれぐらいなら英語で十分
>>641 調べる目的によるかな。
引数の順番とかオーバーロードとかうろ覚えの確認程度なら、検索して最初に出てきた方。
初出のロジックを書くためにコンセプトや基礎設計からじっくり考えつつ API を調査するなら、まず日本語でざっくり理解、重要なポイントが和訳で怪しいなら英語で精緻化。
LINQ なんかは集合論や数学に近く、これらは概念が同じなら分野跨いで英単語が同一だったりして英語の方が理解が早いから英語のみ、とか。
LINQ to Entities の場合、一次二次併せてそもそもの情報量が少ないから、英語日本語関係なくとにかく漁る。(そして英語の Q&A でほのめかされているヒントに辿り着き、一次ソース原文を当たったりする。)
俺も英語は苦手だけどdocsは基本英語 どういうメソッドあったっけ?で見ることが多いから多少の単語がわかればほぼ理解できる 動作が知りたいときでよくわからん英語の言い回しがあったときは日本語にして読んでみる けど、そういうときは日本語にしても大抵理解できない デフォを英語にするようにしとけばプログラムで頻出する英単語が徐々に覚えられるようになるから英語をオススメする
>>641 日本語が読めたもんじゃないから英語に切り替えることが多い
機械翻訳かける時は、最近のグーグル翻訳は使い物にならないから、みらい翻訳のお試し翻訳使ってる
ありがと、自分もdocs英語派に転向するよう頑張ってみる 比較的翻訳が整ってる基礎説明みたいなページでもいちいち 「角度」⇒「Angular.js」、「反応」⇒「React.js」みたいな脳内逆翻訳をかますよりは 苦手でも最初っから英語版を読み解くほうがやっぱりマシなんだよな・・・ 自分はFirefoxのアドオンで ・Simple Translate (右クリックでGoogle翻訳結果をポップアップ表示) ・MouseDictionary (マウスを乗せた英単語の日本語意味をリアルタイム表示) を入れてる みらい翻訳はいちいち英文をCopy&Pasteするのが面倒で常用断念
とりあえず日本語でぱっと見て意味が取れるならそれで良し んん?ってなったときに原文に当たる これが一番効率良いと思うよ
>>648 意味が取れたと思って試してみたら挙動がおかしくて、原文見たら真反対の意味でショック受けた記憶がある。
まあジャパニーズITドカタの世界じゃ専門卒の英語アレルギーな連中に扱えないようなものが普及することは決してないから、 業界から脱出するつもりがないんなら英語はハナから捨てたほうが賢明だよ だって業務では永遠に使えないんだから
いや英語棄てるとか絶対無理。 日本語訳がアテにならないのが分かってから原文しか読んでない。
自分は英語が苦手 でもMSの自動翻訳はイマイチなのでgoogle翻訳の自動翻訳を使う それでもよく分からない時はgoogle 翻訳のサイトにコピペして翻訳する
>>654 コピペする労力を惜しまないなら
みらい翻訳の方がましな日本語になるからお勧め
翻訳ソフトを多用するから英語読む力が身につかないんやで まともな辞書を使って単語帳をつけて定期的に復習するのが大事 翻訳ソフトは最後の手段 マウスオーバーで引ける辞書も便利だけど 便利すぎて辞書ナシで文やパラグラフを読む努力をしなくなると英語力は向上しない
英語力向上が目的じゃないから。 あくまで目的は正しい情報を入手すること。 もう数年後にはかなりの精度の自動翻訳ができるようになってると予想する。
翻訳精度の向上ってもう10年以上言われ続けてるよねw こないだgoogleだかどっかが文脈を考慮した翻訳どうのこうのってリリース出してたけどどこまで伸びるかねぇ
既に英語-日本語は十分な翻訳精度になってない? MSDNのようなオフィシャルな場はもうほぼ完璧だし、そこら辺の外人フォーラムなんかでも一応意は汲める 中学英語程度の基礎があれば読みに関してはもう不自由しない
>>657 超短期的な目的でしょそれ
翻訳ソフト使わないと読めないままで良いと思ってるんなら別にいいんだけどさ
技術的な調査能力だったり新しい技術を身につける速度に顕著に差が出るよ
現状で完璧なんて口が裂けても言えないと思うけど… msdnみたいな同じ言い回しが頻出するようなところは個別の対応もしやすいし、そもそも単調な事実だけを述べるだけの文章なんで誤訳は少ない そんな環境でも真逆の意味に訳されてしまっているケースすら存在する こないだdoとdo notが逆に翻訳されててちょっと燃えたよね 補助として使う分には十分なレベルではあると思うが翻訳能力自体はまだまだ伸びて欲しいと思うよ
>>661 俺たちは英語のマスターが目的じゃないの
しつこいよ
まともな大学出てるエンジニアなら英語さえ話せれば外資に転職して軽く一千万以上貰える 必死こいてEFCoreとか覚えるより本気で英語を勉強した方が遥かに効率的だぞ
時々機械翻訳が真逆の時あったけどどこをどう解釈したのか痕跡も判らない
質問です ジェネリッククラスにおいて型Tがクラスのときとstructのときで全く挙動を変えたいのですが、 同名の2つのジェネリッククラスに異なる型制約をつけることは可能でしょうか
できないんじゃないかな 別のクラス名にして インターフェースを被せてやるんじゃダメなの?
ん?where T classでの制約の話じゃないの?
>>664 EFCore使うのに必死になる必要なんてない
>>668 class A<T> where T class と
class A<T> where T struct とを同時に作れないか、という疑問でした
こんばんは 質問させてください LINQのGroupByでデータテーブルの複数のカラムを指定しvar変数に格納後、 格納したデータをCopyToDataTableメソッドでデータテーブルに変換しようとしても、 CopyToメソッドしか候補に表示されないのですがVisual Studioのバグですか?
フォームアプリ作っていてデバッグ中です。 フォームのクラスから呼び出したクラスにブレークポイントを設定しているのですが、 止まってくれません。 フォームのクラス上に設定したブレークポイントでは止まってくれます。 これって仕様なのでしょうか?
なんかプロジェクト内でブレークポイントで止まるクラスと止まらないクラスがある。 前はどこに設定しても止まっていたのに・・・。 一体何が原因なんでしょうか?
ブレークポイントを通ってないから止まらないだけだろう
>>674 設定のチェックを外したらOKになりました。
自己解決しました。
おさがわせしてすいません。
>>672 変数名の上にマウス持ってったら型が表示される
その型は想定しているものになっていますか?
>>672 IGroupingはキーを列挙するものだよ?
キーは通常DataRowじゃないからそりゃ出ないよ
グループごとにChildrenをDataTableにしたいのか、Childrenをキー順に並んだ1つのDataTableにしたいのかによって書き方は変わる
>>663 マスターww
辞書使う前にとにかく翻訳ソフト使うやつは
リファレンス見ずにQiita見てコピペしようとするやつと同じ思考回路なんだよね
いつまでもスキルが身につかない原因を自分が作り出してることに気が付かないとすぐに淘汰されるよ
>>677-678 >>680
助言をいただきありがとうございます!
もう一度よく確認してみます
前にも居たけどなんですぐにVSのバグを疑うんだろうね?
複数のスレッドから1つのコンソールにLOGを吐きつづけられますか? Parallel.Forで
>>686 Invokeとかlockとかしなくても大丈夫ですか?
>>685 コンソールに出力するためのスレッド作ってそこにみんな投げればいいがParallel.Forの意味がわからん
昔はよく非同期処理の理解のためにコンソールに出力したんだけど今は市内の?
>>685 https://docs.microsoft.com/en-us/dotnet/api/system.console の一番下に
「Thread Safety This type is thread safe.」と保証されているので複数スレッドから吐いても全く問題ない
複数あるスレッドが分割して1行の文字列を作ってると間に別スレッドの文字列が割り込むけどな。
>>671 実験してないんで動かなかったらごめんなんだけど
default(T) == null
ならclassとして処理する
で実現できたりしないかな
nullableだったら無理だけど
WPFだとスレッドからLabel.Textや Textbox.Text、CheckBox.Checkedにアクセスできるもの? できなければできるように拡張したりできないものかな
>>692 クラスではなくメソッドについて struct/class 制約の共通化をやろうとした経験から言うと ...
Nullable 含めて内部判定することはできるけど、判定・分岐があちこちに発生することになり、かなりめんどくさいし、読みにくくなる。
だったらクラス分けて、誰かが言った通り interface (か abstract base class) で共通化図る方が楽と思われる。
>>671 やりたいことの意図を誤解してるかもしれんけど、 static class A { public static A<T> OfStruct<T>() where T : struct { .... } public static A<T> OfClass<T>() where T : class { .... } } class A<T> { } こんなのとか... っていうか、ジェネリッククラスのスタティックメソッドってTを使ってなくてもいちいち型パラメータ 指定しないと呼び出せないのかw >>693 WPFだと一般的にはMVVM使う
で、MVVMなら直接ViewにアクセスしないでVM経由になる
VMの値はスレッド越しに取得設定できる
コレクションの操作については事前に同期オブジェクト渡すとかする必要があるけど
こっちの方がマシか class A<T> { protected A() { } } class AOfStruct<T>:A<T> where T:struct { } class AOfClass<T>:A<T> where T:class { }
型制約は正直あんまり役に立たない微妙な機能な気がしている
ジェネリックなメンバアクセスには、最近は構造的部分型を使うのが流行りだね 構造的部分型ベースの型システムを持つTypeScriptやGoでは利用する側でアドホックにinterfaceを定義できるから、 利用シーンを先読みして型階層を設計するという人間には困難な芸当なしで柔軟に型制約のようなことができる
質問させてください ASP.NET C# SQL Server を使用しています SQLにByte型で保存したバイナリデータが保存されています そのバイナリデータをASP.NET側でLISTで受け取り、フォルダに保存したいです LISTで受け取った後にフォルダに保存するところの書き方を教えてください よろしくお願いします
LISTというのが何なのかは知らんが 配列で読み取ってFile.WriteAllBytesだけでよくね 何百MBとかならアレだが
>>702 みんなLISTが疑問符だ
そこちょぅと詳しく
static int UnitStep1(int x) => x >= 0 ? 1 : 0; static int UnitStep2(int x) => (x >> 31) + 1; 上のような2つの関数を最適化ありでコンパイルして ランダムな100万個の値に対して実行すると、 ①どちらも同じ値が返ってくる ②UnitStep1の方がUnitStep2よりも10倍近く時間がかかる という実験結果が得られました。 ①と②の理由を考察しないといけないのですが、 ①は分かったものの、②がさっぱり分かりません。 というか、どう考えてもUnitStep2の方が 無駄な処理をしているように思えます。 分かる方がいたら教えていただけないでしょうか? よろしくお願いします。
三項演算子で比較するよりビットシフトのほうが圧倒的に早いから cpuが得意とする処理と人間が理解しやすい処理は一致しない どうしても納得行かないならILを見て各ステップでどういう命令がされるか確認するしか無いかな?
そのILをぱっと見る限り、実行されるアセンブラまで調べに行く必要あるのかも 命令数は変わらんし そこまで行ったらもう環境依存な気もする てか最適化ありなら最適化されたIL見ないとだめかな
>>708 大昔にアセンブリやっていた経験からの推測だけど...
①の >= は左辺引く右辺の減算をして符号判定をしており、右辺の 0 を引くという演算が最適化ありでも外れず無駄な演算をしている可能性がまず一つ。でもこれは②に対して圧倒的に不利になる要素ではない。
もう一つのよりありそうな可能性は、三項演算子がコンパイルで if ステートメントになり、分岐先ブロックでパイプライン先読み実行していたステップが、分岐先読みの失敗により、ロールバックするコストが高くついているのではないかと。
確率 50% の分岐なら、2回に1回はロールバックすることになるため、コストが最悪になる。if else ブロックのどちらが実現確率が高いか、コンパイラが判断・制御できていない。
それに対して②はパイプライン処理を乱す要素がない。
どう中間コンパイルされ、どう IL が動くのか、最近の低レイヤーの処理は全く知らないため、見当外れかもしれないが。
条件分岐は遅い 一方ビットシフトと加減はCPUが最も得意な処理 そのレベルのことを考慮するような処理にC#はあまり向いてないと思うが
パイプライン処理の詳細は Wiki で調べて、命令パイプライン、パイプラインハザード、制御ハザードの節あたりを参照しておくれ。 条件分岐がなぜ遅いかわかる。確率考えてアセンブリレベルで制御しないと速くならないよ。
あ、ごめん。よく読んだらランダムな値に対してって書いてあった。確率 50% の先読み最悪ケースになるね。アセンブリレベルでも最適化は無理。
>>711 ありがとうございます。
アセンブラというのはSharpLabのページの
ResultsをJIT Asmにしたときに表示されるものと考えて正しいですか?
IL命令について色々と調べていたのですが、
JIT Asmのほうが書いてあることが少ないので先にこちらに挑戦してみようと思います。
あと最適化されたILというのは、ResultsをILにして、
一番右上の選択肢をReleaseにしたときに表示されるものと考えて正しいですか?
>>712 ありがとうございます。UnitStep?(int x)のxはプラスとマイナスが50%ずつになるように
ランダムに決めているので、確かに分岐の確率は50%です。
まだパイプラインについて完全に理解できていないので見当外れかもしれませんが、
試しにプラスとマイナスの割合を変えてどうなるかについても検証してみようと思います。
>>713 >>714 ありがとうございます。やはりハードウェアについてしっかりと理解しないといけないのですね。
ひとまず、
>>714 に書いていただいたキーワードについて調べてみたいと思います。
もしパイプライン処理がビンゴだったら IL 見ててもわからないよ。 CPU の fetch, decode, exec という内部処理の流れを理解しないと。 質問の書きぶりから大学かなんかの課題に見えるんだけど、高級言語ばかり見ていて低レイヤーのこと知らないとハマることあるかもよって警告するためのお題なのかもね。
C#で考えるべき速度は計算量まで メモリレベルの最適化を考えるならCで書くべきだし CPUレベルでの最適化がしたいならアセンブラを覚えるべき
分岐先読み失敗って言ったって x >= 0 ? 1 : 0 さすがにこんなのゼロコストじゃないの? 単純に機械語レベルの命令数の差を反映しているだけのような気が 知らんけど
>>718 いいインサイトですね。勉強になります。
>>716 もし true ? 1 : 0 の速さが②にかなり近くなって false ? 1 : 0 の速さが①よりさらに悪くなる、(あるいはその逆) ならパイプライン処理が原因だと考えて間違いないと思う。
>>719 機械語レベルの命令数に差があるように見える?
①②どちらも 2, 3 ステップだよ。
先読み失敗リカバリーはものすごくコスト高いよ。
パイプライン上の仕掛かりを全部クリアしなければならないんだから。その 2, 3 ステップの 1.5 ~ 3 倍くらいのクロックサイクルを無駄にすると思う。
>>719 ごめん、言い過ぎた。
IL わからんから、中間コンパイル通したらなんとも言えない。機械語の命令数が膨らむ可能性もありうる。
721 はネイティブコンパイルしたら、という仮定の話。
不勉強で今時のCPUのアーキテクチャーさっぱり分からんが、 ググってみると、投機的実行は予測が当たれば儲け、はずれても損なしだからこそ意味があると書いてある コインの裏が出たら損をするなら意味がないと思うんだけど
>>715 >>720 ありがとうございます。
xのプラスとマイナスの割合を変えて実験してみたところ、
UnitStep2では処理時間はほとんど変わりませんでしたが、
UnitStep1では、50:50のときが一番遅くてUnitStep2の10倍程度、
75:20と25:75はどちらも少し速くなってUnitStep2の6倍程度、
100:0と0:100はどちらもさらに速くなってUnitStep2の2倍程度になりました。
やっぱりパイプライン処理が原因っぽいですよね?
>>717 ありがとうございます。勉強になります。
高級言語では計算量までしか考える価値がなくて、
しかし計算量さえ小さければあとはマシンパワーでなんとでもなる。
だからこそ高級言語が今の時代に合っているということでしょうか。
>>719 ありがとうございます。
機械語レベルの命令=JIT Asmの命令だとすれば、
UnitStep1とUnitStep2では6命令と4命令で確かに差はあるものの、
単純計算なら10倍もの違いはないようです。
>>723 それ出典教えてもらえる?
外れても損なし、だったらいいなっていう理想を言っているのではないのかな。
ランダムデータには弱いけど、正常系と異常系の分岐はたいてい正常系の発生確率が高いためこちらに賭けるのよ。で、ロジックの多くはこの手の分岐でしょ、っていうことを想定して先読みのアーキテクチャになっている。
ということをその文献も (独特の表現で) 言いたいのではないかと思うのだが。
もれも最近の CPU がわかっているわけではない。80286 ~ 386 時代でアップデート止まってる。
>>720 >>724 の75:20というのは間違いで、正しくは75:25でした。失礼しました。
ところで、ランダムに50:50ではなくプラスとマイナスを交互にしたら
もっと遅くなるかと思いきや、むしろ75:25よりも少し早いくらいになりました。
(ランダムの場合も交互の場合もあらかじめ入力データを配列に格納してから
計測を開始しているので、入力データの作成コストは結果に影響していないはずです)
どんな仕組みで先読みをしてるのかさっぱり分かりませんが、
とにかく予測ができないのが遅くなる一番の原因のようです。
>>724 そうですね、データ依存なんでパイプラインと先読みが原因だと個人的には思います。
そういえば思い出しましたが、if else ブロックの片方に固定的に賭けると必要以上に大負けすることがあるため、条件分岐を何度か通ったところで学習し、勝てる見込みのより高い方へ賭けるアーキ設計だったような気がします。
true : false = 100 : 0 or 0 : 100 に片方が大負けせず、同じ性能になったのはこの学習効果ではないかと。
モダン言語の進化の方向の一つに高級化があるのは、仰るとおり。低レイヤーの最適化はコンパイラと進化したハードウェアに任せ、コードは人間にわかりやすくして開発生産性を高めようということです。
もう一つの進化方向は Rust とか Go とか、低レイヤー向け言語を C++ よりわかりやすく、より安全にしようというものだと思います。
>>725 失礼、例えばここにそんなことが書いてある
http://e-words.jp/w/%E6%8A%95%E6%A9%9F%E7%9A%84%E5%AE%9F%E8%A1%8C.html でもこの通りだとしても
>>723 は的外れだねすんません。
「損はない」というのは並列ではなくシーケンシャルに実行した場合のコストを
上回ることはないって意味だと思う。
同じ100ステップでも素直に並列化できる部分が大きい100ステップの方が
低コストなのは当たり前の話でした
>>728 ありがとう。
この説明は失敗時のリカバリーがノーコストでできる環境を前提にしていると思う。
投機的実行をした面とは別の面を持っていて、そちらにすぐスイッチしてロジックを実行しつつ、その裏で失敗した面を同時並行で捨てられるような感じ。それが一般的かどうかはわからない。
複数面を持たず、失敗ステータスを捨てて (= クリアして)、その後に分岐別側のロジックを走らせるというようにシーケンシャルにリカバリーするのが一般的なのではないかなと思ったんだけどね。
最近のは複数面持ってるのかもしれない。ただ、複数面持っていると分岐ない時にリソースが遊んで無駄だからねぇ、分岐なくても普段からその面で並列演算すればいいって話になるよね。
スレタイの初心者用とはいったいw 初めに回答したのが的外れとまでは行かなくてホッとしてるw
こいつらウンチクごちゃごちゃ長くても作るもん電卓だから
>>730 全てわかっている人なんていないのだし、それぞれ知っていることを持ち寄って可能性をいろいろ検討してみるのが健全なやりとりなんだと思いますよ。
IL をうんぬんは知らない観点だったし、CPU アーキの話するのも 25 年ぶりくらいだったし、高級言語と C とアセンブリの使い分けを簡潔に整理してくれた人がいたので、とても勉強になりました。
>>731 ま、C# からはかなり離れてしまったね。
でも、電卓をバカにするものは電卓に泣くよ。AI もゲームも業務アプリも全てそのマイクロ電卓の組み合わせなんだから。高級言語の時代でも低レイヤーの動作原理を知っているに越したことはない。
色々と教えていただきどうもありがとうございました。
とりあえず、下のような感じの結論でまとめたいと思います。
・UnitStep1が遅い原因はパイプライン処理における分岐先読みの失敗による制御ハザードだと思われる
・分岐の方向の入れ替わりが激しくてもそこに規則性があれば制御ハザードは起こりにくいようで、
分岐先読みにおいて高度な学習が行われていることが伺える
・高級言語の目的を考えれば、開発生産性を優先してUnitStep1を選択することも十分にあり得る
UnitStep1の入力データをランダムに決定した場合の、±の割合に応じた実行時間の計測結果
何かおかしなところがあれば指摘していただけると嬉しいです。
親切にしていただきどうもありがとうございました。
>>733 733 さんは fact-base で真摯に検証・報告してくれる誠実な人ですね。
おかげで楽しかったし、とても勉強になりました。
感謝。
>>734 お褒めいただきありがとうございます。
パイプライン処理はとても奥が深いようで完全に理解するのはなかなか大変そうですが、
データの割合に関するご指摘のおかげでわかりやすい計測結果も得られて私もとても楽しかったです。
あまりにもわかりやすすぎる結果のせいで今後しばらく条件分岐恐怖症になりそうですがw
>>710 C4LglgNgPgAgzAAhgJgQYQQbwLACgEFICMAbAmAHbAICqFYwAysAKYAORAFJdQB4CUCALwA+BLwQihCAAwIA/AiIIQsgNx5CxMj1r0mrNsm5Vxg0Qk4SRYuEUEBqJWoR4AvkA===
個人情報漏れてね?
>>731 Windows10の電卓のソースコードがGithubに公開されてるけどかなり複雑なことやってるぞ
>>739 そう言って最強の電卓を横に出して
自分が作ってるゴミまで光らせるのやめてもらえます?
ダッサイので
>>740 電卓が簡単でないことを指摘されて逆ギレw
ワッチョイ 2922-pwu9 スププ Sda2-pwu9 ワッチョイ 02a7-Bv1e ワッチョイ d163-r7Uq NG推奨
WPF開発に使われるMVVMパターンについてですが、Viewは良いとしてViewModelとModelの役割分担についての理解がイマイチです ModelではOnPropertyChanged();などの記述はするべきではないという理解で良いんでしょうか?
雑な解釈 基本的に一画面ごとに最低一つViewModelつくる なんも画面用にいじらなくてすべて共通部分しかないならModelオンリーで
基本的に変更も通知するモデルを作る 各画面ごとにそれをViewで使いやすい形に成形したVMを作る 深く考えない 困ったら考える
趣味でタッチパネル用のアプリ開発始めたのですが IsMouseOverだとタッチイベントが認識されなくて辛い なんかいい方法ご存知だったりしませんか?
タッチパネルならUWPを使いましょう WPFは終わった技術であり、過去の資産のために残されているだけです
そもそもタッチ操作ではマウスオーバーを表現できないってのは明らかだけど なんでIsMouseOverが出てくるの?
C#でQUEUEクラスを利用した際、Dequeue()後にメモリは残るのでしょうか? EnQueue()とDeQueue()を繰り返しているのですが、(Countは0になる) Visual Studioでメモリ使用量をみるとサイズがとても大きくなってるのですがこれはどういうことでしょうか?
GCされてないだけじゃね 適当なところでGC.Collect() してみなよ
surfaceをペンとで使ってるけどペンを画面に近づけるだけでボタンの色が変わったりしてるな
ペンはマウス扱いなんだろうけど タッチはどうなんだろうな
そりゃ対応ペンは少し浮いた状態でも座標検知できるけど指は無理っしょ
APIによって色々 WM_POINTERなら全部別デバイスとして判別されてる wpfにもタッチイベントあるんだからそれでやりゃいいやんと思うが
あるんだ 最近WPF始めたから知らんかった まだまだ使えそうだな
>>761 ペンに特殊な仕掛けがあるわけじゃないと思うので、
ペンだろうが指だろうが同じだと思う
知らんけど
でも普通に静電容量式のタッチパネルでしょ?
一応Windows7からOSネイティブでタッチ操作に対応してるんだよね。 当時技術サンプルとして鯉が泳いでる池をタッチすると波紋が広がるスクリーンセーバーが 公開されてたけど、なぜかコードは非公開で意味ねえと思ったなw
>>758 GCではだめでした
TrimExcess()呼び出せばいいんですって、奥様
>>764 surfaceのペンをスマホに当てても使えないから指とは仕組みが違うのでは?
>>764 ペンは電池式で何らかの仕掛けがあります。
良く知りませんが、恐らく「交番電界(周波数が低い電磁波とも言える)」を
出している可能性が高いです。
>>769 もともとタッチパネルの方が交番電界を出しているので、それを相殺するような
逆位相の降板電界をタッチペンの方が出している、と考えられるようです。
>>769 へー
静電容量式の原理から普通に考えればペン側に仕掛けが必要とは思えんけど、
よく分からんね。
接触しているかどうかの識別はCの大きさで判定するだけのはずだと思うんだけど
>>772 ペンは静電容量式に対応してないと反応しないよ
手袋とかでタッチしても反応しない
専用ペン使うのは電磁誘導方式でしょ。 静電容量とは根本的に違う。
>>773 対応って言ったって要するに導電性があるだけだよw
だから100均でも売ってる
>>774 surfaceってペン「も」使える設計だよね?
長い名前を持つクラスに、thisを返すメソッドがあるとします // 超長いクラス名 class VeryLongLongClassName { // thisを返すメソッド VeryLongLongClassName Foo( ) { return this; } } このとき、Foo()の定義につけるクラス名を省略、 あるいは置き換える方法はありますか? たとえば以下のような形が理想です var Foo() { … } // 型推論っぽく書けるとか __CLASS__ Foo() { … } //自身のクラスを表す予約語とか
>>776 外部との境界に var 型推論はムリ。それやると型を差し替えたときに影響が甚大になるため、型推論はローカルでしか許されない。
using エイリアスディレクティブで短い別名付けるとよいのではないかな。
問題点や何がやりたいのかを言うと 違うアドバイスか得られることもあるぞ
インタフェースとか継承を考えても、thisで型推論するのは無理じゃない?
戻り値が特に必要ないメソッドはreturn thisにして繋げれるようにしておこうかなあと return thisにするか同じクラスをnewするかはさておき
VisualStudio2017を使用 Form1にsplitContainer1を上下に分割して全面に貼ってあり、splitContainer1の下段側にリッチテキストボックス1をドッキングさせて貼ってあります。 このリッチテキストボックス1が、ScrollBarsプロパティ:Both、WardWrapプロパティ:false このリッチテキストボックス1に縦と横幅を超えるテキスト表示をした時、 縦のスクロールバーは普通に表示されるけど、水平のほうのスクロールバーが表示されなくなったのだけど何が原因と考えられるでしょうか? ・右キー押して自分でカーソルを右端まで動かせば一応画面のスクロールはさせられる ・以前はちゃんとスクロールバーが表示されてたはずなんだけどいつの間にか表示されなくなった?
>>782 クラス名が500文字とかあるならわかるけど100文字以内なら気にすることでもないと思う
気になるならそもそもクラスの命名が間違っているのでは?
xamlの質問になってしまいますが、全コントールアイテムのBorderBrushやForegroundの色を統一することって出来ないのでしょうか? <Style TargetType="Button"> <Setter Property="BorderBrush" Value="Black"/>... と一つ一つのコントロールを定義して回るしか方法はないのでしょうか?
>>776 ファイルスコープの別名なら普通に可能。
グローバルに別名が欲しいと考えてるならそもそも何か考え方が根本的に間違ってる気がする
>>784 そういう話ではない
それだと「変数をvarで定義するのは設計が間違っているからだ」と言ってるようなもん
>>788 いや誰が考えてもそういう(
>>784 )話ですw
それ以外にありえない
returnの型から推論できるんだからメソッドの戻り型にもvarを使わせろって話? んじゃあ始め書き込みで予約語の例示が意味不明 というか長い名前という言葉から文章を開始しといて何が違うんだ? 変数でvarを使うのは名称が長いからではないぞ? 長いものも3文字で表現できるという副次的メリットはあれどそのために導入されたものではない
メンバの型に型推論が使えないのは単純に技術的な問題だよ コンパイラは先にメンバのシグネチャだけを見てリストアップしてから各メソッドの本体を処理することで依存関係を解決している メソッドの中身を見ないとメンバの型が確定しないとなると、一度メソッドを処理しただけでは依存関係を解決しきれないから メソッドを何度も繰り返し処理する必要がでてきてコンパイルが遅くなる
>>785 できるよ~
1つのxamlにスタイルを定義して、全てのxamlから参照したりとか
なんか結論としては>99の質問と同じような感じになっちゃったけど
最初の質問が微妙に異なるので見落ちとしてた、すまん
>>787 単純に自身と同型のオブジェクトを返すときに、なんかスマートな方法あるのかな?と思っただけ
言語によってはそのへんの仕組みがあったりする
ファイルスコープでのエイリアスが可能なら
>>778 の言うように
分かりやすいところに ThisClass みたいな名前のエイリアスを用意しておいて
クラス内部では基本的にそっちを使うのもアリかなと思っている
予約語ではないのでエディタとの相性はそこまで良くないけのが欠点か
戻りの型名を普通に書くのがスマート くだらないアイデアでコードを汚さないで
>>791 なるほど、確かにそうだな
動的な言語だとまた違うんだろうけど比較できるようなもんでもないしな
>>794 んだね
アリかナシかで言えばアリだと思ったけど
言語仕様として存在しないなら自分個人ではなるべく避けたいな
>>791 今どきのコンパイラでワンパスなんてないだろw
な?名称が長いかどうかなんて関係ない質問なのに余計な単語から質問を始めるから周りが混乱する。 コメントで超長いクラス名とかまで書いてんじゃん そんで指摘したらそーじゃねぇよ!ってあほかとwどんだけ説明下手くそなのw
>>793 なるほど失礼w
長い名前云々書いたのははミスリードだったねw
戻り値を型推論で省略できないか?とシンプルに書いて欲しかった
>>797 誰がワンパスだなんて言ったんだ?
現在何パス使っているにせよメンバの型推論を許せば間違いなくパスは増えるし、
791で書いた内容は俺の想像じゃなくてMS公式のコメントだぞ
>>801 多少パスが増えることぐらいでガタガタ騒ぐなよ
って話な
あとMSの見解がどうかしたのか?w
>>800 そうなの?w // VLLCNじゃ何だかわからないので必要な場面で説明的な名前を与えるためだけのクラス // 空っぽの継承のまま維持せよ。メンバ追加禁止!!! class VeryLongLongClassName : VLLCN { private VeryLongLongClassName(){} } // VeryLongLongClassNameの実体はこっち。 class VLLCN { .... } まさかこんなのがお好みなのかなw 自身のクラス返すときだけ利用したいんでしょ tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか 他にはfactoryみたいなのをわかりやすくするとか 気持ちはわからんでもないけど局所的すぎると思う
.Net CoreからBitFlyerの認証が必要なWebAPIを使いたいんだけどさあ 業者は暗号化キーをソースコードやファイル等に保存しないよう求めてるんだけど、.Net Coreでキーを守る手段ってどういうのがあるの? WindowsやmacOS付属の機能も使えなさそうだし、最終的に動かしたいLinuxなんかそもそもそんな機能がないし・・・・ ランタイムにもそんな機能なさそうだし、どうすればいいんだろ
ソースはともかくファイルに保存は普通にやるよ リポジトリに機密情報をコミットしない、と勘違いしてないか?
>>804 > tweenerみたいな設定が多いものをチェインメソッドで必要な設定を好きな順番で書くとか
チェインメソッドってよく見かけるようになったけど見易いのかなぁ…
X.A( ).B( ).C( );
より
X.A( );
X.B( );
X.C( );
の方が見易いと思う俺は老害なんだろうか
>>807 linqでつなげるのに慣れてれば違和感なくならない?
linqとは意味合いが違うけども
まぁ可読性なんて人それぞれだとは思うよ
>>808 linqはパイプみたいに順次処理して行くからまだ理解できるんだけど
>>804 が言う
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
とかは普通に分けて書けばいいのにって思うんだよね
まあ人それぞれと言うのには同意するけど
Groovy などでやる、フォームビルダーみたいに、 各コントロールのサイズ・色など、設定項目が多いものは、メソッドチェーンでは見にくい
>>807 自分もそう思う
>>808 LINQでつなげる場合はLINQメソッドの戻り値を意識しながらつなげるわけだから、話が違うじゃん
list.Reversed().Select((v)=>v+1)みたいな例はデータをどんどん変換しているから良いと思うけど、
form.ForeColor(Color.Red).BackColor(Color.Black)みたいなやつは1行で書けるメリットがあるのはわかるけど、
やってることは関数じゃないのに関数っぽくっ振る舞ってるのがすごくモニョモニョする。
これが、
form.CopyWithForeColor(Color.Red).CopyWithBackColor(Color.Black)で別のformが2つ作られるとか、
form.ForeColorChanger(Color.Red)でForeColorChanger<Form>が生成されて、ApplyFormで元のFormに反映されるとか
ToFormで新しくフォームが作れるとかならわかるんだけど、
副作用のあるメソッドで、戻り値がvoidのやつはもったいないから、戻り値をthisにするってのがなんか受け付けないんだよな―。
DSLとしてどの程度価値があるのか次第だと思う
https://martinfowler.com/bliki/FluentInterface.html LINQのように関数型ライクな関数合成をOOで表現する場合と
FluentなBuilderパターンは見た目は似てても中身と目的は違うよね
だから意味合いは違うって書いてんでしょうが this返して繋げる前提ライブラリなんてよくあるし好き嫌いの範疇 君が嫌いならしなきゃ良いだけじゃん 俺だってC#のライブラリ作るとき設定するだけのメソッドでthisなんて返さないよ それは俺が作るものが小さいものだからできるだけ標準に近いものが良いだろうってだけ 大きめのものでそれが全体を通して同じようにthis返す設計で、それを使うならなるべくその思想には従うかもしれん程度
this返すお作法は昔のjava方面の文化じゃない? C#は1.xの時代にMSか何かのガイドラインで「やるな」って書いてあったのを読んだ記憶がある。 個人的にそもそもそんなキモいことやらないよと思ったので禁止の理由までは覚えてないが。
>>813 > だから意味合いは違うって書いてんでしょうが
何にキレてるのか知らんけど、意味合いの違うものを引き合いに出すこと自体がおかしいって指摘されてることぐらいは理解しようよ
とは言え X.A()?.B()?.C(); ならどうだろう?
意味合い違うものを出すのがおかしいなら807のレスがおかしいんだよ? 見やすいとか関係なくて776がこんな機能ないの?→無いよ→なんで欲しいの?→こういうのしたいんでしょ→見にくくね?気持ち悪くね? って知るかよw 機能の話してんのになんで見易さの話にシフトすんだよ 見易さの話に変えられたので同じ表記の例示だしただけだし、そもそもlinqではないが採用してるライブラリも例示してんのになんでそこにこだわんの?w
おおもとの
>>776 や
>>793 の疑問についてはusingでエイリアスをつけて
『using [別名] = [VeryLongLongClassNameとか別名をつけたいクラス名];』と宣言して、
『[別名] Foo() { return this; }』みたいなメソッドの書き方することはできるし、
その別名に「This」を使ってるようなソースもたまに見かける
なんだけど・・・そもそも戻り値が特にないからとりあえず安易にthisを返すみたいな考え方は間違ってる
戻り値がないならvoidにして無駄な戻り値を返さない
そのクラスがBuilder的な使い方をするクラスである場合に限って、
そういうクラスであることをクラス名ほかで明示したうえで首尾一貫して全voidメソッドでthisを返す
>>782 みたいな考え方で戻り値がthisなのか新しいインスタンスなのかブレるかもしれないのは論外
戻り値が後者なメソッドが混ざってると
>>807 の2種類の書き方で結果が同一にならなくなる
Fluent apiってthisを返すことが目的じゃないからな メソッドチェインで宣言的っぽくプログラミングするためのアイデアであってthisを返すメソッドはそのサブセットでしかない 世に出てるライブラリを見ればわかるがthis以外もバンバン返してる だから作法としてとりあえずthisを返すなんてのは何もわかってない全く馬鹿げたことだ 先にFluent apiの設計をしなければならない その設計に必要ならthisを返すメソッドを加えるだけだ
>>817 話題を変えること
と
違うものを引き合いに出して同じでしょ
って言うことの違いも理解できてないのかよ…
>>820 話題を変えたから見た目の話してんのに機能面に難癖つけてるの分かってる?
見た目はこれと一緒、機能はちがうけどね
ってレスしたらそれは機能が違う!って戻してんじゃんw
見た目も機能も同じtweenerという例示
見た目の話に切り替えたので見た目は同じだが機能は異なるlinqという例示
念の為機能は異なることも明記した上での提示に対して機能面についてあーだこーだ言われてもねぇ
喧嘩すんなよ。 いろいろな観点から指摘が入って、設計やスタイルに関する考察が深まるのはいいことだ。 揚げ足取りとか噛み付きとか不毛だからやめような。
コードレビューするなら 本質的な機能では無いのに戻り値返すのは利用者の理解を妨げる上に、バグの元にもなるので、余計な事すんなと言うな あとから戻り値欲しくなった途端に困るやろ
今までレスしてる中でthis返す設計に肯定的な姿勢なのは元の質問者である782だけ C#標準にそういう設計は無いからその利用者の多くは否定的になる、俺も含めて 世の中いろんな設計指針があるし他言語の流儀を真似することもある 同じチームで開発することになるならその辺りはできるだけ同じ方向を向きたいけれど、そういうのじゃなければ最終的にはお好きなようにとなるよね
>>821 バカなの?
> linqはパイプみたいに順次処理して行くからまだ理解できるんだけど
って書いてあるだろ
そういう必然性のない
> 設定が多いものをチェインメソッドで必要な設定を好きな順番で書く
を同一視してるのがおかしいの
わかった?
>>825 それは機能の話ね
で、機能は初めから違うよ、って言ってるよね?
誰も同一視してないのになんで同一視してんじゃねーよ!って絡んでくるの?
揚げ足取りだけど&Javaからの輸入だけど >C#標準 つStringBuilder もっとも自分でコード書くなら(変数名が短い前提で)メソッドチェーンにはしないけど 「文字列組み立ての順序を明示する」意図でメソッドチェーンで書くのはまあ理解できる
linqもtweenerみたなのもメソッドをドットでつなげて表記する データを加工して流すものとthisを返すものという機能面では全く異なるもの 機能と見た目を完全に切り離せるわけではないので、その見た目から機能面を理解しづらい=可読性に影響があるという議題は残るものの、どちらも利用する上での表記は同じ ただこれだけで当初から機能は異なることを明記してるのになんで機能違うじゃねーか!みたいなすでに注釈してる内容に噛み付いてくるんだ
>>827 おぉ、確かに
標準にもあったね、ありがとう
>>826 もしかして「必然性」っていう言葉を理解できないの?
機能が違うからダメと言うより必要もないのにチェインメソッド使わなくても良くね?
って話な
>>827 fact を提示するのは揚げ足取りではないと思うよ。
return this は言われるほど悪いものではないと個人的には思う。が、メソッドチェーンにする価値は LINQ に比べるとさしてないという意見にも同意。
>>830 うん、使わなくてよくね?
使うべきとも使ったほうが良いとも書いてない
そういうライブラリがこの世に多少は存在することを例示しただけ
そもそも俺自身がthis返す設計に否定的だって何度も書いてるんだけど読んでる?
他言語だけどスクレイピングでよく使う browser .GotoHome() .Login() .DoSomething() .DoAnother() .SkipSomething() .PrintResult() コンテキストのつながりが自分にとって自然で 各メソッドを部品としてチェリーピックして使うような場合は 読みやすくなると思ってる 結局 return thisの是非じゃなく メソッドチェーンでつないでいくのが適してる用途なのか そうじゃないのかの話だよねこれ
>>832 お前の意見はどうでもいいよ…
必然性の有無にも気づけずにLinqガーとかいうアホがいたって話だしw
なんか絡まれたから対応したら君の意見はどうでもいいって… じゃあなんで絡んだんだよw
VBのWithみたいなことやりたいって理由でthis返すんなら最低だな
>>835 > じゃあなんで絡んだんだよw
ちゃんと書いてあるだろ…
> 必然性の有無にも気づけずにLinqガーとかいうアホがいたって話だしw
見た目の話だけなら個人の好みだから人それぞれでいいけどLinqとかの必然性があるものを持って来られても困る
>>837 いや、だからなんで俺の意見はどうでも良いはずなのに未だに絡むの?
何を説明しようがどうでもいいで片付けるんだから話にならないじゃんw
もう一回説明しようか?
linqと見た目が一緒、機能は異なる
ただそれだけなんだけど伝わらない?これも意見だからどうでも良いんだと思うけど
ずーっとこう主張してるのになんでlinqは必然性があるから良いんだ!みたいな頓珍漢な絡みするの?
>>838 まじで日本語の理解力がなさすぎ
(引っ込みつかなくなってるだけかも知れんがw)
> うん、使わなくてよくね?
という君の意見はどうでもいい
Linqは
>>811 が書いてる通り
> LINQでつなげる場合はLINQメソッドの戻り値を意識しながらつなげるわけだから、話が違うじゃん
ってことな
>>839 いや、だからそんなことわかりきってるよw
807で君が言った内容に対して表記が同じとしか言ってない
ちゃんと機能が異なることを追記した上で同じ表記だね、って言っただけでしょ?
それに対して延々と同じ内容で煽り続けてるんだよ?
linqは意味が違うよっていう808からの始まった内容に対してlinqは意味が違う!馬鹿なの?って
もっかい始めの方からレス内容確認したほうが良いよ
言葉尻捕まえて煽るだけで引っ込みつかなくなってるのはたぶん君の方だよ
もう堂々巡りにして引き分けに持ち込もうと必死だな Linqならメソッドチェーンにする意味があるから > tweenerみたいな設定が多いもの と一緒にされても困るって何度書いても同じこと書いてくるんだろうなw
機能の話から表記の話なってまた機能の話に戻す 表記の話のときに表記が同じ例を提示すると機能が違うんだから同じにすんな! ってそりゃそうですよね、機能は違うってみんな言ってますもん 機能が同じだなんてレスどこにありました?
804:機能の話 807:機能から発展した表記の話 808:表記の類似例の提示 811:機能ちげーじゃんというツッコミ 813:そうだよ機能は違うよという返し ここから延々、表記の類似例に対して機能が違うじゃんというツッコミ 811は807とは違う人だけどね 807でも機能の話をしてたと言うなら俺の読解力が悪かった 表記の話であることを明確にするために808に意味合いが異なると注記したつもりではあった 今見返しても表記に関しての話題転換にしか見えないけど
ゴミのような時間の使い方をしている人らとはどっこいどっこいって感じよ
まだ言ってるのかよw > 機能が違うからダメと言うより必要もないのにチェインメソッド使わなくても良くね? > って話な って書いてあるのに「機能が違う」を連呼するしかない脳無し乙
>>1 >なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
>C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
ID真っ赤にしている人はコレ100回読んでね
お互い口汚く罵るのはやめよう。どちらも有益な情報を持ち込み、スレに貢献してると思うよ。
>>844 機能と表記の 2 観点からの考察ありがとう。君の主張は首尾一貫していて妥当だと思うよ。
私は return this 完全否定はしないけどね。
>>842 tweener なるものが何か知らないのだが、設定の手数の観点で C# と比較できるものではないということはわかった。ありがとう。
私が return this を時折使う理由も設定の手数あたりにあるかもしれないと思った。
変数宣言&インスタンス初期化を “本処理とは分けて” ワンライナーで書きたいのだが、初期化の手数が多いときに return this 使うよ。
var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);
// a, b, その他の変数を用いた本処理
という感じで。
初期化と本処理をごちゃ混ぜに書くと本処理の本質が見えづらくなるため好きではないし、if, for などで新しいブロックが出てくるわけでもないのにコンテクストの途中で新規変数宣言するのも好きではない。純粋に表記スタイルの (好みの) 話。
まあLINQはさておき 前者と後者じゃ後者のほうがスッキリして見える場合もあるんじゃないかなとは思う hoge.foo(); hoge.bar(); hoge.baz(); hoge.quz(); hoge .foo() .bar() .baz() .quz(); セミコロン必須の言語やif文とは相性そんなに良くないけどさ
>>850 tweenerはたぶんゲーム分野とかで使うことが多いと思うけど表示物のアニメーション制御に使うようなライブラリを指して言った
最近はweb系もアニメーションには富んでるからそっちにも似たようなものはある
表示物のx座標をaからbにc秒かけて移動させる、そのときd秒遅れてアニメーションを開始して終了後にe関数を呼ぶ
みたいな設定をするのに使う
c#の先祖に当たるdelphiではwithがあったがC#で亡くなった
まあ罵倒は見てて見苦しいねw thisを返す手法に違和感を感じる人(自分もその一人)が多いのは、 (1) シグジェチャだけではメソッドが返す値がthisなのか別のインスタンスなのか分からない (2) チェーンさせる目的でthisを返すのは意味論(メソッド名はそのメソッドの機能を表現する)を破壊する こんなところか。 本来は必用なら言語レベルで実現すべき機能なんだろうね。 でもC#erってVBのWithブロックには否定的な人が多かったよな
相談させてください。 以下のようなクラスを作りたいと考えています。 class MyStaticClass1 { static double HighCostMethod() { ... } public static double X = Math.Sign(HighCostMethod()); public static double Y = Math.Abs(HighCostMethod()); } しかし高コストな HighCostMethod を2回も呼びだすのは無駄なので 以下のように改良しました。 class MyStaticClass2 { static double HighCostMethod() { ... } public static double X, Y; static MyStaticClass2() { var v = HighCostMethod(); X = Math.Sign(v); Y = Math.Abs(v); } } ところがこのコードは規則 CA1810 に違反すると警告が表示されました。 静的コンストラクターにはパフォーマンス上の欠点があるようなのです。 【CA1810 参照型の静的フィールドをインラインで初期化します - Visual Studio Microsoft Docs】 https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca1810?view=vs-2019 (続く) (続き) そこでさらに次のように改良したところ、無事警告は表示されなくなりました。 class MyStaticClass3 { static double HighCostMethod() { ... } public static double X = Initialiser.Instance.X; public static double Y = Initialiser.Instance.Y; class Initialiser { public static Initialiser Instance = new Initialiser(); public double X, Y; Initialiser() { var v = HighCostMethod(); X = Math.Sign(v); Y = Math.Abs(v); } } } ただ、クラス初期化時のパフォーマンス上の問題を解消するために さらに別のクラスを定義するのは本末転倒な気もします。 私のアプローチは正しいのでしょうか。 それとも素直に CA1810 の警告表示を抑制すべきでしょうか。 もしくは、別のもっとスマートな解決策があるのでしょうか。 アドバイス等をいただけると嬉しく思います。よろしくお願いいたします。
俺自身もthis返す設計に否定的で813で明確に表明してるんだけどねw 850の初期化の例みたいなのもC#ではメソッドに引数名を指定して呼び出すことができる機能があるからそれで事足りる 引数の数が多くなったりオプション引数使えば更に長くなったり呼び出し側も見た目はスマートとは言えないような書き方になったりするんで多用は避けたいところだけど局所的な利用なら無しでは無い気もする まぁ設定用の構造体作って渡すとかjson等をシリアライズしたものを渡すとかのほうがいいんじゃない?とは思う
>>856 >高コストな HighCostMethod を2回も呼びだすのは無駄なので
典型的なシングルトン。
データベースマネージャーとか、何かを管理するクラスは、基本的に1回しか実行しない
init( ) みたいな、特別な関数でしかnew できない。
通常の方法では、newできないように、エラーになるように作る
>>857 HighCostMethod()の結果をキャッシュする
キャッシュがあればそれを使う、なければHighCostMethod()を呼んでキャッシュに入れてから値を返す
>>856 private static double Cache = HighCostMethod();
public static double X = Math.Sign(Cache);
public static double Y = Math.Abs(Cache);
みたいに一旦結果を受けるものを作れば回避できそう
>>859 レスありがとうございます。
おっしゃるとおり、シングルトンを使えば問題は解決するだろうと考えて
作成したのが MyStaticClass3 なのですが、
MyStaticClass3 が MyStaticClass2 よりも
パフォーマンス的に優れていると考えられなくて
質問させていただきました。
> init( ) みたいな、特別な関数でしかnew できない。
> 通常の方法では、newできないように、エラーになるように作る
ここで説明していただいているお話と
MyStaticClass3 の中身の違いがよく理解できていないので
詳しく教えていただけないでしょうか。
よろしくお願いいたします。
>>860 レスありがとうございます。
HighCostMethod()の結果をキャッシュするための装置として
MyStaticClass3.Initializer を作ったつもりなのですが、
改良点などがあればご指摘いただけると幸いです。
よろしくお願いいたします。
>>861 なるほど!レスありがとうございます。
ただ、一時的に値を保持するためにフィールドを使うのは
少し抵抗があるきもするのですが、よく使われる手法なのでしょうか。
また、一つのクラスを複数ファイルに分けて記述できることを考えると、
フィールドの初期化は必ず上から順に行われることが
保証されているのかということについても少し不安があるのですが、
もし何か参考資料などをご存知なら教えていただけると嬉しく思います。
よろしくお願いいたします。
>>851 そう、そう言う風に純粋に見た目の話をしてるのにチェインメソッドにするしかない(まあ一旦変数に受けりゃいいんだけど流石にそれはねぇ)Linqを出されてもねぇ
Linqをバカにされたとでも思ったのかな?
それはさておき、たしかに同じ変数を何度も書かされるのはなんとなく冗長な感じがするからWith文みたいなのが欲しいのは理解できる
そのうちオブジェクト初期化子でメソッドが呼び出せるようになったりして
var a = new ClassA().Init1().Init2().Init3();
var b = new ClassB().Init(a);
↓
var b = new ClassB(){
Init(new ClassA(){ Init1(), Init2(), Init3() })
};
VS2015だとCA1810 なんか出ないなw 出るとしても警告を抑止して問題ないケースだと思うけど
stringのreplaceとか別のインスタンスじゃん こういうのと仕様が違うの作っちゃうの嫌だな こういうのは多数派に合わせる感じで
>>862 「一つのクラスを複数ファイルに分けて記述できること」はpartial classを指していると思うんだけど、その場合はちょっと分からん
ただpartialでない普通のクラスの場合は、初期化は記述順(上から順)に行われることが保証されている
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes#fields > The static field variable initializers of a class correspond to a sequence of assignments that are executed in the textual order in which they appear in the class declaration
これはOKみたい。 static double x; static double y = ( (Func<double>) ( () => { var v = HighCostMethod(); x = Math.Sign(v); return Math.Abs(v); } ) )(); もちろん俺ならこんなことしないw 素直に警告無視or抑止するのが一番いい。 無駄なことして可読性落とすなんて愚の骨頂
>>864 情報どうもありがとうございます。
Visual Studio のバージョンに依存する話だったのですね。
私は Visual Studio 2019 (Version 16.3.10) を使っています。
情報が後出しになってしまい失礼いたしました。
> 出るとしても警告を抑止して問題ないケースだと思うけど
ご意見ありがとうございます。
>>856 に貼り付けたリンクの先にも
「パフォーマンスが問題にならない場合は、このルールの警告を抑制しても安全です。」
と書いてありますし、やはり抑制が最善の方法であるような気もしてきました。
>>865 > プロパティ
アドバイスどうもありがとうございます。
string.Empty の様に、プロパティである必要がないものは
フィールドにしたほうがパフォーマンス的に有利かと思って
そのようにしていたのですが、確かにプロパティが一番真っ当ですね。
> Lazy<T>
ありがとうございます。ただ、私の考える限り以下のような方法しが思いつかず、
だったら
>>861 に書いていただいたもので良いのではと思ってしまうのですが、
もし Lazy<T> を使った別の方法があれば詳しく教えていただけると嬉しく思います。
static Lazy<double> Cache = new Lazy<double>(HighCostMethod);
public static double X = Math.Sign(Cache.Value);
public static double Y = Math.Abs(Cache.Value);
>>867 おお!情報どうもありがとうございます。大変勉強になります。
そうであるなら、Cache のフィールドが残ることが気にならないか、
もしくは Cache も後々使うなら
>>861 に書いていただいた方法が
最善になりそうですね。
>>864 なるほどw 警告も万能ではないとういことですね。
説得力のある面白い例を示していただきどうもありがとうございます。
>>868 そのコードだとyにアクセスせずxにだけアクセスしたら初期値の0のままだぞ
>>869 >>865 の一つ目のリンク(.NET Fiddle)がLazy<T>使ったサンプルだよ
>>871 CA1810のページによると、staticフィールドの初期化はいずれかのstaticフィールドに
最初にアクセスされる前に行われるとなってるから、それはないのでは?
知らんけど
>>872 サンプルを書いてくださっていたのですね。大変失礼いたしました。 ただ、やはり Lazy<T> を使うメリットが理解できずにいます。 MyStatic が初期化される時点で _highCost が初期化されて、 その後すぐに _highCost.Value が呼び出されるのであれば、 >>861 に書いていただいた方法で十分な気がするのです。 >>873 おっしゃるとおりだとおもいます。 ところで少し考えてみて、場合によっては冗談ではなく public static double X, Y = InitializeYAndX(); static double InitializeYAndX() { var v = HighCostMethod(); X = Math.Sign(v); return Math.Abs(v); } みたいな書き方が選択肢になり得ることもあるような気がしてきました。 もしくは、実際にはフィールドは readonly にしたい場合が多いと思うので public static readonly double X, Y = InitializeYAndX(out X); static double InitializeYAndX(out double x) { var v = HighCostMethod(); x = Math.Sign(v); return Math.Abs(v); } のような感じとか。 >>874 個人的に警告を回避するために普段しない書き方をするのは違うと思う
警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
起動コストが問題なくてstaticが妥当なら警告抑制を選択するかな
>>874 LowCostMethodも追加してみた
https://dotnetfiddle.net/Be6wMy 名前の通りLazy LoadingとかLazy Initializationとかいうのをするためのもので
必要になった時に初期化されてなければ初期化して、初期化済みなら初期化済みの値を使う
MyStaticクラスが初期化される時点で_highCostが初期化されるわけではない
getプロパティで
if ( cache == null ) { cache = HighCostMethod(); }
return cache;
するのと意味的には同じでdefaultでthread-safe
詳しくは
>>862 の2つ目のリンクに書いてある
あともし他人も使うコードなら潜在的に高コストな処理は
フィールドやプロパティじゃなくメソッドにしといたほうが無難
>>875 > 個人的に警告を回避するために普段しない書き方をするのは違うと思う
> 警告の内容を理解し、それが今回のケースでは問題ないと判断できるなら遠慮なく警告を抑制していいと思う
アドバイスどうもありがとうございます。確かにおっしゃるとおりですね。
この考え方で、警告を抑制する方向で行こうと思います。
> プログラム起動時に自動的に初期化されるstaticとプログラマが初期化タイミングを制御できるsingleton
static はプログラム起動時に初期化されるんでしたっけ?
ただいずれにしても、コストが非常に高い場合は
明示的に初期化のタイミングを指定できるように気をつけたいと思います。
>>876 詳しいご説明ありがとうございます。
「MyStatic が初期化される時点で _highCost が初期化されて」
という表現は正しくありませんでした。失礼いたしました。
ただ、お書きいただいたコードでは
private static readonly Lazy<double> _highCost = new Lazy<double>(HighCostMethod);
の直後に
public static double X = Math.Sin(_highCost.Value);
public static double Y = Math.Abs(_highCost.Value);
が実行されるので、例えば
private static readonly double _highCost = HighCostMethod();
と
public static double X = Math.Sin(_highCost);
public static double Y = Math.Abs(_highCost);
に書き換えても同じではないでしょうか?
> あともし他人も使うコードなら潜在的に高コストな処理は
> フィールドやプロパティじゃなくメソッドにしといたほうが無難
アドバイスどうもありがとうございます。言われてみて、確かにそのとおりだと思いました。
コストの高さに応じて適切な書き方が選択できるように勉強したいと思います。
もう誰かとっくに書いてるだろうけど、やっぱり本来は重くなる可能性があるなら フィールドやプロパティーじゃなくてメソッドにすべきなんだろうね。知らんけど static double _x, _y; static Action InitializeXY = () => { var v = HighCostMethod(); _x = Math.Sign(v); _y = Math.Abs(v); ; InitializeXY = null; }; public static double GetX() { InitializeXY?.Invoke(); return _x; }
なんかこう、せっかくの言語仕様を活かしきれてないような もったいなさがあるよね
原則としてはgetterでは値の取得と通知しかしてはならない これはC#に限った話ではなくオブジェクト指向の大原則の一つ
大原則? オブジェクト指向の原理主義的にはそもそもgetterを作るべきではないんだよ getterを使うのは上司がタバコを吸いたいときに不器用な部下にしびれを切らして「お前、もういいからお前のライター寄越せ」 と言っているようなもので、オブジェクトから本来担うべき責務を剥ぎ取ってしまっている 火をつけろと命令を投げっぱなしにしておけば勝手に火をつけてくれるのが本来のオブジェクト指向の姿
昔の人は言いました「100人のプログラマーがいたら100通りのオブジェクト指向がある」
なるほど 博士が100人いる村につながる胸熱展開ですね
消すの意味次第 抑制も含むなら消してる 抑制は含まないなら消してない
vs 2019でenumをuintで作ったらint32にしろって警告された win32api用なんだけど使用時にキャストしろという事か
フォルダファイルの情報集めてデータベース作りたいんですけど データベースの種類って何がいいのかな? 3万件ぐらいのレコード、外部に持っていくこともしない よろちしおねがいします
何がしたいのかによるよね ぶっちゃけ外にださないんだったらcsvですらいいんじゃね?って気もするけど
linuxにはlocateコマンドと言うものがあってファイルを高速に検索できる これはただあらかじめフルパスのファイル名を全部取っておいて一つのテキストファイルにまとめてあるだけ 用途次第で最適な方法は異なる
フルパスそのままじゃなくて差分のようなテキストファイルを作っていたような気もする
>>893 Redisなんてゆうデータベースあるんですね、一般的なのかな
さんくすしらべてみます
>>895 サンクスsqliteよく使われてますよね昔から
今でも普通に使われてるのかな?
>>894 >>896-897 何がしたいのかとゆうと、外付けHDDの中身を書き出したい的な事がしたいのです
高性能なフリーウェアがあるとしても、自分でつくりたいのれす
いや、知りたいのはその書き出したファイル情報をどうしたいのか?なんだけど… 自分で作りたいというのが勉強を兼ねてるならsqliteとかでひとまず慣れるのが良いんじゃない?
教会作るのか扉作ってるのか木を切ってるのかっつー話よな それはさておき お手軽に使えるのはSQLiteでライブラリやマッパーも豊富 redisは高速でwebクラウド周りでは結構ちやほやされた けどRDBとNoSQLの区別付いてるかは心配やな 外付けHDDの中身…か…
テキストファイルにファイル名ずらっと並べて終わりだろう
>>900 さんくす、SQlite?そんなの古くて誰も使ってないよ?みたいな状態が怖い
>>901 さんくす、とりあえず椅子を作りたい、用途に多少合わなくても使えるから
簡単な検索、重複ファイルの処理とか?
速度は遅くていいので、簡単で扱いやすいのがいいでつね
RDBで作ろうとおもってます
>>902 そんな感じになりそう、さすがにテキストファイルは作らないけど
sqlite使ってみようと思いますが、Microsoft SQL Serverってどうなんでしょう?
定番なんでしょうか?それとも難しいとか使いにくいとか
>>903 sqliteはローカルで閉じたお手軽DBとしてはまだまだ現役よ。ローカルDBのデファクトスタンダードと言っていいぐらい。
クライアントサーバのようなシステム作りたいなら不向きだけど。
SQL ServerとかそれこそWinのクラサバでしか使われてない無価値な技術だぞ
sqliteは組み込みDBではメジャーだろ。androidアプリの標準ローカルDBがsqliteだし。iosのcoredbだって内部はsqlite使ってるだろ? モバイルアプリでsqlite使われまくりだろ。 まぁ、最近はrealmだのあるが
sqliteはChromeとかfirefoxでも使ってるはず
>>903 win環境ならSQL Serverは最有力選択肢だよ
C#前提ならVisualStudioとも統合されてるし、簡単に扱えるので取り回しもしやすくて情報も多い
気になるのはやろうとしてることに対して、若干大げさな構成かなという点かな
RDBの経験積みたいのが目的に含まれるなら全然アリよ
インストールとかもSQLServerのインストールと設定込みになるから大げさだよ インストール先でSQLserverの管理も必要になる(セキュリティーホールに対するアップデートなど) sqliteがいいと思うよ
プロダクト目的なSQLite 勉強目的ならSQLServerっつーことで
>>904 さんくすです、現役なら今から勉強しても無駄にはならなそうですね
>>905 Microsoftはたまに、それ誰得よってのがあるから怖い
>>906 さんくす、androidに使われてたらしばらく安泰でつね
>>908 ちょと調べてみたけど、きびしい、頭の片隅に
>>910 ,912
さんくす、SQLServerも間違ってはいないのですね
DB使うまでもなくオーバスペックっぽいけど、練習になるから
>911
導入がメンドイのと保守もいると、さんくすね
>909
firefoxで使ってるのみました、でもFFは設計古いままきてるからどうなのかなって
>913
VisualStudioにsqliteいれといてくれたらいいのにね
みなさんさんくす、現在のDBの立ち位置がわかって、方向性がだいたい決まりました
まずはsqlite導入してみようかな
SQLiteって導入するほどのもんでもない っていうか導入とかせんでも使えるし
nugetで簡単にプロジェクト追加できるからVisual Studioに付属していないという批判はお門違い
>>917 まあこういう文章だと語尾がしねに読めちゃうのはしょうがないしね
「~だしね」からの「しねとは何だ!」ってのはいつものお約束だろw むしろ愛を感じるわ。
>>914 > VisualStudioにsqliteいれといてくれたらいいのにね
2019は知らんけど2017はVisual Studioのインストール時にSQL-Server LocalDBを入れるかどうかを聞いてきたような気がする
LocalDBは外部からの接続できないだけで中身はほとんどSQL-Server
Visual Studioからテーブル開いてデータを弄ることもできるしそこそこ便利よ
>>923 使いたいときはentityframeworkっていう似たようなものを被せて使います
>>922 まじでっ、2017入ってるんだけど記憶にないお
スキップしたんだろうな、今からいれてみるサンクスね
>>915-918 nugetも入れたほうがいいのかお
genericsの〈T〉のTって動的に入れるのは無理? System.Typeはわかってるんだが
>>928 Type.MakeGenericType
>>927 nugetを入れると言う以前にVS使ってソリューションて作るとすぐ使える状態にあるし
SQLiteを始めとして外部ライブラリを導入するならnuget使うのはc#では基本ツールと言えるので、使えたほうが良い
パッケージ管理にnugetが最適かは置いておくとして
sqliteやるとして、Dapperを使うかEF使うかは意見が分かれるところだね ついでにSQLから始めるってことでDapperをお薦めしますが EFはSQLを知らなくてもなんとかなるが、そのうち壁にぶち当たるだろうからね
SQLiteとEFの組み合わせはテスト専用だ EFはサーバー用のフレームワークなのでSQLiteを使うようなスタンドアロンなアプリで使用されることは基本的にないし、 EFなんか被せたら軽量なSQLiteが台無し
SQL-Server Local DB って MSDE のこととちゃうんけ
MSDEつーか、SQL Server Expressだっけかな
いや間違ってる MSDEの後継はSQL Server Express Local DBはそれとインターフェイス互換性を持たせた別製品 ExpressとCompactのあいのこみたいなもの
ありがとう SQLite とは関係無いことは判った SQLite の簡単さとは比べ物にならない
SQLLiteてUPDATE文に結合テーブル使えないんだっけ
>>939 > Local DBはそれとインターフェイス互換性を持たせた別製品
> ExpressとCompactのあいのこみたいなもの
お前もテキトーなこと書くなよw
LocalDBはエンジンはExpressとほぼ同じで外部からの接続ができないだけ
Compactは全く別物で使えるSQLも異なる
20年程前にSYBASEと分離したけど 大元は同じだったり
MS製でサーバーインスコ必要ないSQLはmdbということになる?
なんでMSはAccessやめちゃったんだろうな さっさとWeb移行して真面目に開発続けてればSalesforceみたいな糞に出番はなかったのに
>>944 SQL Server Compact…はまだ生きてたっけ?
>>947 Compactは終了で、その代わりがlocalDBなんじゃなかったっけ
>>930 さんくす、Nugetすごく簡単だねえ、ただ多すぎて迷う、coreにしてみた
>>931 わざわざさんくすね、LocalDBも入れてみるお
>>933 Dapperとゆう新たな単語が、、頭の片隅に
他の人もサンクス、あとは勉強してコード書くだけだね
>>946 Access地味に高いからな
使わんのにエンタープライズに入ってやがるのがムカつく
>>950 Accessというか、MDBファイルは作るときこそ金はかかるが、配布は無料ってところが良かったよな
頑張ればフリーで全て賄うことも可能だったし
ASP.NET Webフォームでオブジェクト指向な作りって出来ますか?Pageクラスを継承した画面ごとのクラスが基本となると思うんですが、それらとは別にドメインオブジェクトを定義すればいいんでしょうか? 古いフレームワークのせいか、参考になる情報がWeb上で見つからず困っています
ドメインオブジェクトはどんなフレームワークでも作るのはまあ基本
C#にしてもVB.Netにしても、オブジェクト指向な言語だからできるだろ オブジェクト指向な作りってどんなのを指してるんだ?
extendsを使いグローバル変数で回さないことかな
mdb は Access 無くても作れるし使える wsh からも作れるし python からでも win32com とか adodb とかで生成も操作も可能
>>956 生成できたっけ?
ADOXが必要だと思ってたけどadodbで生成できるならやり方教えて欲しい
昔はVSでもGUI上からmdb作れた気がするけどc#からコードで作れたと思う
扱い面倒だからね 自分だけなら良いけど 人が触ると直ぐに解放漏れするし gc.Collect連打とか
モダンアプリではより完全なCOMベースになったね .NETなんかいらんかったんや
組み込みっていったっていまどきマルチスレッド当たり前で、要は マルチユーザーでアクセスするのと同じなんだが、組み込みDBは行ロックが ないのが痛すぎる。大きめのバッチ走らせると行ロックないから 他から更新できなくなるし。
>>964 用途に応じて使い分ければいいんじゃないでしょうか
Newtonsoft.Jsonに絡み、C#の文法や仕組みがよくわからないので教えてください
https://www.newtonsoft.com/json 前者のコードが通ること、対して後者が通らないことの理由がそれぞれよくわかりません
var jsonString = JsonConvert.SerializeObject(new {asdf = "asdf"});
var jsonString = JsonConvert.SerializeObject(new {var asdf = "asdf"});
JsonConvert.SerializeObjecメソッドに匿名のオブジェクトを作成して渡すのであれば、宣言を含めきちんと作成した後者のコードになるような気がしてしまいますが・・・・一体どういうことなのですか?
匿名型でvarを使う文法が存在しないからじゃねーの
>>967 =968
ありがとう、こういうものだったのか
全然知らなかった助かったよ
WindowsフォームのListBoxのアイテムの順番を マウスでドラッグして移動出来たりはしないでしょうか?
vs2019って新規作成でフォーム作れます?いきなりユーザーコントロールしかなくないですか?
>>973 そうなんだよ
まずボタンやチェックボックスの自作から始まる
一通りできたらフォームの新規作成がアンロックされる
>>976 右上二行目のコンボボックスが「AddOn」となっているだろうが、そこを「デスクトップ」にする
WPFのStack、WrapPanelなどのコンテナ上の余白クリック時にイベントを追加したいのですが、Background="#00000000"とすることでそれ自体は達成することが出来ました しかし該当コンテナ上に配置されてるButtonなどのコントロールをクリックしたときもコンテナに追加したクリックイベントを拾ってしまいます あくまで余白クリック時のみ発生させたいのですが、何か方法はないでしょうか?
>>979 if (!(sender is StackPanel)) { e.Handled = true; return; }
これを先頭に追加してみたところ希望の動作になりました。
どうもありがとうございます。
>>980 を踏んだ人は新スレを建てて下さい
次スレよろしく
めちゃくちゃ初歩的な話で恐縮ですが…
Visual Studio 2019でWPFアプリを作ってみようとして最初の最初でつまづきました
参考にしたURLは↓
C# で WPF を使った Hello World アプリ - Visual Studio | Microsoft Docs
https://docs.microsoft.com/ja-jp/visualstudio/get-started/csharp/tutorial-wpf?view=vs-2019 1.新プロジェクトを作成(WPF App(.NET Core))
2.ツールボックス > コモンWPFコントロールからTextBlockをデザインサーフェイス上に配置
3.配置したTextBlockを削除
4.再度、ツールボックスからTextBlockを配置
5.このスコープで重複する名前 'textBlock' を登録することはできません。 と言われエラーになる
コントロールの名称を変更すれば良いのだとは思いますが、
表面上は1つ目のコントロールなのにtextBlock2のような名前に変更しなければならないのは気持ちが悪いです
そもそも先に配置したコントロールを削除したのに重複エラーと言われてしまうのがよく解りません
一旦配置してしまうと、削除してもどこかにデータが残ってしまうのでしょうか?
XAMLを見て必要なら手で直せとしか WPFのデザイナは貧弱であり、基本的にはデザイナは補助と割り切って手でXAMLを弄る必要があるし、それが認められている WPFは既にメンテナンスモードに入っており、今後改善される見込みもない あとWinFormsと異なりWPFではどうしても必要な場合を除きコントロールのNameは指定しないのが基本
>>985 おっしゃっている"手で直す"とは、どこのことでしょうか?
例として、
1.TextBlockをデザイナに追加
2.TextBlockタグのx:Nameを"textBlock5"に変更
3.TextBlockを削除(マークアップ側のTextBlockタグも消える)
4.再度TextBlockをデザイナに追加(マークアップ側にTextBlockタグが追加される)
5.TextBlockタグのx:Nameを"textBlock5"に変更
6.重複エラー
このようになるのですが、やはり textBlock5 がどこに残っているのか見つけられません
現在のプロジェクトを対象に"textBlock5"を検索してみましたが見つかりませんでした
プロジェクト作成時はxamlが↓のようになっており
<Window x:Class="HelloWPFApp.MainWindow"
中略
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
コントロールを追加するとGridタグ内にタグが追加されます↓
<Grid>
<TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="159,236,0,0" Text="TextBlock" TextWrapping="Wrap" VerticalAlignment="Top"/>
</Grid>
参考URLのマークアップでは x:Name="textBlock" が記述されていなかったため、その部分を削除したところエラーは消えました
>コントロールのNameは指定しないのが基本
というのは、ここのx:Nameのことでしょうか?
ただ、上記の通り重複している名前がどこに残っているのか解らないため
根本的な解決になっていません
xaml は xml(テキスト)ファイルだから、テキストエディタで開いてその名前で検索してみれば見つかるんじゃないの。 見つけたら余計な設定があるはずなので、それを読み取って自力で削除すれば。 ってことでは。
>>987 986の書き方では良くなかったでしょうか
xamlファイルの中身は
<Window x:Class="HelloWPFApp.MainWindow"
中略
Title="MainWindow" Height="450" Width="800">
<Grid>
</Grid>
</Window>
となっていて、コントロールを追加するとGridタグ内にタグが追加されます↓
<Grid>
<TextBlock x:Name="textBlock" HorizontalAlignment="Left" Margin="159,236,0,0" Text="TextBlock" TextWrapping="Wrap" VerticalAlignment="Top"/>
</Grid>
コントロールを削除すると、TextBlockタグも消えます
コントロールの追加/削除で変更があるのはこの行だけです
その後、現在のプロジェクトを対象としてx:Nameに指定してあった値を検索しても見つからなかったんです
xamlファイルをテキストエディタで開き直しても中身は同じです
>>986 XamlデザイナではC#エディタと違ってどこで重複してるのかまでは教えてくれないね確か
でもエラー箇所は下線が付くはずだからそれで見つけられるはず
x:Name=""やName=""は名指しでのアクセスが必要にならない限りは指定しないのが普通
そのコントロールでのイベントからのアクセスなら、例えば<Button Click="buttonClick" />なら下記のようにsenderをキャストすることによってアクセス出来るので、Name属性はそうそう必要にならないはず
private void buttonClick(object sender, RoutedEventArgs e)
{
var button = (Button)sender;
}
「x:Name="" は基本的には不要」という話は解りました 何度も書いていますが、デザイナにコントロールを配置した時点で自動生成されるコードにx:Nameが存在しているのであって 私が追記したものではありません それはそれとして、重複エラーになってしまうことの根本的な解決法が知りたいのです
自己解決しました 恐らくデザイナに追加した時点でメモリにロードされ コードを削除してもメモリ上にデータが残っているので重複とされてしまうようです 一旦xamlファイルを閉じ、開き直してからコントロールを追加するとエラーになりませんでした
.VSでのnet coreのWPF対応が全然ダメダメなのに >新しい開発には .NET Core をお勧めします。 と書いちゃうMSはダメだろ
.net coreのWPF自体が未完成品レベルなのに何で使うのかな
>>992-993 既存の開発終えるならそう書くしかなかろう
そんでもってあなたが入門者にMSがそう書いていたら使うでしょう
そもそも既存のWPFが完成品なのかと言われると・・・
立場上、忖度しないといけないから行間読んでくれってことでしょ。
今のレベルの.net coreのWPFは趣味レベルならいいけど 商売に使うレベルの物じゃない
それを言ったらWPF自体が… だいたい、既存のWPFアプリケーションをSCDで塩漬けにすることでMSや開発者がメンテから解放されるというのが.NET Core移植の目的なわけで、 そもそも新規に使うもんじゃないんだよ デザイナなんか本来要らないの
Windows.FormsのDataGridViewで2カラムのみの状態で、カラム幅をちょうど半分ずつにするには どうすればよいでしょうか?
このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 83日 13時間 18分 29秒
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/ ▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
read.cgi ver 07.7.23 2024/12/25 Walang Kapalit ★ | Donguri System Team 5ちゃんねる
lud20250331031245caこのスレへの固定リンク: http://5chb.net/r/tech/1570446977/ ヒント: 5chスレのurlに http ://xxxx.5chb .net/xxxx のようにb を入れるだけでここでスレ保存、閲覧できます。 TOPへ TOPへ
全掲示板一覧 この掲示板へ 人気スレ |
Youtube 動画
>50
>100
>200
>300
>500
>1000枚
新着画像 ↓「ふらっと C#,C♯,C#(初心者用) Part145 ->画像>6枚 」 を見た人も見ています:・ふらっと C#,C♯,C#(初心者用) Part134 ・ふらっと C#,C♯,C#(初心者用) Part146 ・ふらっと C#,C♯,C#(初心者用) Part144 ・ふらっと C#,C♯,C#(初心者用) Part142 ・ふらっと C#,C♯,C#(初心者用) Part160 ・ふらっと C#,C♯,C#(議論用) ・【初心者用】マイニング情報交換スレ9 c2ch.net ・俺、パチ初心者用質問スレ9本目 ・くだすれPython(超初心者用) その39 ・【初心者用】マイニング情報交換スレ18 ・【初心者用】マイニング情報交換スレ39 ・【初心者用】マイニング情報交換スレ43 ・【第五人格】IdentityV 初心者用スレ 15 ・FX初心者スレ Part135 ・MTB初心者質問スレ part105 ・3ds Max初心者質問スレ Part15 ・【PSO2】初心者用PSO2攻略wikiを作りました ・【LoL】League of Legends 初心者スレ Part345 ・くだすれDelphi(超初心者用)その58【Embarcadero】 ・幻獣契約クリプトラクト 初心者&質問スレ part15 ・【初心者用】パズル&ドラゴンズ【パズドラ】★118 ・【プロスピ】プロ野球スピリッツA初心者スレ part15 ・【MHW】モンスターハンターワールド 初心者スレpart5 ・【ドラガリ】ドラガリアロスト 初心者スレ part 5 【リセマラ相談】 ・【プリコネ】プリンセスコネクト! Re:Dive初心者・中級者スレpart205 ・【プリコネ】プリンセスコネクト! Re:Dive初心者・中級者スレpart225 ・【プリコネ】プリンセスコネクト! Re:Dive初心者・中級者スレ Part125 ・FX初心者スレ Part56 ・FX初心者スレ Part128 ・FX初心者スレ Part109 ・FX初心者質問スレPart105 ・FX初心者スレ Part139 ・FX初心者スレ Part112 ・FX初心者スレ Part104 ・FX初心者スレ Part138 ・へらぶな釣り~初心者の質問Part2 ・【FF14】初心者の館 Part333 ・【FF14】初心者の館 Part369 ・【FF14】初心者の館 Part329 ・糖尿病初心者質問スレpart50 ・【FF14】初心者の館 Part380 ・ロード初心者質問スレ part425 ・ロード初心者質問スレ part436 ・SONAR 初心者質問スレ Part17 ・■西洋占星術☆初心者さん■part18 ・初心者イラスト練習日記part15 ・【BMX】BMX初心者集え!Part49 ・バジリスク絆初心者質問スレpart19 ・バジリスク絆初心者質問スレPart32 ・クロスバイク初心者質問スレ part17 ・Twitter 初心者&質問スレ Part.39 ・【小説家になろう】初心者作者の集いpart135 ・【初心者】スレを立てる前にココで質問を【Part28】 ・【小説家になろう】初心者作者の集いpart.76 ・【小説家になろう】初心者作者の集いpart.51 ・【小説家になろう】初心者作者の集いpart.28 ・【OCG】初心者・復帰組交流スレ Part27 ・【OCG】初心者・復帰組交流スレ Part24 ・youtube初心者スレ収益化 跳躍編part25 ・クロスバイク初心者質問スレ part10000 ・ウクレレ初心者集まれ!! Part18 (ID有) ・【MTG】MTG初心者交流スレpart75【始めよう】 ・セキュリティ初心者質問スレッド Part138 ・【MTG】MTG初心者交流スレpart78【始めよう】 ・パソコン初心者総合質問スレッド Part2059 ・Kawasaki Ninja250 初心者スレ Part.002
18:53:26 up 96 days, 19:52, 0 users, load average: 13.13, 11.09, 9.02
in 2.7100100517273 sec
@2.7100100517273@0b7 on 072307