ふらっと C#,C♯,C#(初心者用) Part135
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。 他のスレッドでは書き込めないような低レベルな質問、 質問者自身なんだか意味がよく分からない質問、 ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。 内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。 なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。 ■前スレ ふらっと C#,C♯,C#(初心者用) Part134 http://mevius.5ch.net/test/read.cgi/tech/1511951038/ ■関連スレ C#, C♯, C#相談室 Part95 http://mevius.5ch.net/test/read.cgi/tech/1508180530/ C#, C♯, C#相談室 Part93 https://mevius.5ch.net/test/read.cgi/tech/1492818720/ ■コードを貼る場合は↓を使いましょう。 http://ideone.com/ https://dotnetfiddle.net/ ■情報源 https://msdn.microsoft.com/ja-jp/library/gg145045.aspx https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index https://msdn.microsoft.com/en-us/library/gg145045.aspx http://referencesource.microsoft.com/ VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured C#でもできる partionはないが多分GroupByで代用できる じゃあGroupBy使って byte[]buf = 1,2,3,4,5、ETX,7,8,9 をETXの前後で分解してみて。 でも分解する場合には他に適当な方法がないのでは? GroupByとIndexを併用すれば なんとかならないか? 明らかにそんなやり方よりTakeWhile, SkipWhileを使うやり方のほうが真っ当 >明らかにそんなやり方よりTakeWhile, SkipWhileを使うやり方のほうが真っ当 不味いんじゃないだろうか? 要するにループを頭から2回まわすことになるだろ。 Ax= buf.TakeWhile(〜) Bx= buf.SkipWHile(~) それならForeachの方がいいとおもう。 AX= ETXを見つけるまでこっちに入れる。 BX=ETXを見つけた以後はこっちに入れる。 効率が問題になるほど大規模なリストなら原始的な書き方をする。 そうでないならLinqでいい linqがボトルネックにならないならlinqでいいよな。 linqがボトルネックになる場合ってそもそもC#でやっちゃいけないでしょ ZDDアルゴリズムを実装してくれればLINQ使うよ >>692 そういうの、差集合って言うんじゃない? >>718 いいね!いいね! そのヒント。 君が一番頭いい。 ただ、あるインデックスの前後で二分するだけならたぶん無駄に非効率なんだろうけどね scores = %w[1 2 3 4 5 ETX 7 8 9] numbers = scores.each_with_object({}) do | num, h | # 配列の初期化 h[:before] = [] unless h[:before] h[:after] = [] unless h[:after] if h[:ETX] h[:after].push num else if num == "ETX" h[:ETX] = true else h[:before].push num end end end p numbers {:before=>["1", "2", "3", "4", "5"], :after=>["7", "8", "9"], :ETX=>true} Ruby の、each_with_index メソッドは、引数に蓄積器を指定して、繰り返し処理する。 空のハッシュ { }に、結果を蓄積していく。 "ETX"があったかどうかの状態を記憶して、処理を分岐する >>723 修正 >Ruby の、each_with_index メソッドは、引数に蓄積器を指定して、繰り返し処理する each_with_index ではなく、each_with_object var temp = buf .Select(x => new { value = x, flag = x < etx }) .GroupBy(x => x.flag, x => x.value) .Select(x => x.AsEnumerable()) .ToArray(); var ax = temp.First(); var bx = temp.Last(); flag = x < etx これってETX以前はTrueになる? たぶんそういう意図だろうけど xはindexだろけど、etxと比較しても駄目って思うが、、、 linqなんてクソ機能を使うと移植が大変になるわけだが イテレーター書くだけだから逆に移植しやすくなる 抽象化レイヤーがないと全てのループ処理について移植できるかどうか 移植するにはどうすればいいか 例外ケースはないかなど悩まなくてはならない >>734 は?普通はそんなことすらやらなくてよくね? >>735 linqを使わないで移植すると移植しなきゃならないコードが一気に増える linqを使っていればlinqを移植するだけでほとんど終わり 簡単だね 日曜大工プログラマーなんだけど、実際Linq使わないってなるとプロの方はどういうことを基本としてるの? プロの方々なら当然Linqも理解して手段の一つとして持ってると思うけど あえてそれは使わないってなると、同じこと実現するのに何が基本となるのかまじめに教えてください 周りにはlinq使うなよと吹聴しつつ自分は使うというのが最高に決まっとる LINQなんて銘打たれてても只のパターンだからねぇ デリゲートがインライン展開されるならまだしも switchまみれのIEnumerator<T>とかは草生える どうせコントロール追加もAddよりAddRangeの方が良いし 概ねArrayやList<T>のメソッドで済む事が多いな あと拡張メソッド多すぎでIntelliSenseの邪魔、フィルタが面倒 効率はすでに言った通りだからともかくとして、このスレのlinqの質問のほとんどはarrayやlistのメソッドでは事足りないだろう LINQ使わずに同等の処理をしたいならそれこそReference Source参照で良いんじゃね 個人的にはyieldもブロックスコープで最適化したくなる妙な実装に思えるけど LINQとか表記は割りとどうでも良いからユニットテストがきちんと書けるソースコードにして欲しいと、200行超えの他人のクソメソッドをメンテしてて思った リファクタリング楽しいです(^q^) Span実験してみたい。しかしSystem.Memoryインストールに失敗する。何でだろう? 素人ながらに四苦八苦しながら小規模の業務アプリを作っているのですが Program.csに、アプリケーションに保持させておきたい情報をまとめた自作クラスを staticで保持させておいて、全フォーム通してそれを読み出せるのかと考えたのですが 愚行でしょうか? >>749 なんの問題があるの? Program.csでなくてもいいし発想そのものはCとかのヘッダファイルとかと同じだよね >>749 本当にその必要があるならその方法でグローバルな情報を持ってOKだと思う。 前に同じ質問で「そんなものコンストラクタの引数で渡せ」と書いてた人がいたが、 むしろそっちの方が不適切。 でも、本当にそれが必要なのかは再考した方がいいかもね。 グローバルなデータなんて普通はそんなにいらないよ >>750 だからそれを聞いてるんでしょw っていうかヘッダファイルって意味不明だよww >>749 どんな設定かによって答えが変わるので情報出して 汎用性考えるならインジェクションだけどまだ練度が足りないかな 質問よろしいでしょうか ある複数のパラメータを持ったクラスを他のクラスのメンバに代入すると、そのパラメータが変更されたら代入先のメンバも書き変わってしまいますよね? 一度代入した時点から勝手に書き変わられたくない場合、パラメータを持ったクラスがクローンを返すような実装をするのがいいんでしょうか。他に定石等あれば教えて頂きたいです みなさまご教授ありがとうございます グローバルを持つべきか再度よく検討の上やってみたいと思います >>752 自作クラスだと一手間いるのと、修正しやすさでProgram.csに置きたいなと ApplicationSettingsは自作クラスじゃなくてVSのきのうだよ >>753 端末のIPやらMacアドレスのほか、データベースへの接続文字列を実行中に随時切り替えて接続させてるのですが そのためのList<string>とかです あとはNotifyIconをおいて、アプリの動作状況によって各Form上からも通知アイコンの画像を変更させてます >>754 構造体とかイミュータブルオブジェクトとか >>754 (1) クローンを返す (2) イミュータブルな別の型(インターフェイス or コンポジション)として返す (3) 気にしない >>754 メンバに参照を保持るのは禁じ手 そのインスタンスが死んだらハングアップすんじゃん 必要であるたびにメソッドの引数から必要な分だけ必要な形で渡すのが真っ当なやり方 >>755 そのファイルにクラスおいた方が楽って感覚がわからないな 1クラス1ファイルが基本だし別のファイルおいた方が色々楽だと思うけど まさかないと思うけどpublicなインナークラスにするのはよくないから気をつけてね >>761 拠点毎のデータベースと、全拠点と端末を管理したり共通の設定情報を保持するデータベースとわけてるので 必要な情報に応じて動的につないでSQL文を実行させてます >>763 全体を管理するデータベースの情報を元に端末毎に動作する権限や機能を割り当てるようにしてるので 起動するフォームを異なります なので、初回フォームが起動する前に端末情報をProgram.csに保持させたいということと 異なる役割の端末(Form)からでも共通の設定値を利用したかったからです >まさかないと思うけどpublicなインナークラスにするのはよくないから気をつけてね この辺の理解がだめです・・・(書籍を読んで独学で一人でやってます) 外部クラスなりにProgram.csにおいたStaticな自作クラスにアクセスさせてはだめってことなのかと理解しましたが 具体的にどうだめなのかがさっぱりで・・・ Listで中にclassをaddしていって 中のclassが解放されて歯抜けになって状態でaddした場合 nullの配列にaddされるか 歯抜けになったのをソートして埋めることって出来ない? 自分で明示的にnull代入しない限りListが歯抜けになったりしないだろ Listで型をclassにしてaddしていって 格納したclassがいくつか解放されて歯抜けになった状態でaddしたときに 歯抜けになった配列を埋めるようにaddされるか 歯抜けになったのをソートして埋めることって出来ない? >>766 いくつかaddして listとは関係なく外部でclassを解放した場合 歯抜けになるでしょ その外部でclassを解放するって具体的に何のクラスのどのメソッドを呼んでいるんだい >>768 解放したいんじゃなくて 解放されて歯抜けになったとこにaddするか ソートして歯抜けを埋めたいんだって dipose呼んだらゾンビになるだけでそいつはそいつだぞ まあ、いいや 超常現象でnullになるとしよう Addに自動で隙間を埋めるような介護機能はない IndexOfでnullの場所を探すのみ >>764 何を言ってるのかよく分からないけど、 Program.csにProgramクラスとTestクラスを作るのと、Program.csにProgramクラスTest.csにTestクラスを作るのは同じ どっちでもいいけど普通は後者かな ただ、以下のようなインナークラスにはするなってこと static class Program{ ... public static class Test{} } >>778 よくわかってなくてすみません ただ、まさにインナークラスになる記述です 具体的に避けるべき理由を教えて頂けませんか? >>769 classがオブジェクト参照を意図するなら、Listが持っている時点でインスタンスは解放されない Dispose()はアンマネージリソースといった“メンバーの解放”でインスタンス自体を解放はできない GCは強参照されていないインスタンスしか解放しないので、明示的に代入しない限りnullに成りようがない ひょっとしてやりたいのはこういう事か?(※機械翻訳のようで日本語が不自由 https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/weak-references IDisposableに処分済みインターフェイスは無く、ObjectDisposedExceptionを投げるクラスは独自の内部フラグ >>779 関係ないクラスを一緒くたに管理しないほうがいいってこと マシン設定ならマシン設定 データベース設定ならデータベース設定 権限管理なら権限管理 アイコン管理ならアイコン管理 プログラムは1つ1つ関心ごとに分けて後で組み合わせるのが基本 設定項目も一緒くたにしないで個別に設定クラスを作る >>779 アクセス名が長くなるから外に出せば見栄えが良くなる。 public staticだから動作には関係ない ここで何でも聞いて気にするより動かしてみて確認したほうがいい >>779 Programのデフォルトの公開範囲がprivateだから って思ったんだけどクラスって省略されるとinternalなんだね じゃあ別にやってもいいかな ただ、各フォームから起動元であるprogramクラスにアクセスするのは違和感があるからインナークラスは推奨しない よく言われるグローバル変数にせず、フォームの起動時に引数で渡せばいいと同じレベルの話だから余り気にしなくていいかも >普通はVSのフォームデザインでプロパティからApplicationSettingにてPropertyBindingを行う これはどういう意味や? バインディングってのはデータソースがコロコロ変わる時に便利なだけだろ。何でグローバル変数みたいな 変わらんものに「普通は、、、、使う」なんて言いきれるんだ。 意味わからん。 グローバル変数(static変数)なんて難しすぎる機能は初心者には扱いきれないでしょう 普通にコンストラクタやメソッドに必要なものを渡していけば確実、安全、簡単だよ var loginForm = new LoginForm(); loginForm.ShowDialog(); var loginUser = loginForm.LoginUser; var loginService = new LoginService(); loginService.Login(loginUser); var systemInfo = SystemInfo.Read(); var databaseModule = new DatabaseModule(loginUser, systemInfo); var authModule = new AuthModule(databaseModule, loginUser, systemInfo); var domainService = new DomainService(databaseModule, authModule); var iconManager = new IconManager("url://to/icon/resource/base"); var formFactory = new FormFactory(databaseModule, authModule, domainService, iconManager, loginUser, systemInfo); Application.Run(formFactory.CreateMainForm()); loginService.Logout(loginUser); 設定値と処理を密にすると 設定値集Aと設定値集Bとか異なる設定で動かさなきゃいけないときにウザいよ それを消そうとするとグローバル変数は消えるけど 仕様でそういったもんが別にいいなら問題は起きない 環境変数みたいにインストール時に固定なんだよ的な >グローバル変数(static変数)なんて難しすぎる機能は初心者には扱いきれないでしょう 何を根拠に難し過ぎるというのか意味不明だ。 複雑だからか? どう複雑なんだ? 複雑なわけない。w 他に難しい理由があるのか? 誤動作するからか? するわけない。w ちゃんと理由を上げて説明してみろよ。 >>758-760 、>>762 ありがとうございます 参考になりました。頂いた内容で再検討してみます 入力可能なコンボボックスの値を取得したい。 ドロップダウンで選択した値を取得する事は出来た。 手入力した値を取得するのはどうすればいいのでしょうか? https://i.imgur.com/Xh6vU1X.jpg ググったら selecteditem.tostring()でやってるのが多いけどそれだとどうなの? >>791 こうですか? if (comboBox.SelectedItem != null) //cb = ((ComboBoxItem)comboBox.SelectedItem).Content.ToString(); cb = comboBox.SelectedItem.ToString(); else //comboBox.SelectedIndex = -1; cb = comboBox.Text } 値の前にこんな文字も取得してしまいす System.Windows.Controls.ComboBoxItem: if〜で選択した値は取得できてます。 else〜で手入力した値を取得したいのですがうまくいきません。 >>790 何が聞きたいのかもっと明確にしないと誰も答えようがないと思うw 説明が下手なら(たぶんそうだと思うがw)人に冗長だと思われることをいとわず くどくど馬鹿丁寧に書いて 編集可能コンボボックスを編集してSelectionChangedイベント発生するか? >>792 cb = comboBox.Text これだけで良くない? if elseで分岐させる意味よく分からない >>794 しないね。 >>790 KeyUpイベントでComboBoxのTextプロパティを読めば良い。 killfocus的なイベントで取得しねーとあれっしょ? >>795 そうすると、値を手入力したときに、選択した項目の値がおかしくなるんです >>797 そこら辺はケースバイケースかな。 >>798 WPFみたいだから、そのイベントは無いぞ。 >>798 これは駄目でした private void comboBox_TextChanged(object sender, TextChangedEventArgs e) { String cb = comboBox.Text; } そもそもコンボボックスでリストにない値を使うやり方がおかしいんですかね? <ComboBox x:Name="cb" IsEditable="True" TextBoxBase.TextChanged="cb_TextChanged" /> private void cb_TextChanged(object sender, TextChangedEventArgs e) { var text = cb.Text; } ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる