1 名前:デフォルトの名無しさん [2009/01/20(火) 21:47:33 ] このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。 ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、 勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。 >>980 を踏んだ人は新スレを建てて下さい。 >>980 が無理な場合、話し合って新スレを建てる人を決めて下さい。
82 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:26:36 ] >>79 privateはクラスプライベートであってインスタンスプライベートではないから
83 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:33:43 ] >>81 質問する手間でなぜぐぐらない・・
84 名前:79 mailto:sage [2009/01/23(金) 05:34:10 ] >>80 >>82 なるほど、クラスプライベートですか。お二方、どうもありがとうございました。
85 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:39:45 ] >>81 VSホスト・プロセス(*.vshost.exe)とは何か? ttp://www.atmarkit.co.jp/fdotnet/dotnettips/410vshost/vshost.html 難しいことは他の人にまかせる。 誰かレスよろ。
86 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 10:58:23 ] exe.configはアプリケーション設定のデフォルト設定だったかな
87 名前:デフォルトの名無しさん [2009/01/23(金) 10:59:06 ] public partial class ページ名: System.Web.UI.Page って何をやっているんですか?
88 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 11:05:01 ] class ページ名 … ページ名 という名前のクラスを宣言します public … クラスがアセンブリ外から参照できます partial … クラスの定義が複数のファイルにまたがっています : System.Web.UI.Page … クラスはSystem.Web.UI.Pageクラスを継承します
89 名前:デフォルトの名無しさん [2009/01/23(金) 11:12:19 ] ありがとうございます。おおぉ・・・クラスとかアセンブリとか定義、継承 全部わからない・・・;; 適当にぐぐったのを翻訳すると、 「ページ名という名前のデータと処理を宣言して、コンパイル済みのコード群外から参照でき、複数のファイルのデータと処理を扱い、System.Web.UI.Pageのデータと処理を使えるようにする」 ???????頭が壊れる。これがないと何ができなくなるのでしょう?
90 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 11:15:27 ] C#ではすべてのコードはクラス(というか型)の中に書かないといけないので クラス定義がないと何もできない
91 名前:デフォルトの名無しさん [2009/01/23(金) 11:21:03 ] そのページ処理すべて=クラス ということなんですかね? すみません、「クラス定義」すら理解できていません・・・
92 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 11:26:18 ] それくらいは理解できてないとC#は使えないので 入門サイトや入門書読んで勉強しましょう
93 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 12:02:03 ] Firefoxのオプションダイアログのようなもの(上部のボタンでウィンドウの中身を 切り替える形のもの)を作成したいのですが、 その実装方法がわからず悩んでいます。 MDIにして子フォームのFormBorderStyleをnoneに設定し 切り替える方法でやってみたところ、ちらつきが出てしまいダメでした。 Firefoxのオプションダイアログにかぎらず、ウィンドウがひとつで中の描画だけ 切り替えるようなアプリの実装方法には、MDIの他にどういったものがありますでしょうか? 長文ですみませんが、よろしくお願いいたします。
94 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 12:10:41 ] そんな長文でもないと思うよ ・TabControlを使う ・Panelを重ねて置いて、ボタンを押したら該当Panel.BringToFrontで最前面にもってくる とか
95 名前:デフォルトの名無しさん [2009/01/23(金) 12:11:30 ] public partial class ページ名: System.Web.UI.Page { なんらかの処理 } これがクラスで合ってますか?C#ではこれが必要だと。 publicは他のページでこのページの処理を使えるようにしている。 partialの意味がよくわからないのですが、1つのクラスを2つのファイルに分けると何かいいことあるのですか? あと、System.Web.UI.Pageってなんでしょう?ぐぐってもよくわからなかったのですが、そういう処理名ですか?
96 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 12:20:52 ] >publicは他のページでこのページの処理を使えるようにしている。 これは違う。クラスの前に付くpublicについては今は気にしなくてもいい。 クラスライブラリを作ったりするときに重要になる。 >1つのクラスを2つのファイルに分けると何かいいことあるのですか? VisualStudioのデザイナが自動生成したコードを分離できる。 >System.Web.UI.Pageってなんでしょう? あらかじめ用意されてるクラスの名前。継承元として指定してる。 こんなところでいちいち聞いててもキリないでしょ? まとめて勉強した方が早いよ
97 名前:デフォルトの名無しさん [2009/01/23(金) 12:42:20 ] ありがとうございます。キリがなくてもいまいち入門サイトとか本見ても理解できないもので・・・ partialを使う事によって「ページ名.aspx.designer.cs」が生成されるって事ですかね? System.Web.UI.PageはASP.NETが用意していて、それを基盤に動かしたいと。
98 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:17:34 ] >>97 partialを付けなくても「ページ名.aspx.designer.cs」は生成されるが、 その場合、「同じクラスが2つもあるぞゴルァ!!」と怒られてしまう。 partialを付けることで、二つのファイルに分かれたクラス定義を1つにまとめることが可能になる。 > 1つのクラスを2つのファイルに分けると何かいいことあるのですか コードジェネレータが生成するコードと、ユーザーが編集するコードを分けることで、 ユーザーが編集したコードがコードジェネレータに上書きされてしまう危険性が無くなるし、 ユーザーが編集するコードに余計なものが混じらないので、コードも見やすくなる。 ところで、本見ても理解できないって、どんな本を読んでるんだ?
99 名前:デフォルトの名無しさん [2009/01/23(金) 13:28:56 ] 知り合いの人が、「これからはC#の時代だから一番つぶしがきくのはC#だよ」 と言ってたのですが、同じ人が、「いつまでもWindowsの時代ではない。他の OSがたくさんでてくるから誰もWindowsなんて使わなくなる」とも言ってました。 これ矛盾してないですか? C#はWindows上でしかコンパイル(というの?作ること)できないできないですよね?
100 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:33:21 ] LinuxでもOK
101 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:33:52 ] 全く矛盾してません
102 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:34:02 ] (´・ω・`)しらんがな。次。
103 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:34:33 ] Monoってのがあることはあるからぐぐるといいよ 基本的には聞き流しておけばおk
104 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:42:17 ] >>101 もっと詳しく解説して >>102 知らないなら黙ってろばか
105 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:53:27 ] >103で十分だろ しかし > 「いつまでもWindowsの時代ではない。他のOSがたくさんでてくるから誰もWindowsなんて使わなくなる」 これはもう10年以上前から聞いてるような台詞だな
106 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:58:48 ] >>104 失せろゴミ
107 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 13:59:11 ] ごめんなさい。 103さんのでよく分かりました。
108 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 14:00:19 ] >>105 安心しろ 新しいハードウェアが出なくなってみんなが同じ構成のマシンを使うようになったら 俺がパーフェクトなOSを作る
109 名前:デフォルトの名無しさん [2009/01/23(金) 14:24:47 ] >>98 ありがとう 作って覚えるVisual C#2005exples edition入門だと クラス…共通の目的を持ったデータと処理を集めたもの public…外部に公開する。他のクラスから呼び出すことができる System.Web.UI.Page…本にないのでぐぐってもよくわからず partial…1つのクラスを2つのファイルで分けて管理できるようにする宣言 ハァ!?!?って感じですた。
110 名前:デフォルトの名無しさん [2009/01/23(金) 14:30:56 ] ちなみに猫でもわかるC#プログラミングだと 「クラスとは、オブジェクトの性質や動作を規定するDNAです。」 「DNAの遺伝情報をもとに生命が形成され、生命は活発に活動することができます。この、実際の生物がオブジェクトに担当します。」 「つまり暮らすを具体化して、物理的な実態となったものがオブジェクトです」 はあ?死ねよって感じでしたね・・・なにいってんだこれ
111 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 14:38:21 ] 自分が馬鹿だって全世界に向けて叫ばないでいいから
112 名前:デフォルトの名無しさん [2009/01/23(金) 14:49:02 ] >>110 そんな感じの説明って多いよな。 人とか動物とか例えている・・・。実際、人とか動物とかプログラムに関係ないのにな。
113 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 14:57:03 ] >>109 ハァ!?!?と思ったら本屋に行くといい。 ハァ!?と思った部分の解説を見比べることで 良い本と悪い本の見分けがつくよ。 全ての本でハァ!?と思うなら・・・ご愁傷様と言うしかないな。
114 名前:デフォルトの名無しさん [2009/01/23(金) 15:15:50 ] 変数宣言で Aaa aaa = new Aaa(Global.WebConfig); のGlobal.WebConfigってなんですか? ()の中が何もないのは、aaaの箱を作って使えるようにしてるってことだと思うのですが
115 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 15:20:26 ] こっちが聞きたいけどおそらくこういうこと WebApplication webApp = new WebApplication(設定ファイル)
116 名前:デフォルトの名無しさん [2009/01/23(金) 15:27:02 ] Aaa = クラス aaa = インスタンス変数 Global.WebConfig = 何らかの値 aaaというオブジェクト(インスタンス変数)を作る際にGlobal.WebConfigの値で初期化しているもの。 インスタンスの生成時にコンストラクタが呼び出されるため、そのコンストラクタの引数として渡す。 日本語でわかりやすく説明すると、 赤色で軽自動車を生成するには、こんな感じ。 自動車 自家用車 = new 自動車(赤色,軽自動車); そんなことよりaaaとかいう名称は、つけてはいけない。 今だけではなく、あとからデバッグする時に何これ?になる。
117 名前:みんなどっちの書き方が好き? mailto:sage [2009/01/23(金) 15:35:42 ] private static bool TryGetAttributeValue(HtmlNode node, string xpath, string attrString, out string value){ value = default(string); if(node == null) return false; HtmlNode aNode = node.SelectSingleNode(xpath); if(aNode == null) return false; HtmlAttribute attribute = aNode.Attributes[attrString]; if(attribute == null) return false; value = attribute.Value; return true; } private static bool TryGetAttributeValue(HtmlNode node, string xpath, string attrString, out string value){ value = default(string); if(node == null) return false; HtmlNode aNode = node.SelectSingleNode(xpath); if(aNode != null){ HtmlAttribute attribute = aNode.Attributes[attrString]; if(attribute != null){ value = attribute.Value; return true; } } return false; }
118 名前:デフォルトの名無しさん [2009/01/23(金) 15:41:25 ] >>117 インデントがされていないのでどっちも嫌。 上のほうが改行がされてて見やすい。 if(aNode == null) return false; という書き方は、どうも嫌なので… if(aNode == null){ return false; } と書いてる・・・。
119 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 15:43:13 ] >>118 自分は if(〜){ } でなれた頃にその構文知ったから ほとんど↑
120 名前:デフォルトの名無しさん [2009/01/23(金) 15:44:12 ] >>115-116 なるほどうありがとう
121 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 15:46:44 ] 1行でかけるときは { }なしにするが、 たとえ1命令でも2行にまたがるときは{ }をつけることにしてる。
122 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 15:50:42 ] 取り敢えずネストはできる限り深くしない
123 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 15:52:58 ] ループも条件もネストは一回までと決めてる あとはswitch使う
124 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 16:00:14 ] 一回まではやりすぎ
125 名前:117 mailto:sage [2009/01/23(金) 16:39:21 ] ネストが浅くなるので上のほうが好まれるのかしら? まあ{つけるかとか{の位置とかは別の話として
126 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 16:41:47 ] ネストの深さとはずれるけど 「出口は一つであるべき」とか言って returnを複数書くのを嫌ったりする人もいるね
127 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 16:49:22 ] foreachで使う列挙体の項目をfoeach内でDisposeしたら即刻エラーになるので 該当項目をすべてDisposeするといった便利な使い方が出来ないのは言語的なバグですか?
128 名前:デフォルトの名無しさん [2009/01/23(金) 16:49:35 ] どうも ブロックは、{ } で囲むという癖がついてる。
129 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:00:05 ] ネスト一回まではさすがに厳しいかもしれないけど どんどんだらしなくなる性格だし後から読むとき楽なので、あえて決め事してる コード量増えることもあるのはご愛敬
130 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:08:28 ] >>127 列挙体って何のこと。俺様用語は止めてくれる? Disposeすることは例外発生の原因じゃないよ どうせコントロールコレクションから要素をDisposeしようとしたんでしょ。 DisposeするとコレクションからRemoveされる実装もあるから。 while( collection.Items.Count > 0 ){ collection.Items[0].Dispose(); } みたいにしたらどう
131 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:08:38 ] >>127 >列挙体 なのか?用語間違ってないか?
132 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:12:25 ] >言語的なバグですか? 自分の無能は棚上げですか?
133 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:13:28 ] ずいぶん厳しいインターネッツですねw 察してやれよw
134 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:15:42 ] >>132->>133 性格に難あり どういう環境で育ったんですか?
135 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:21:35 ] >>134 アンカー間違えてんじゃねえよksg
136 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:29:00 ] >>135 性格に難あり どういう環境で育ったんですか?
137 名前:デフォルトの名無しさん [2009/01/23(金) 17:44:43 ] >>127 バグがあるのは、おまえだ。
138 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 19:56:22 ] 脳にバグ持ってる人は大変だねぇ
139 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 21:20:09 ] いやバグだな 0 1 2Dispose 3 4Dispose 5 C#ではこういったことが出来ない
140 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 21:42:09 ] >>139 分かるように実行可能なソースをアップしてくれんか
141 名前:デフォルトの名無しさん [2009/01/23(金) 22:02:00 ] C#でOS作ったんだけど、フレームワークインストールして無いと動かないんですよね? どうしたらいいっすか?
142 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 22:03:46 ] C#という言語自体は.NET Frameworkとは無関係です 自分でネイティブコンパイラ作るなりCLI実装しちゃうなりすればおk
143 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 22:05:59 ] ネイティブで C# が動く、って OS があったな・・・
144 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 22:07:39 ] ネイティブでC#が動くというよりCLIを組み込んだOSだったような
145 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 22:12:18 ] それWindowsじゃん
146 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 22:39:52 ] singularity
147 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 22:41:03 ] Type.GetType(string)ではなくてType.GetType(class)って書けないのかな? ""で括ると候補でないし
148 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 22:41:40 ] typeof(型名)
149 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 23:06:04 ] >>148 ありがとうございます
150 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 23:07:46 ] >>141-145 ワラタ
151 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 03:43:08 ] NumericUpDownコントロールのMinimumを1に設定してもフォーム起動時には0になってしまいますが何故だろう
152 名前:デフォルトの名無しさん [2009/01/24(土) 05:28:05 ] C#でのExcel操作(自動化)について質問があります。 C#からExcelのセルの幅や高さを変更したり、新しいシートを追加して そのシートの名前を変更、新しく追加したシートを操作するにはどうすれば良いのでしょうか?
153 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 09:35:53 ] "C#でExcel"でぐぐった上の発言であろうな?
154 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 10:52:01 ] >>153 色々やってシートの追加と名前の変更はできたのですが、Sheet1しか名前の変更ができない上に セルの幅、高さの変更、追加したシートの操作ができません。 Sheet1のみの操作と名前の変更だけしかできないです。
155 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:12:33 ] VBA ではできてんの?
156 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:17:19 ] VBAは使った事がありません。
157 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:19:04 ] まず VBA でできることを確認してから、C# に書き直した方が早いよ。
158 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:26:49 ] >>157 ttp://www.officepro.jp/excelvba/sheet_edit/index1.html 上記ページを読んでいるのですが、このVBAをどのように書き換えたら C#で使えるようになるのでしょうか?
159 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:29:18 ] 名前付き引数を使わずにやってみたら?
160 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 11:37:04 ] >>159 すいません。まったく意味が分かりません… コードでこのように書き換えたら良いという例を挙げてはいただけないでしょうか?
161 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 12:15:19 ] 159氏じゃないが、エクセルの起動法は分かるよね? とりあえず、シート2の名前を変更して、それらのセルを操作する例 シート1は既に起動している物として話を進める 自分で設定したシートコレクション名を以下のコードに置き換えて試してみて //シート2を追加 Excel.Worksheet sheet2 = (Excel.Worksheet)シートコレクション名.Add(before, after, 1, Excel.XlSheetType.xlWorksheet); //シート1とシート2の名前を設定 シートコレクション名.Name = "シート1の名前です"; sheet2.Name = "シート2の名前です"; //セルに文字を入力自動化 シートコレクション名.Cells[1, 1] = "シート1のセルA1"; sheet2.Cells[1, 1] = "シート2のセルA1";
162 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 12:15:38 ] 質問です。C#でバイト配列から部分バイト配列を探すには どうしたらいいでしょうか。 Cのstrstr()や、Pythonのbuf.index(sub_buf)のような処理です。
163 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 14:46:09 ] >>162 バカ正直に検索する作業に戻るんだ。たとえばこんな風に。 private static int FindSubArray<T>(T[] array, T[] subArray) where T : IComparable { int match = 0; for (int i = 0; i < array.Length; ++i) { if (array[ i ].CompareTo(subArray[ match ]) == 0) { match++; if (match == subArray.Length) { return i - match + 1; } } else { match = 0; } } return -1; }
164 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 14:48:43 ] IComparable使ったらボックス化が発生しちゃうからジェネリックにした意味がないぞ IComparable<T>にするんだ
165 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 14:51:27 ] というか大小比較する必要はないんだからIEquatable<T>のほうがいいな それもwhereで指定すると単純に参照比較で探したいときなんかに困るから EqualityComparer<T>.Default使えば
166 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 14:53:17 ] 対象がbyte[]と決まっているなら、文字列に変換しておいてIndexOf()という手もある。 string s1 = Encoding.ASCII.GetString(buf); string s2 = Encoding.ASCII.GetString(sub_buf); int p = s1.IndexOf(s2, StringComparison.Ordinal);
167 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 15:05:43 ] 工エエェェ(´д`)ェェエエ工
168 名前:162 mailto:sage [2009/01/24(土) 15:38:37 ] >>163 関数丸ごと書いてもらえるとは・・・感謝です。 バカ正直に検索する作業に戻ります。 >>164-165 すいません、マニュアルを読んでみましたが 不勉強でまともなレスが付けられません。 メモしたので後日振り返りたいと思います。 >>166 そういう方法もあるんですね。 byte[]からStringの変換にEncodingを使うとは 思っていなかったので参考になりました。
169 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 15:41:29 ] >>166 byte[]の途中に0が入ってたら?
170 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 15:47:33 ] >>163 に>>165 を適用するとこう >>163 よりは桁違いに速いはず private static int FindSubArray<T>(T[] array, T[] subArray) { EqualityComparer<T> comparer = EqualityComparer<T>.Default; int match = 0; for (int i = 0; i < array.Length; ++i) { if (comparer.Equals(array[ i ], subArray[ match ])) { //あとは同じ
171 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 15:52:15 ] >>169 無問題
172 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 16:30:20 ] だな。今回の場合、むしろASCIIEncoingが0x80-0xffのデータを受け付けないほうが問題だ。 無理矢理でもnew string(a.Cast<char>().ToArray())とか、 a.Aggregate(new StringBuilder(a.Length), (sb, c) => sb.Append((char)c)).ToString()とかで持っていくほうがいい。
173 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 16:35:14 ] BitConverter.ToString
174 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 21:45:07 ] >>172 受け付けるよ。
175 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:28:03 ] \u003fに置き換えられるのをもって受け付けるといわれても…
176 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:28:04 ] Dictionary<AAA, BBB>のコレクション中から、BBBの条件によって要素を削除したいのですが foreachで列挙しながらRemoveすると、列挙子が無効になって例外が発生します。 あらかじめ削除する要素を全部列挙してから、その後にRemoveするしかないんでしょうか?
177 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:39:52 ] 一旦Keysを配列にコピーするとか
178 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:40:34 ] >>176 それ以上にスマートな方法は思いつかないなあ。 List<AAA,BBB>に投射しておいてRemoveAll()とか、考えられなくもないけど。
179 名前:178 mailto:sage [2009/01/24(土) 22:41:06 ] 間違えた、List<KeyValuePair<AAA,BBB>>だ。
180 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:44:29 ] > あらかじめ削除する要素を全部列挙してから、その後にRemove を静的クラスに書いておけば拡張メソッドで呼び放題だよ!
181 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 22:56:48 ] foreachのin ○○の後に.ToArray()と書けばおk
182 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 23:02:46 ] >>180 こんな感じか? メモ帳で書いただけで検証してないけど。 public static void RemoveAllByValue<TKey, TValue>( this Dictionary<TKey, TValue> dictionary, Predicate<TValue> match) { List<TKey> keys = new List<TKey>(); foreach (TKey key in dictionary.Keys) { if (match(dictionary[key])) { keys.Add(key); } } foreach (TKey key in dictionary.Keys) { dictionary.Remove(key); } }