ふらっとC#,C♯,C#(初心者用) Part31at TECH
ふらっとC#,C♯,C#(初心者用) Part31 - 暇つぶし2ch175:デフォルトの名無しさん
08/10/01 21:26:15
>>169
charはクラスじゃねーよカス
処理速度も倍違う

>stringでも1文字だけ格納すれば実質的にcharと同じになると思うんですが。
ならねーよバカ

176:デフォルトの名無しさん
08/10/01 21:26:17
スクリプト言語だと文字列と文字を同一視するのもあるみたいだよ

177:デフォルトの名無しさん
08/10/01 21:28:02
格納してるブツがそもそも違うだろ
stringは参照位置だけどcharはユニコードだろ?

178:デフォルトの名無しさん
08/10/01 21:32:33
デュアルコアの時代に倍違うとかどうでもいいだろ

179:デフォルトの名無しさん
08/10/01 21:33:29
string だけあれば char がいらないって発想なら、
int[] だけあれば int もいらないな。

180:デフォルトの名無しさん
08/10/01 21:34:53
GCの負担にもなるから倍どころじゃないはず

stringって内部的にはやっぱりcharの配列なんだよ
fixed (char* p = str)でポインタ取れたりするw

181:デフォルトの名無しさん
08/10/01 21:36:59
ここまでstringbuilderなし

182:デフォルトの名無しさん
08/10/01 21:38:02
札束があれば札は要らないないってレベル

183:165
08/10/01 21:40:11
釣りでした(^^)v

184:デフォルトの名無しさん
08/10/01 21:40:49
>>182
それは何か変だ。
札は束にしても額が変わるだけだけど。
char と string は点と線くらい違う。次元がそもそも違うというか。

185:デフォルトの名無しさん
08/10/01 21:43:00
>>165
救済措置っつーか、C/C++やってて、文字型のない言語に移っても、べつになんにも困らんだろ。

186:デフォルトの名無しさん
08/10/01 21:43:23
string=文字列
char=文字

これはなんでこうなるの?

187:デフォルトの名無しさん
08/10/01 21:44:03
VBにも文字単体あるだろ

188:デフォルトの名無しさん
08/10/01 21:44:45
C#.NET でWindowsアプリを書くときに、メソッドをフォームのソース
(という言い方が正しいかどうか分かりませんが)に書くことも、
フォームではない別のクラスに書くこともできると思います。

ある画面内で完結する機能はフォームのソースに書くとか
なるべくフォームのソースには書かないようにするとか
方針はいくつか考えられますが、
C#.NET ではどうするのが主流なのでしょうか?

アドバイスよろしくお願いします。

ちなみに、Javaでコンソールアプリを書いたことはありますが
その程度の経験しかありません。

189:デフォルトの名無しさん
08/10/01 21:46:00
フォームをコンソールだと思えばおのずと窓口なはず

190:デフォルトの名無しさん
08/10/01 21:48:01
>>178
私も486DXで十分だと思っていた時がありました

191:デフォルトの名無しさん
08/10/01 21:51:45
>>188
フォームとはイベントドリブンを処理するわけで条件反射みたいなもん
フォームに直接関係しない機能や重複した機能は別途クラスを用意する

192:デフォルトの名無しさん
08/10/01 21:52:55
>>188
愚問だね。
OOPというかクラスを使ったプログラミングが分かればそんな疑問は持たない。

そんなウダウダ疑問を抱くのは一通り理解してからにすべきで、
物事の順序が違うんじゃないのかな?

193:デフォルトの名無しさん
08/10/01 21:54:12
>>175
え( ´・ω・)?

194:デフォルトの名無しさん
08/10/01 22:00:00
構造体です

195:デフォルトの名無しさん
08/10/01 22:00:17
>>188
主流といえるほど主流な方法はないんじゃないかな

196:デフォルトの名無しさん
08/10/01 22:01:04
フォームのボタンを押すことでクリップボードの文字列を取得する

①ボタンが押された
②FormクラスGUI-----処理するメソッドを呼び出し------>クリップボードを処理するクラス.GetText()
③FormクラスGUI<-----------文字列を返す-----------クリップボードを処理するクラス
④FormクラスGUI--------- 文字列を送る------------->テキストボックスに表示//Formクラス内で処理

クリップボードを処理するクラスを作ってしまえば、コンソールアプリにした場合も流用できる

197:デフォルトの名無しさん
08/10/01 22:13:39
窓口のお姉さんと、お姉さんが操作する端末みたいなもん

198:デフォルトの名無しさん
08/10/01 22:18:00
C#のフォームでMVCに挑戦するも、途中でめんどくさくなって結局イベントハンドラにロジック直書き。

199:デフォルトの名無しさん
08/10/01 22:22:52
DirectXならウィンドウとか単なる依り代

200:デフォルトの名無しさん
08/10/01 23:55:34
構造体の場合コンストラクタは1つだけしか無理ですか?

201:デフォルトの名無しさん
08/10/01 23:59:13
いいえ

202:デフォルトの名無しさん
08/10/02 00:00:21
と、思ったら1つも作れないのか・・・
データに値を入れるときが面倒だなぁ

203:デフォルトの名無しさん
08/10/02 00:03:46
引数なしのコンストラクタが作れないだけ
引数のあるコンストラクタはいくつでも作れる

204:デフォルトの名無しさん
08/10/02 00:03:51
>>155です
メインメソッドに突っ込むってどういう意味ですか?
VC#2008を立ち上げて
ファイル→新しいプロジェクトを開くと
Windowsフォーム、クラスライブラリー、WPFアプリケーション、WPFブラウザ、コンソール、空のプロジェクトとあります
どこを開いてどうすればよいですか?
>>155を動くように教えてください

205:188
08/10/02 00:06:02
レスをくれた皆さんありがとうございました。

フォームに直接絡む機能以外は別のクラスに書く、という感じのようですね。

206:デフォルトの名無しさん
08/10/02 00:09:02
>>204
ネタ?

コンソールでプロジェクトを立ち上げると
static void Main(string[] args)
{
}
というのが自動で書かれているからその間に実行させたいものを書く
static void Main(string[] args)
{
 Console.WriteLine("hoge");
}



207:デフォルトの名無しさん
08/10/02 00:09:50
>>155です
よくわからないけど
下記のようなエラーでました
エラー 1 プログラム 'C:\Documents and Settings\don\Local Settings\Application Data\Temporary Projects\Project1\obj\Debug\Project1.exe' は、エントリ ポイントに適切な静的 'Main' メソッドを含んでいません Project1


208:デフォルトの名無しさん
08/10/02 00:11:47
>>206さん
ありがと
今からやってみます
コンソールですね

209:デフォルトの名無しさん
08/10/02 00:13:06
>>203
引数は無理なのねーやっぱり

かといって、クラスで定義するといろいろ面倒だったり
例えばListViewのような構造をもった自作クラスを作った場合
listView1.items=listView2.items
なんてしてもsubitemsまではコピーされなかったり、
また、参照コピーになるから、これは参照しているだけだって意識しながら
やらないとどこかで値を変更されたりするし、かといって、privateにしたりすると
値をコピーしたい場合非常に面倒だし
だから、できるだけ構造体でやってるんだけど

みんなどうしてんのかな?構造体なんて数学的な関数以外使わない?

210:デフォルトの名無しさん
08/10/02 00:16:39
>>205
最初はフォームに全部書いちゃって、あとで必要になったときに
バラす、ってので十分だろ。

211:デフォルトの名無しさん
08/10/02 00:17:23
>>207
だって、Main メソッドがないじゃん。

212:デフォルトの名無しさん
08/10/02 00:22:02
>>155です
コンソールを開いて>>206さんに教えてもらった箇所に貼り付けました
デバッグしたところ黒色の画面が数秒間出て終わりました
エラー表示とかは無いです
これは成功しているのでしょうか?
下記のコードでは接続を確立しただけ?
それともリクエストしたけど
レスポンスを受け取れない?
どのような状態なのでしょうか?

static void Main(string[] args)
{
string url = "URLリンク(www.yahoo.co.jp)";
System.Net.WebClient wc = new System.Net.WebClient();
wc.Encoding = System.Text.Encoding.GetEncoding(51932);
string src = wc.DownloadString(url);
wc.Dispose();
}

213:デフォルトの名無しさん
08/10/02 00:24:24
>>212
だからお前は概念から勉強しろと言ってるだろカス

214:デフォルトの名無しさん
08/10/02 00:24:49
>>212
ブレイクポイントでもはって確認するか、src をコンソールに出力すれ

215:デフォルトの名無しさん
08/10/02 00:25:59
>>209
正確な理由は中の人しか知らないけれど、普通に考えると引数なしの
コンストラクタを用意できると配列確保したとき要素数だけコンストラクタ
呼ばないといけなくなるから、こうなっていると思われる。
・・・というかむしろ 3.0 以降の初期化はイニシャライザのほうが推奨かな
という気がする

後その質問に関して言えば「非常に面倒」というほどでもないとしか。
気になるほどでかいデータセットになるとバインディング(+同期機構利用)前提
で考えるわけだし

216:デフォルトの名無しさん
08/10/02 00:28:31
効率が重視されるときは構造体にはイニシャライザ使っちゃダメ
無駄なコピーが発生する

217:デフォルトの名無しさん
08/10/02 00:32:20
>>155です
何度もすいません
「C# src コンソールに出力」でググッたんですが
コンソールに出力されるって文字はいっぱい出てくるんですけど
コンソールへ出力の仕方わかりません
「srcをコンソールに出力」
↑これわかるかた教えてください

218:デフォルトの名無しさん
08/10/02 00:35:57
>>217
Console.WriteLine(src);

参考書でも買った方が早いよ。俺はもうレスしないから。

219:デフォルトの名無しさん
08/10/02 00:37:34
>>215
確かに構造体配列が問題なんだよねぇ。

.NETの規格上は構造体にも引数無しのコンストラクタが作れるんだけど、
配列確保のときには要素ごとにはコンストラクタが呼ばれない。
代わりにArray.Initializeメソッドを使うことになっている。
URLリンク(msdn.microsoft.com)

220:デフォルトの名無しさん
08/10/02 00:37:34
using namespace System::Diagnostics;

~略~

Debug::WriteLine(src);

221:デフォルトの名無しさん
08/10/02 00:43:48
>>220
>>1

222:デフォルトの名無しさん
08/10/02 00:44:43
違和感がするな

223:デフォルトの名無しさん
08/10/02 00:46:53
>>155です
下記のようにしてからデバッグするとエラーになりました手直しできる方お願いします
using System.Linq;
using System.Text;
// debugoncon.cs
using System;
using System.Diagnostics;
public class DebugOnConsole
{
static void Main()
{
Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
Debug.WriteLine("デバッグ・メッセージを出力");
}
}
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string url = "URLリンク(www.yahoo.co.jp)";
System.Net.WebClient wc = new System.Net.WebClient();
wc.Encoding = System.Text.Encoding.GetEncoding(51932);
string src = wc.DownloadString(url);
wc.Dispose();
}
}
}


224:デフォルトの名無しさん
08/10/02 00:49:56
>>217
1行命令文書く度に質問しているのかい?
ごくろうさま。死んでいいよ。

225:デフォルトの名無しさん
08/10/02 00:51:35
実在するサイトのアドレスを書くな!
サイトへの攻撃とみなして報告しておく

226:デフォルトの名無しさん
08/10/02 00:51:48
>>224
そだよ
粘着キモイぞ氏ね

227:デフォルトの名無しさん
08/10/02 00:52:17
回答したい奴がすればいい

228:デフォルトの名無しさん
08/10/02 00:53:35
>>225
実在するアドレス書いたら駄目だったのか
しらなんだ
これから気をつけるよ
あんまし細かいこと言ってたら神経性の病気になるよ
あなたも気をつけたほうがいいね

229:デフォルトの名無しさん
08/10/02 00:54:29
>>227
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

230:デフォルトの名無しさん
08/10/02 00:54:42
Mainが二個

231:デフォルトの名無しさん
08/10/02 00:56:10
>>229
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

232:デフォルトの名無しさん
08/10/02 00:56:30
>>230さん
それ>>155へのヒントですよね
メインってのを2個にすればいいんですか?
それとも現在2つあるので1つにすればいいですか?
何から何まですいません
よろしく^^

233:デフォルトの名無しさん
08/10/02 01:00:06
>>232
氏ね低学歴。お前には一生プログラム無理

234:デフォルトの名無しさん
08/10/02 01:00:32
書いてみるからちょっと待て

235:デフォルトの名無しさん
08/10/02 01:01:05
>>233
お前は>>231を100万回読んでから氏ねカス

236:デフォルトの名無しさん
08/10/02 01:01:55
>>235
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

237:デフォルトの名無しさん
08/10/02 01:02:59
あわわ、あわわわ

238:デフォルトの名無しさん
08/10/02 01:03:58
>>155さんへ

お前が低学歴なのはこのスレの住民のせいではない
八つ当たりもほどほどにしておけよハゲ
お前はまず概念理解しろ
それすらもできない低学歴は2度と来るなカス
悔しいのか?悔しいから荒らすのか?
もっとポジティブな思考ができないのかねぇこの池沼はw

239:デフォルトの名無しさん
08/10/02 01:05:01
ネットワークプログラミング相談室にいたやつだな
解決したんじゃなかったのか?

240:デフォルトの名無しさん
08/10/02 01:06:02
>>236
わかったよ
あんまし怒らなくていいだろ
仲良くしよう
これからも応援よろしく^^

241:デフォルトの名無しさん
08/10/02 01:11:26
>>238
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

242:デフォルトの名無しさん
08/10/02 01:14:34
C#の環境が今ないんだがこんな感じで動いた
てゆーかソース自体に問題は無いような…

using namespace System;
using namespace System::Diagnostics;
using namespace System::Net;
using namespace System::Text;

int main(array<System::String ^> ^args)
{
  String ^url = "URLリンク(www.yahoo.co.jp)";
  WebClient ^wc = gcnew WebClient();
  wc->Encoding = Encoding::UTF8;
  String ^src = wc->DownloadString(url);
  Console::WriteLine(src);
  delete wc;

  Console::WriteLine("エンターキーで終了。");
  Console::ReadLine();
return 0;
}

243:デフォルトの名無しさん
08/10/02 01:18:34
C# だとこんなん

using System;
using System.Net;
using System.Text;

class GetTest {
public static int Main(string[] args) {
WebClient ua = new WebClient();
ua.Encoding = Encoding.UTF8;
string text = ua.DownloadString("URLリンク(www.yahoo.co.jp)");
Console.WriteLine(text);
return 0;
}
}

サイトにアクセスする前に Encoding 設定するのが良くないね
DownloadString じゃ無理なのかな

244:デフォルトの名無しさん
08/10/02 01:22:20
>デバッグしたところ黒色の画面が数秒間出て終わりました
>エラー表示とかは無いです

コンソールが勝手に閉じるからだろ

245:デフォルトの名無しさん
08/10/02 01:27:56
>>242
>>243
お疲れのところ本当にありがとうございます
>>243さんのコードでエラーなくリクエスト送信は成功していることを確認できました
ありがとうございます^^

246:デフォルトの名無しさん
08/10/02 01:28:05
へッダから文字コード取れば?

247:デフォルトの名無しさん
08/10/02 01:28:28
失せろゴミ

248:デフォルトの名無しさん
08/10/02 01:33:42
>>246
GET するユーティリティの実装ってそうしてるのかな?
今回はとりあえずバイト列として読み込んでそのまま吐いて妥協

WebClient ua = new WebClient();
Stream stream = ua.OpenRead("URLリンク(www.yahoo.co.jp)");
StreamReader streamReader = new StreamReader(stream);
Console.WriteLine(streamReader.ReadToEnd());
stream.Close();
return 0;

249:デフォルトの名無しさん
08/10/02 01:35:35
>>246
応援ありがとう
ヘッダから文字列取得は今日のところはやめておくよ
ここの>>155に貼り付けたのと
リクエスト成功した>>243さんのコードとの違いを調べてみるよ
ありがと

250:デフォルトの名無しさん
08/10/02 01:45:37
>>249
2度とくるなカス

251:デフォルトの名無しさん
08/10/02 02:06:27
うっせーはげ

252:デフォルトの名無しさん
08/10/02 02:59:46
   class Program
   {
      static void Main(string[] args)
      {
         Test t = new Test();
         t.Str = new List<string>();
         t.Str.Add("dsf");
         t.Str = new List<string>();
         Console.WriteLine(t.Str.Count);
      }
   }

   class Test
   {
      public List<string> Str;
   }

問)この場合コンソールには何が表示されるでしょうか?

253:デフォルトの名無しさん
08/10/02 04:07:18
List<>が万能過ぎるんだけどあえて配列使う意味ってあるの?

254:デフォルトの名無しさん
08/10/02 04:24:17
配列の方が速いだろ

255:デフォルトの名無しさん
08/10/02 06:21:08
>>252
何かひねったのかと思いきや予想通り0なんだけど何が言いたいの…?

256:デフォルトの名無しさん
08/10/02 09:06:40
.NET 4.0って何が変わるんですか
URLリンク(msdn.microsoft.com)

257:デフォルトの名無しさん
08/10/02 09:18:07
>>256
それの日本語記事↓
URLリンク(itpro.nikkeibp.co.jp)

「詳細は,数カ月以内に発表する予定」だそうだ。

258:デフォルトの名無しさん
08/10/02 10:37:40
>>253
とりあえず複数渡したい・返したいときは配列が速い
List<>を可視メンバの戻り値や引数にしたらマイクロソフトのガイドライン違反!

259:デフォルトの名無しさん
08/10/02 11:11:51
Listは容量を増やす時にコピーが発生するし
最悪半分ぐらいの容量が使われてなかったりするし
気分的に嫌だから作業が終わったらすぐToArrayしちゃう

260:デフォルトの名無しさん
08/10/02 11:14:52
>>258
せんせー、Enumerable.ToList がガイドライン違反ですー

261:デフォルトの名無しさん
08/10/02 11:15:22
それはCollection<T>継承したの返してあとからいじれるようにしとけと
そういう意味合いだった気がするが

262:デフォルトの名無しさん
08/10/02 11:25:32
生のListを渡すってことは
自分の知らないところでListの中身が増えたり減ったりするのを許容するってことだろ
じゃあそのListを管理してるのは誰なのよという話になるだろ

263:デフォルトの名無しさん
08/10/02 11:35:26
>>260
同じの作ってFxCopで検査したら違反になるよ
ToListやToDictionaryはコンストラクタのヘルパみたいなもんなんだから
>>261の意味合いから考えれば問題ない

264:デフォルトの名無しさん
08/10/02 11:36:56
>>259
ToArrayにする作業のほうが時間がかかったりすることはないの?

>>258
可視メンバって、privateメソッドとか?

>>262
なるほど。それはありますね

追加などの作業が終わったら、配列に戻すのがいいのかな
でも、戻り値を配列にした場合、foreach内でそのメソッドを使用するとなると
AddRangeができないから、手間ですよね?

265:デフォルトの名無しさん
08/10/02 11:39:49
ガイドラインを問題にするときの可視メンバは
publicな型のpublicメンバとprotectedメンバ

266:デフォルトの名無しさん
08/10/02 11:46:56
むむ、XNAでContentPipeline作ってLoad<>でList<>返してたが、もしかしてまずいのか。

267:デフォルトの名無しさん
08/10/02 11:48:12
それこそ配列返せばいいじゃん

268:デフォルトの名無しさん
08/10/02 11:48:14
>>265
publicで使っちゃだめなのかー
確かにわけわからなくなるもんなー
ガイドライン天才だなー

269:デフォルトの名無しさん
08/10/02 11:59:57
>>266
Content.Loadってキャッシュでしょ?
弄る前提でList返すのはダメだろ
配列でも微妙だけど

270:デフォルトの名無しさん
08/10/02 12:10:27
>>269
いや中身読んだら終わりなんだけど、中が配列の配列だったからさらに配列にしたくなかっただけ。
まあいったん配列にしますわ。

271:デフォルトの名無しさん
08/10/02 12:21:10
ん?なんでList<>を返しちゃいけないのか詳しく

272:デフォルトの名無しさん
08/10/02 12:32:22
オーバーライドできないから
フィールドじゃなくてプロパティを使うのは後で実装変えられるようにするためだけど、それと同じ
URLリンク(msdn.microsoft.com)

273:デフォルトの名無しさん
08/10/02 12:33:01
>>271
List<>を返すということは元の値を直接操作してもいいよと言っているようなものだから
1人でプログラミングする分には覚えていればいいが、多分忘れる

274:デフォルトの名無しさん
08/10/02 12:50:20
C#てWindows専用?

275:デフォルトの名無しさん
08/10/02 12:58:11
配列で返すようにしたんだけど、foreachだと使えないんだけど
こういう場合どうすればいいんでしょうか?
あと、配列を初期化したい場合どうすればいいですか?

struct Point
{
  public int X;
  public int Y;
}


class Zahyou
{
  public void GetArray()
  {
    List<Point> pList=new List<Point>();
    .
    .
    return pList.ToArray();
  }
}

class Main()
{
  Point[] pArr;

  foreach()
  {
    pArr=GetArray();
  }
}

276:デフォルトの名無しさん
08/10/02 12:59:58
>>260
そいつは新しいListを作り出すメソッドだから問題なし。
内部のListの参照をそのまま見せるのがいけない。
ただしプロパティの場合は予防的コピーを返すことも非推奨となっている。


277:デフォルトの名無しさん
08/10/02 13:10:59
264とか275が何を言いたいのか良く分からない

278:275
08/10/02 13:19:15
Zahyouクラスで計算したPoint[]を
kitai内の座標を保存している配列にコピーしたいんだけど
やり方がわからないんです

foreach(Tekiki kitai in Guntai)
{
  kitai.PArray=Zahyou.GetArray();
}

↑だとエラーがでる

Tekikiのデータ構造を
Point[] PArray
ではなくて
List<Point> PList
にすれば簡単に追加できるんだけど
でも、publicでListを返したらだめなんですよね?
こういう場合どうすればいいの?

279:デフォルトの名無しさん
08/10/02 13:29:42
>>275
voidなのにreturnしてるとか、
foreachの中に何も書いてないとかは関係してないの?

280:デフォルトの名無しさん
08/10/02 13:30:17
エラーが出る(笑)

281:デフォルトの名無しさん
08/10/02 13:39:58
>>275
あとclass Main()ってのもおかしいな

282:275
08/10/02 13:46:33
>>279
>>281
すいません。要点だけわかればと思って他はさらっと書いたので
foreach内は実際はいろいろ処理してます。
List<>を返して、AddRangeで追加していたときは普通にいけましたが
配列を返すようにしたら、どうすればいいかよくわかりません

エラー内容
'kitai' は 'foreach 繰り返し変数' であるため、このメンバを変更できません。

283:デフォルトの名無しさん
08/10/02 13:48:14
どれをどこにAddRangeするのよ

284:275
08/10/02 13:57:52
変更点はList<>を返すところを配列を返すようにしただけです

struct Tekiki
{
 public string Name;
 public List<Point> pList;
}

class ShoriMain
{
 public void SetZahyou()
 {
  foreach(Tekiki kitai in Guntai)
  {
   kitai.pList.AddRange(ZahyouKeisan.GetZahyou());
  }
 }
}

static class ZahyouKeisan
{
 public static List<Point> GetZahyou()
 {
  List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList;
 }
}

こんな感じだとうまくいきます。
GetZahyouをList<>ではなく、配列で返す方法がわからないんです

285:デフォルトの名無しさん
08/10/02 14:00:56
kitai.AddRange(ZahyouKeisan.GetArray());

こんなんでいいだろ
AddRangeの中で内部のListのAddRangeを呼んでやればいい

286:デフォルトの名無しさん
08/10/02 14:07:26
C#ってはやってるの?
Javaとどっちが強い?

287:275
08/10/02 14:13:02
>>285
それって同じことじゃないんですか?
List<>.AddRangeに配列を格納することはできないですよね?

288:デフォルトの名無しさん
08/10/02 14:13:12
>>286
当然Javaの方が主流。
ただし、Winアプリを作るだけならC#3.0の方が生産性が高い。

スキルとして持っていた方が有利なのはJava、
Winアプリのみを作る状況で生産性が高いのはC#。

Javaの求人の方がまだまだ多いな。

289:デフォルトの名無しさん
08/10/02 14:20:44
C#で作ったアプリって.NETだったら
linuxでもmacでも動くんだよね?

290:デフォルトの名無しさん
08/10/02 14:21:04
そして結局日本で一番多いのはVB/VBA

291:デフォルトの名無しさん
08/10/02 14:23:16
>>287
コレクションなら全て入れられる
配列でもなんでも

292:デフォルトの名無しさん
08/10/02 14:54:19
>>291
kitai.pList.AddRange(new List<Point>(ZahyouKeisan.GetToArray()));

適当に記述してたらこれでいけたっぽいんだけど、これでいいのでしょうか?

293:275
08/10/02 14:57:54
>>284の部分で

struct Tekiki
{
 public string Name;
 public Point[] pArr;
}

static class ZahyouKeisan
{
 public static List<Point> GetZahyou()
 {
  List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList.ToArray();
 }
}

こういう場合foreach内はどう記述すればいいですか?

294:デフォルトの名無しさん
08/10/02 14:59:56
>>282
> エラー内容
> 'kitai' は 'foreach 繰り返し変数' であるため、このメンバを変更できません。

このエラーが重要。

foreach(Kitai kitai in Guntai){
kitai = Zahyou.GetArray(); // (A)
}

(A)のように、foreachの()内部で宣言した変数は
変更できない。だから、エラーがでてるんだと思う。

これが、

foreach(Kitai kitai in Guntai){
kitai.pArr = Zahyou.GetArray();
}

のように、変数のメンバーとかなら変更可能。

295:294
08/10/02 15:01:39
あれ。違うか。
メンバも変更出来ないんだっけ?

296:デフォルトの名無しさん
08/10/02 15:10:07
違う。
foreach(var item in collection)
のitem変数はコレクション内のオブジェクトのコピーだから、
構造体配列等の値型のコレクションにおいてそれをやってもダメだよ~って話。
変数のメンバといってもその変数自体がコピーされたものだから、メンバを変更しても
元のコレクションには当然反映されない。

参照型のコレクションだったらコピーされた変数はそのまま参照が渡されているので、
foreach内でメンバの変更が可能となる。

せっかくC#を使っているのにCでゴリゴリ書いているコードとレベルが変わらんぞ。

297:294
08/10/02 15:10:48
structだと変更不可能なようですorz

だとすると、forで回すのがよさそう。

for(int i = 0; i < Guntai.Length; ++i){
Tekki kitai = Guntai[i];
      kitai.pArr = ZahyouKeisan.GetArray();
   }


298:デフォルトの名無しさん
08/10/02 15:13:19
kitai.pList.AddRange(new List<Point>(ZahyouKeisan.GetToArray()));
まずnew Listはいらない
kitai.pList.AddRange(ZahyouKeisan.GetToArray());

pListを直接公開するのはオススメしない

>>293
List<Point>を返すメソッドで配列を返しちゃいけない
AddRangeでPointを増やしていく予定があるならpArrは配列にすべきじゃない
あとZahyouKeisanクラスがkitaiの情報をもっていないのに
Zahyouを返せる理由が分からない

299:294
08/10/02 15:22:29
>>296
解説どうもです。

300:デフォルトの名無しさん
08/10/02 15:35:35
>>293
どうしても配列でやりたいみたいだから書いてみた。

void ShoriMain(){
int now_enemyCount = enemy.pArr.Length;
Point[] tmpArr = ZahyouKeisan.GetZahyou();
int add_enemyCount = tmpArr.Length;
int new_enemyCount = now_enemyCount + add_enemyCount;
//配列の長さを変更
Array.Resize(ref enemy.pArr, new_enemyCount);

//新しい配列を末尾に追加
int count = now_enemyCount;
for (int i = 0; i < tmpArr.Length; i++)
{
count += i;
enemy.pArr[count] = tmpArr[i];
}
}

struct Tekiki{
 public string Name;
 public Point[] pArr;
}
static class ZahyouKeisan{
 public static Point[] GetZahyou(){
   List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList.ToArray();
 }
}

301:デフォルトの名無しさん
08/10/02 15:38:06
変数名が now_enemyCount と new_enemyCount ってのは殺人的だぞ

302:300
08/10/02 15:42:45
VS2008使ってるなら拡張メソッド使ってもうちょっと楽に書けそうだな。

Tekiki enemy = new Tekiki();

void ShoriMain(){
enemy.pArr.Concat(ZahyouKeisan.GetZahyou());
}

struct Tekiki{
 public string Name;
 public Point[] pArr;
}
static class ZahyouKeisan{
 public static Point[] GetZahyou(){
   List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList.ToArray();
 }
}

303:デフォルトの名無しさん
08/10/02 15:59:34
あまりにも汚いコードなんで俺が書き直してやったぞ

struct Tekiki
{
public string Name;
public void AddPoints(IEnumerable<Point> newPoints){
this.pList.AddRange(newPoints);
}
private List<Point> pList;
public Point[] pArr{
get { return pList.ToArray(); }
}
}

class ShoriMain
{
public void SetZahyou(){
foreach (Tekiki kitai in Guntai){
kitai.AddPoints(ZahyouKeisan.GetZahyou());
}
}
}

static class ZahyouKeisan
{
public static List<Point> GetZahyou()
{
List<Point> pList = new List<Point>();
//いろいろ計算
return pList;
}
}

304:300
08/10/02 16:07:17
あー悪い、>>303は俺です。

当然GetZahyou関数がTekkiの座標計算関係のみに使うのであれば、
Tekiki構造体のstaticメンバにしてもっと簡潔に書くことも出来る。

struct Tekiki
{
public string Name;
public void AddPoints(IEnumerable<Point> newPoints){
this.pList.AddRange(newPoints);
}
private List<Point> pList;
public Point[] ZahyouArr{
get { return pList.ToArray(); }
}
public static List<Point> GetZahyou(){
List<Point> pList = new List<Point>();
//いろいろ計算
return pList;
}
}

class ShoriMain
{
List<Tekiki> Guntai = new List<Tekiki>();
public void SetZahyou(){
foreach (Tekiki kitai in Guntai){
kitai.AddPoints(Tekiki.GetZahyou());
}
}
}

305:デフォルトの名無しさん
08/10/02 16:50:39
だめだめじゃないか

- GetZahyouメソッド
  × 戻り値がList<T>
- ZahyouArrプロパティ
  × 型が配列
  × ToArrayが内部状態のコピーとみなせる

てか、それ以前に値型使ってること自体が不適切という指摘をしてあげないと
URLリンク(msdn.microsoft.com)

306:デフォルトの名無しさん
08/10/02 17:02:04
WebBrowserコントロールで、DocumentCompleteを使ってElementにマウスイベント登録すると、
javascriptトリガー用の"href=URLリンク(hoge.com)"をクリックしたときにまでNavigate系のイベントが発生するようになるんだが、
コレは仕様なの?(登録先がBody又は対象のA要素のとき発生)
しかも結果的にナビゲートに失敗するから困ってる。

イベント登録しなければ発生しないみたい。
またハンドラの中身が空でもなるみたい。
誰か回避方法知らない?

307:300
08/10/02 17:47:30
>>305
すまん良く分からないんだが、戻り値がList<T>の関数がガイドライン違反なのか?
リンク先を見てみたがその記述はどこにあるの?
この場合は特に問題ないと思うんだけどなあ。

ZahyouArrプロパティについても、配列を返すプロパティがもしかしてガイドライン違反?
っていうか俺よくList<T>のカプセル化のときにこういうプロパティをよく使ってた・・・
インデクサを使えってことなのかな。

仮に返されるものが参照型の配列だったりしたら内部を変更される可能性があって良くないとは思うけど、
この場合は構造体の配列だし、private List<Point> pListについては安全なように見えるんだけどな。
内部状態のコピーが危険なのは参照型コレクションだけとかではないの?
いまいち納得出来ん。

まあTekiki構造体についてはクラスにすべきだと言う意見は納得できる。

308:デフォルトの名無しさん
08/10/02 17:52:37
グーグーレーカースー

309:300
08/10/02 18:09:52
オーケー分かった。

配列を返す操作と内部状態のコピーの時はメソッドを使用して下さいと書いてあったな。
ZahyouArrプロパティ
の代わりに
public Point[] GetZahyouArr(){
return pList.ToArray();
}

とでもしておくか。

しかし戻り値がList<T>のメソッドは使うなという記事は見つけられんかった。
リンク先おせーてくれよ。

310:デフォルトの名無しさん
08/10/02 18:11:36
その代用で使う
~Collectionってやつがうざい

311:デフォルトの名無しさん
08/10/02 18:22:46
俺もList<T>を返すメソッドを書く事はある
だめだというガイドラインがあるなら俺も知りたい

312:デフォルトの名無しさん
08/10/02 18:24:22
リスト返したらセットアクセッサが無意味化するぞ

313:デフォルトの名無しさん
08/10/02 18:28:44


314:デフォルトの名無しさん
08/10/02 18:29:29
とゆーかカプセル化が崩壊

315:デフォルトの名無しさん
08/10/02 18:30:56
ジェネリック リストを公開しません
URLリンク(msdn.microsoft.com)
Code Analysis Team Blog : FAQ: Why does DoNotExposeGenericLists recommend that I expose Collection<T> instead of List<T>? [David Kean]
URLリンク(blogs.msdn.com)

だそうです。

316:デフォルトの名無しさん
08/10/02 18:31:05
>>275
特別にいいもの教えてやる。

っ インデクサ

317:デフォルトの名無しさん
08/10/02 18:32:13
"do not return list" c# とか適当な英文でググるといいよ
URLリンク(blogs.msdn.com)

318:デフォルトの名無しさん
08/10/02 18:35:34
>>315
それはprivateフィールドのList<T>を公開するなってことでしょ?
そんなことがまずいのはみんな知ってるだろw

static List<Point> GetZahyou()
{
List<Point> pList = new List<Point>();
//いろいろ計算
return pList;
}

このメソッドがガイドライン違反というのが納得できないだけ。
中でnewしたListをいろいろ計算して、その結果を返すメソッドがガイドライン違反という説明にはなってない。

319:デフォルトの名無しさん
08/10/02 18:41:49
計算結果を返すだけなら別にいいんじゃね
それをどういじくろうが誰も困らないし

320:デフォルトの名無しさん
08/10/02 18:45:04
constがないからな

321:デフォルトの名無しさん
08/10/02 18:46:05
List<T>返す云々以前にまずまともな設計をするべき

322:デフォルトの名無しさん
08/10/02 18:49:40
>>318
わざわざList<T>で返されたら追加することに意味があるのかと思っちゃうじゃないか……

323:デフォルトの名無しさん
08/10/02 18:54:56
>>273
List<>を返すのも配列を返すのもかわらなくね?
結局どうすればいいんだろ

324:デフォルトの名無しさん
08/10/02 18:57:16
パフォーマンスを考えればToArrayしとくべきだろ
で、引数や返り値の配列は変更しないというのは暗黙の了解にしとく

325:デフォルトの名無しさん
08/10/02 18:59:55
Dictionary.ValueCollection みたいに

326:デフォルトの名無しさん
08/10/02 19:01:04
>>323
だよね
わざわざ、ToArrayしてまたList<>にいれるわけでしょ?
変換するのは無意味な気がするんだが

327:デフォルトの名無しさん
08/10/02 19:03:32
> わざわざ、ToArrayしてまたList<>にいれるわけでしょ?
これが言い切れるようなinternalな場合はどうでもいいよ

328:デフォルトの名無しさん
08/10/02 19:03:52
書き込み可能な配列で返すのもよろしくない。

329:デフォルトの名無しさん
08/10/02 19:19:57
それを言ったらオブジェクトを返すこと自体良くないきがするんだが

330:デフォルトの名無しさん
08/10/02 19:21:55
たとえば>>325のは返す本人以外は要素の取得しか出来なかったりする

331:デフォルトの名無しさん
08/10/02 19:25:54
親戚も弄れるけどなw

332:デフォルトの名無しさん
08/10/02 19:27:01
今時ならジェネレータにして使う側がToList()なりToArray()なりするというのが良さそう

333:デフォルトの名無しさん
08/10/02 19:34:11
>>321
まともな設計をお願いします

334:デフォルトの名無しさん
08/10/02 19:41:17
引数なしのstaticメソッドで座標を作ってそれを様々な敵機に入れるなんてのはまともな設計じゃないな
普通に考えたら全部同じ座標になるし、それなら何度もメソッドを実行する意味がない

335:デフォルトの名無しさん
08/10/02 19:58:19
なるほど
やっぱりガイドライン違反じゃないんだな


336:デフォルトの名無しさん
08/10/02 20:23:45
>>334
引数無しなのは質問の要点をわかりやすくするために省略しただけ
実際は玉をよけたり、当たり判定だったりあるし、
敵機の目的地点までの経由地点の座標群を敵機ごとに保持しているだけ
「usingディレクティブがない」と揚げ足取るぐらい蛇足な指摘だと思うんだがな

337:デフォルトの名無しさん
08/10/02 20:29:41
>>335
お前がそう思うんなら そうなんだろう お前ん中ではな

338:デフォルトの名無しさん
08/10/02 20:30:54
>>334
怒るな
怒ったら負けだ

339:デフォルトの名無しさん
08/10/02 20:39:39
既に負けてる

340:デフォルトの名無しさん
08/10/02 20:48:35
なんでわざわざ作りにくい実装にするのよ


341:デフォルトの名無しさん
08/10/02 21:03:40
>>340
作りやすい実装をお願いします

342:デフォルトの名無しさん
08/10/02 21:30:54
戻り値の型にList<T>がまずいのは当然として、
IList<T>なら遥かにいいと思っているんだが違う?

343:デフォルトの名無しさん
08/10/02 21:49:22
List<T>を返すのがなんでまずいんだ?初めて聞いたぞ
それを言ったらオブジェクトの中にList<T>が含まれてたら何にも返せなくなっちゃう

344:デフォルトの名無しさん
08/10/02 21:50:05
>>343
ラッパを返せばいい

345:デフォルトの名無しさん
08/10/02 21:56:16
っ ほい

URLリンク(msdn.microsoft.com)

346:デフォルトの名無しさん
08/10/02 22:04:54
いちいち継承してらんねーよ

347:デフォルトの名無しさん
08/10/02 22:10:43
今日のレスは勉強になったなー

348:デフォルトの名無しさん
08/10/02 22:14:52
なんしか、フィールド変数の値を返す場合はプロパティで
オブジェクトを返す場合メソッドを通して値のやり取りをしろってことでしょ?

349:デフォルトの名無しさん
08/10/02 22:28:04
ボタンをクリックしたら、エクスプローラで全選択するように、ボタンにCtrl+Aを割り当てたプログラムを作ろうとしています。
ところが、当然ボタンをクリックするときには、エクスプローラではなく、作っているプログラムがアクティブになってしまうので、アクティブにならないようにしてみました。
しかし、ボタンを押しても全選択はできないままです。
アドバイスお願いします。

namespace CtrlA {
public partial class CtrlA : Form {
const int WM_MOUSEACTIVATE = 0x0021;
const int WA_NOACTIVATE = 3;
public CtrlA() {InitializeComponent();}

protected override void WndProc(ref Message m){
switch (m.Msg) {
case WM_MOUSEACTIVATE:
m.Result = (IntPtr)WA_NOACTIVATE;
return;}
//Console.WriteLine(m.Msg);
base.WndProc(ref m);
}

private void CtrlA_Click(object sender, EventArgs e) { SendKeys.SendWait("^A") ;}
}
}


350:デフォルトの名無しさん
08/10/02 22:28:11
変更可能なオブジェクトの参照を流出させることのリスク、
そのリスクの管理ができていればどうしようとかまわないと思う。
ようは外部から参照経由で変更された場合に、
そのオブジェクトを内包させているクラスが
値が変わったことを知ることができないということ。

メソッドの場合はメソッド名で内部の参照をさらしているのか、安全なコピーを返しているのか
区別が付くような名前にしておくとか工夫して置けばよい。
プロパティの場合はメソッドを使うよりはいろいろルールがある。


351:デフォルトの名無しさん
08/10/02 22:34:21
>>349
エクスプローラの画面のハンドルが必要になるような。
どうやるかはWin32APIの範疇になる。

352:デフォルトの名無しさん
08/10/02 22:38:51
>>350
>そのリスクの管理ができていればどうしようとかまわないと思う。
そのリスクを減らすためのものがガイドラインでしょ?守らないと不幸なことが起きるかもしれないのがガイドライン。
俺仕様がしっかりしてるならそれでもかまわないが、それが通用しないところではガイドラインが役に立つ。

Delphiで言うと、クラス名はTうんちゃらで始めるという習慣があるが、厳密な言語仕様でもないので守る必要はない
ただ、守らない理由なんて無いけどな(Delphi.netは例外)
TTBaseって支援ソフトがあるんだが、これのプラグインSDKにはTTTBasePluginというクラスがあって、1カ所(ry

353:デフォルトの名無しさん
08/10/02 22:50:36
>>346
何を継承して何をしたいのか知らんが、
>>344-345をするならAsReadOnly()呼ぶだけじゃん

354:デフォルトの名無しさん
08/10/02 22:57:18
>>352
プロパティに関してはそういうガイドラインがあることは承知しているが、
通常のメソッドに関しては見たことがないな。
メソッドの場合は自己責任じゃないかと。


355:デフォルトの名無しさん
08/10/02 23:08:30
まとめるとFramework Design Guidelines第二版買ってねってことだな
URLリンク(www.amazon.co.jp)

おk、アジソンからマージンゲット

356:デフォルトの名無しさん
08/10/02 23:18:33
そういえば全然関係ないけど名前付け関係なら我等が .NET
ライブラリにも MessageSecurityVersion とかいうネタクラスが
ありますよ。
この命名規則はさすがにどうなんだろうね

357:デフォルトの名無しさん
08/10/02 23:30:56
>>356
あれはよくわからないけどWS-*とかSOAPとかのネーミングルールなんじゃない(笑


358:デフォルトの名無しさん
08/10/02 23:51:55
MessageSecurityVersionのどこが変なの?

359:デフォルトの名無しさん
08/10/02 23:58:35
ガイドラインって本しかないの?

360:デフォルトの名無しさん
08/10/03 00:08:32
>>359
>>315

361:デフォルトの名無しさん
08/10/03 00:09:20
>>358
WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005
WSSecurityPolicy11BasicSecurityProfile10 プロパティとか。

ちなみにサンプルコード片。

CustomBinding binding = new CustomBinding();
binding.Elements.Add(
 SecurityBindingElement.CreateMutualCertificateDuplexBindingElement(
  MessageSecurityVersion.WSSecurity10WSTrustFebruary2005
   WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10
 )
);

横スクロールはいやというやむを得ない事情により改行を入れさせていただきました
本来識別子なので入れてはいけません

362:デフォルトの名無しさん
08/10/03 00:13:05
>>318はガイドライン違反じゃないよね?

363:デフォルトの名無しさん
08/10/03 00:13:11
>>360
なんだその記事w
日本語でおkなんだがw

364:デフォルトの名無しさん
08/10/03 00:13:47
>>361
これはギャグなのか?w

365:デフォルトの名無しさん
08/10/03 00:15:30
>>361
ネームスペースというのが使えるのにこれだけ長い名前になるんでしょ?
C言語時代のメソッドや変数の名前って相当長かったんだろうな

366:デフォルトの名無しさん
08/10/03 00:27:33
C言語時代は8文字規制とかあたじゃん

367:40
08/10/03 00:27:36
ディレクトリの操作をするときのパス指定で

@"c:\tmp\path"

というような書き方をしますが、 @ ってどういう意味ですか?


368:デフォルトの名無しさん
08/10/03 00:30:42
>>367
URLリンク(ufcpp.net)

369:40
08/10/03 00:33:12
>>368さん

参照URLを拝見しました。理解できました。ありがとうございました。

370:デフォルトの名無しさん
08/10/03 00:36:55
>>367
\ -> \\

本来、文字列の中で \ はエスケープなので、\\ と書かなくちゃいけない。
それを \ で済ますことができるようになる

371:デフォルトの名無しさん
08/10/03 00:37:04
>>367
「@文字列」ですな。
例えばファイルのパスを記述する時、「\」はエスケープ文字を意味する記号になるので
通常は「"C:\\Windows"」など[「\\」と\を2個記述しなければいけないのですが、
@を先頭に付ければ「\」を文字列として扱い、一つしか記述しなくても済みます。

372:40
08/10/03 00:41:57
>>370さん, 371さん

丁寧な補足解説ありがとうございます。
おかげでよくわかりました。

373:デフォルトの名無しさん
08/10/03 00:43:01
>>365
逆。昔はエディタの補完機能なんてのもないし、長い名前付けなかった。

ほんと大昔、初期の初期はプログラムの規模が小さいから
名前の衝突の危険性が低かったからいいんだけど、それはすぐに破たん。

結果どうなったかというと、意味のわからない頭文字略語だらけで、
書いた人にしか意味が分からない名前だらけに。
例えば、>>361 のコードなら、
cb_t b;
add(&b.elem, sbe_create_mcdbe(msg_sec_v10feb05, ws_sec_feb05_11b10)
とかになるんじゃないかと。

374:デフォルトの名無しさん
08/10/03 00:43:50
質問です、エクスプローラでファイルを右クリックして、[プロパティ]画面の
[概要]タブを開くと、そのファイルの作成者やコメントなどの情報を設定したり
閲覧したりすることができます。これを何かの処置で非表示にすることは
可能ですか?設定は随時行い、表示はさせない、という使い方をしたい
のですが、方法についてご存知の方がいらっしゃいましたらご指導お願いします。

.NETからは、dsofile.dll というDLLで設定と参照ができることはわかったのですが、
これをそのファイルごとに非表示にしたり表示したりできれば思います。

375:デフォルトの名無しさん
08/10/03 00:48:04
@"blah\" とかやっても平気なのは何気に凄いね

376:デフォルトの名無しさん
08/10/03 00:50:55
MSDNって、どうしてあんなに遅いんですか?

377:デフォルトの名無しさん
08/10/03 00:51:13
スペッコ不足です

378:デフォルトの名無しさん
08/10/03 00:53:15
つーかパスはC:\\\\\\\\\\\\\\\windows\\\\\\\system32\\\\\\
とかやっても動くぞ
二つ以上連続の\は勝手にOSが読み替えてくれる

379:デフォルトの名無しさん
08/10/03 00:54:41
>>376
仕様です。

IE で見るのが苦痛なサイトを自前で作ってるって笑われてる。

380:デフォルトの名無しさん
08/10/03 00:55:43
MSDNの分かりづらさはなんとかならないのか
専門の校閲係とか雇って分かりやすくしとけよ

381:デフォルトの名無しさん
08/10/03 00:56:13
>>374
プログラムというより、OS の設定の領域。
プログラム的には、シェルエクステンションの仕組みでうんぬんかんぬん・・・

382:デフォルトの名無しさん
08/10/03 00:59:37
>>379
文字が小さくて
拡大すると、どうでも良い部分も拡大されて読めなくなるのは?

383:デフォルトの名無しさん
08/10/03 01:11:39
>>382
仕様です。

JavaScript で文字調整やってやがるから、
フォントサイズいじっても無駄とかだと思う。
拡大鏡の類で拡大すればちゃんと大きくなると思うが。

384:デフォルトの名無しさん
08/10/03 01:18:44
いやかしましは百合ものだろ
初期設定がアレなだけ

385:デフォルトの名無しさん
08/10/03 01:32:23
どこの誤爆だよw

386:デフォルトの名無しさん
08/10/03 01:32:35
かしまし噴いたwww

387:デフォルトの名無しさん
08/10/03 02:30:50
コーラ返せww

388:デフォルトの名無しさん
08/10/03 18:53:33
どなたーか EachWithIndex 実装してる人いませんか?

389:デフォルトの名無しさん
08/10/03 19:54:51
>>388
Rubyのアレならこんなのが
URLリンク(grabbagoft.blogspot.com)

390:デフォルトの名無しさん
08/10/03 20:57:23
>>388
こんなんでどうだろ?

public static class IListExtensions {
public delegate void Fun<T>(T obj, int index);
public static void EachWithIndex<T>(this IList<T> lst, Fun<T> func){
int index = 0;
foreach (T obj in lst){
func(obj, index++);
}
}
}
class Program
{
static void Main(string[] args)
{
string[] strs = { "Foo", "Bar", "Zot" };
strs.EachWithIndex(
(name, index) => { System.Console.WriteLine("{0}: {1}", index, name); }
);
IList<string> lst = new List<string>();
lst.Add("Hoge");
lst.Add("Fuga");
lst.Add("Sugo");
lst.EachWithIndex(
(name, index) => { System.Console.WriteLine("{0}: {1}", index, name); }
);
System.Console.ReadLine();
}
}

391:デフォルトの名無しさん
08/10/03 20:58:07
>>389

これIEnumerable<T>への拡張メソッドにしたほうがいいよね
回りくどくて格好悪い

392:391
08/10/03 21:07:27
意味解らんこと言ってるな
わざわざ余計なインスタンス作ってDo呼び出させる意味がわからない

393:デフォルトの名無しさん
08/10/03 21:13:01
元記事に書いてあるじゃん。
> I still like the "Do" keyword in Ruby to signify the start of a block

394:デフォルトの名無しさん
08/10/03 21:29:54
>>390
Action<T, int>使えよ

395:390
08/10/03 21:33:47
>>394
> Action<T, int>使えよ
おや。そんなものが?
じゃ、こうかな。

public static class IListExtensions {
public static void EachWithIndex<T>(this IList<T> lst, Action<T, int> func){
int index = 0;
foreach (T obj in lst){
func(obj, index++);
}
}
}


396:デフォルトの名無しさん
08/10/03 21:48:15
IEnumerable<T>はどうした

397:デフォルトの名無しさん
08/10/03 21:50:43
引数名はactionだろ常考

398:デフォルトの名無しさん
08/10/03 21:51:42
Union of Soviet Socialist Republics

399:デフォルトの名無しさん
08/10/03 22:03:47
>>396,397
そういうもん?
じゃ、これで。

public static class IEnumerableExtensions {
public static void EachWithIndex<T>(this IEnumerable<T> lst, Action<T, int> action){
int index = 0;
foreach (T obj in lst){
action(obj, index++);
}
}
}



400:デフォルトの名無しさん
08/10/03 22:11:48
Enumerableの拡張メソッド見た感じじゃthis IEnumerable<T>の引き数名は
sourceだがここでもsourceでいいのかね

401:390
08/10/03 22:27:26
>>400
valuesじゃ駄目だろうか?


public static class IEnumerableExtensions {
public static void Each<T>(this IEnumerable<T> values, Action<T> action) {
foreach (T obj in values) { action(obj); }
}
public static void EachWithIndex<T>(this IEnumerable<T> values, Action<T, int> action){
int index = 0;
foreach (T obj in values){
action(obj, index++);
}
}
}

402:デフォルトの名無しさん
08/10/03 22:29:27
派生クラスでプロパティを違う型に変えるのは出来ないの?

class Class1
{
 public Class1 Owner { get{~} }
}

class Class2 : そlass1
{
 public Class2 Owner { get{~} }
}

403:デフォルトの名無しさん
08/10/03 22:32:57
>>399
メソッド名はForEachでいいと思う。
C#だとWithIndexみたいなのは付けずにオーバーロードを使うほうが自然。

public static class EnumerableEx
{
  public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
  {
    foreach (var item in source)
    {
      action(item);
    }
  }
  public static void ForEach<T>(this IEnumerable<T> source, Action<T, int> action)
  {
    int index = 0;
    foreach (var item in source)
    {
      action(item, index++);
    }
  }
}

404:デフォルトの名無しさん
08/10/03 22:33:57
new すればいいんじゃない?


405:デフォルトの名無しさん
08/10/03 22:35:50
オーバーライドでの共変・反変性はサポートされとらんねー

406:403
08/10/03 22:36:48
>>401
参考までにこれも
URLリンク(msdn.microsoft.com)

Enumerable.Selectにもインデックス付きのバージョンがあるんだけど
Enumerable.SelectWithIndexとはならない。

407:デフォルトの名無しさん
08/10/03 22:36:57
じぇねりっく!

408:デフォルトの名無しさん
08/10/03 22:38:04


409:デフォルトの名無しさん
08/10/03 22:42:16
public Class1 Owner2 { get{~} }
public Class2 Owner1 { get{~} }

( ^▽^)

410:デフォルトの名無しさん
08/10/03 22:45:43
>>399
俺も>>403に一票。てか、俺が書いたとしてもforeachを一行で書くくらいの違いで
クラス名、変数名まで全く同じになりそう
あ、でも型パラメータは一応Enumerableに合わせてTSourceにしとくかな

411:デフォルトの名無しさん
08/10/03 23:10:13
プロジェクトによって、インテリセンスのコメントが
出てきたり、出てこなかったりするんだけど、
何が違うんでしょう?

同じソリューション内にa, b, zの3つのプロジェクトがあったとして、
aからはzのコメントが出てくるのに、bからだとzのコメントが出てこない、
みたいな状態です。
参照設定も同じようになってます。

412:デフォルトの名無しさん
08/10/03 23:25:52
>>403
なるほどなるほど

413:デフォルトの名無しさん
08/10/03 23:32:32
超初心者の質問ですがどなたか願いします
名前空間ってあるじゃないですか
あれって使わないものもusingで指定しても大丈夫ですか?
自分がちょっとテストしてみたところ問題ないような感じなんですよ
めんどくさいので全名前空間usingセット作っておいたら便利なのかと思うんです
何か不都合がおきますか?

414:デフォルトの名無しさん
08/10/03 23:37:32
クラス名が時々衝突する
Timerなんか3つあるしな

415:デフォルトの名無しさん
08/10/03 23:39:39
>>414
わかりました
横着は駄目ですね
ありがとうございました

416:デフォルトの名無しさん
08/10/03 23:43:33
型名をタイプしてからShift+Alt+F10が便利

417:デフォルトの名無しさん
08/10/04 00:06:48
>>409


418:デフォルトの名無しさん
08/10/04 15:17:26
c#ってマックで動きますか?

419:デフォルトの名無しさん
08/10/04 15:17:44
動きます。

420:デフォルトの名無しさん
08/10/04 15:26:44
.Net frameworkがインストール可能な環境なら
どこでも動くってことでおk?

421:デフォルトの名無しさん
08/10/04 15:28:06
いいえ
.NetFrameworkに限りません

422:デフォルトの名無しさん
08/10/04 15:44:15
メガマック食いてえー

423:デフォルトの名無しさん
08/10/04 16:06:44
>>422
スーパーサイズで良いですか?マックマクにしてやんよ

424:デフォルトの名無しさん
08/10/04 17:48:38
メモリ上にある画像(byte[]で保持しているjpg画像)を、
HTMLで好きなようにレイアウト組んで表示させたいんだけど、
WebBrowser使ってできるかな?
画像データはファイルに落とさないこと前提で。

425:デフォルトの名無しさん
08/10/04 18:02:57
プロトコルハンドラを書けばいいんじゃない?
それで、<img src="foo:ID"/>とかできるとおもう。

IInternetProtocolとかでぐぐれ

426:デフォルトの名無しさん
08/10/04 18:07:15
何しようとブラウザに画像ファイルとしてキャッシュされる可能性は捨てられんがそれはOK?

427:デフォルトの名無しさん
08/10/04 18:25:09
今ペイントソフト的なのを作ろうとしているんだが…
範囲選択、塗り潰し、グラデーションが上手くできなくて困ってる。
塗り潰しはピクセルごとに色を取得してクリックしたとこと同じなら…とやろうとしたがそれだと離れた場所にある同じ色のピクセルも色が変わってしまう。
グラデーションはLinearGradientBrushでやろうとしたが、グラデーションが繰り返されてフォトショとかみたいにならない。

初心者で悪いんだが、助言もらえると助かる。

428:デフォルトの名無しさん
08/10/04 18:25:21
或いはNetscapeプラグイン、或いはActiveX

429:デフォルトの名無しさん
08/10/04 18:32:05
困ったときはPaint.NET見てみる
俺は見たことも使ったことも無いから参考になるかどうかは知らん

430:デフォルトの名無しさん
08/10/04 18:43:47
無料のSicence Libraryなかなかいいのないよね。

431:427
08/10/04 19:07:47
>>429
前に見たんだが、ファイル数多くてどれがどれだか分からないし、さらに理解もできなくて…
オープンソースの奴がある程度は理解できるようにはならないと駄目だよな…

432:デフォルトの名無しさん
08/10/04 19:35:11
>>425
ありがとう。
ググってみるわ~。
むずそうだったらファイルに落とすか、
諦めてDataGridに表示とかにするわ。

>>426
全然おk

433:デフォルトの名無しさん
08/10/04 19:44:41
塗りつぶしは上下左右のピクセルを調べて同じ色なら塗る
を上下左右に再帰的に適応していけばできる気がするな
それよりもいい方法があるかもわからんけど

434:デフォルトの名無しさん
08/10/04 19:59:07
>>433
極めて正しいが多分今のPCでは実用速度的に厳しいと思う
塗りつぶしは昔から研究されてるからちょっと調べればアルゴリズム色々転がってるよ

435:デフォルトの名無しさん
08/10/04 19:59:31
>>433
そのまま再帰で書くとSystem.StackOverflowExceptionしそうだな。
多少きれいじゃなくなるけど、非再帰に書き直さないとな。
スタックを使えばできないこともないと思う。

それと、直接塗りつぶすんじゃなくて、
画像と同じサイズの配列(Bitmapでも可)を用意して 塗りつぶすところと塗りつぶさないところのフラグ(マスク)を作ってから
重ね合わせで塗りつぶせば、グラデーションやテクスチャの流し込みとかにも応用できそう。

あと、塗りつぶす前にマスクをぼかしておけば、よりきれいにぬれているように見えるはず

436:デフォルトの名無しさん
08/10/04 22:32:15
ソースコードを記述したファイルの管理について質問させてください
C#はソースの場所と名前空間に特に関連が無いようですが、一般的に従うファイルの置きかたなどあるのでしょうか?
今はVC#がソースを置くディレクトリに全てのファイルをそのまま置いてます
また、クラスとファイルの関係ですが、どうするのが普通なのでしょうか?
Javaみたいに1個のpublic classに対して1個のファイルを作るのが普通でしょうか?

よろしくお願いいたします

437:デフォルトの名無しさん
08/10/04 22:34:42
好きにすればいいよ

438:デフォルトの名無しさん
08/10/04 22:37:45
>>436
> C#はソースの場所と名前空間に特に関連が無いようですが、一般的に従うファイルの置きかたなどあるのでしょうか?

ありません。

> 今はVC#がソースを置くディレクトリに全てのファイルをそのまま置いてます

ファイル数が少ないときはそれでよいかと。

> また、クラスとファイルの関係ですが、どうするのが普通なのでしょうか?
> Javaみたいに1個のpublic classに対して1個のファイルを作るのが普通でしょうか?

一般的にはそんな感じですが、Java と違って、ひとつのファイルに複数のクラスが書けるので、
機能的にまとまったクラス群はひとつのファイルにまとめることもあると思います。


439:デフォルトの名無しさん
08/10/04 23:02:47
>>437-438
レスありがとうございます
参考にさせていただきます

ついでに、もう1個質問です
C#にはパーシャル クラス機能があり、1個のクラスを複数のファイルに分割して記述できると知りました
しかし、使う場面が思いつきません
パーシャル クラスの一般的な使い方とかあるのでしょうか?

440:デフォルトの名無しさん
08/10/04 23:03:38
>>439
VS でウィンドウアプリを作れば、プロジェクトがどういう風にパーシャルクラスを
使ってるかわかるよ

441:427
08/10/04 23:17:19
>>433-435
レスThx、参考になった
塗りつぶしアルゴリズムでググってみたら良さげなのが出たからそれを利用してみる事にする。

続けてで悪いんだが、範囲選択はどうしたら出来るか助言を貰いたい。


442:デフォルトの名無しさん
08/10/04 23:38:10
>>439
基本的に、機械生成コードと手書きコードを合わせて1クラスにするための機構。

443:435
08/10/04 23:47:52
>>441
矩形だけなら始点(sx,sy)と終点(ex,ey)を保持するだけで良いが
それ以外を選択するには、Bitmapで形を保持すると良い
PictBearは選択範囲をBitmapで保存できたから、多分そんな形でやってるはず。

>>442
WPF,XAMLがある今、いらない子?

444:デフォルトの名無しさん
08/10/04 23:50:45
>>443
いや、WPF 以外にもいろいろ使われてる。

WPF の XAML も、ビルドの途中で partial class を自動生成してる。

445:デフォルトの名無しさん
08/10/04 23:50:50
>>443
形の保持ならGraphicsPathでよかろうよ

446:デフォルトの名無しさん
08/10/05 00:07:30
ラスタ形式の画像の選択範囲は、
αチャンネルで持つのが普通な気が。

447:デフォルトの名無しさん
08/10/05 01:03:01
splitで出力された1次元配列にいくつの要素があるかわかるメソッドってない?

448:デフォルトの名無しさん
08/10/05 01:04:24
Count()

449:デフォルトの名無しさん
08/10/05 01:05:07
>>447
ubound

450:デフォルトの名無しさん
08/10/05 01:05:29
ごめん、VB と勘違いした

451:447
08/10/05 01:08:36
即レスサンクス!
Count()はVBで>>448=>450でおk?uboundを使ってみます!

452:427
08/10/05 01:11:46
助言してくれた人たち、ありがとう。
教えてもらった方法をなんとか試してみる。

453:447
08/10/05 01:16:32
ん、、?
uboundがVBかorz

454:デフォルトの名無しさん
08/10/05 01:25:10
現実では無理だと悟ったので、人工知能の少女を作って仮想世界で彼女作ろうと思うのですが
C#でできますか?

455:デフォルトの名無しさん
08/10/05 01:28:10
C#はそんな貴方の夢を叶えます

456:デフォルトの名無しさん
08/10/05 01:53:29
>>440
レスありがとうございました
自分は今のところコマンドプロンプトで実行するアプリケーションしか作ってないので、そのうち勉強させてもらいます


すみませんが、またまた質問させてください。
今度は例外処理に関してです。
C#だと、例外は必ずしもtry~catchしなくて良いのでしょうか?

Encoding.GetEncoderメソッドを使うプログラムを考えているのですが、特に例外処理しなくても、コンパイルも実行もできてしまいます
おそらく、このメソッドは存在しない文字コードを指定すると例外を発生させますよね?
そのための例外処理が必要だと思うのですが、どうなってるんでしょ?
Javaで言うところのRuntimeExceptionが出ているのでしょうか?

APIを調べたのですが、URLリンク(msdn.microsoft.com)を読んでも、例外関係の情報が入手できません。

例外の基本的な処理の考え方や、ドキュメントからの例外情報の入手方法を知りたいです。
よろしくお願いいたします

457:デフォルトの名無しさん
08/10/05 01:59:56
>>456
いちいち Java と比べるのはやめれ。

例外処理をしなければ、UnhandledException が出て、アプリが終了するだけ。

458:デフォルトの名無しさん
08/10/05 09:04:26
GetEncoder自体はEncoderオブジェクト返すだけだし例外投げる要素が無いな

459:デフォルトの名無しさん
08/10/05 10:33:11
>>457
すみません、自分はCとJavaとrubyくらいしか、経験が無いもので、、、^ ^;
>例外処理をしなければ、UnhandledException が出て、アプリが終了するだけ。
なるほど
しかし、いきなりアプリが終了するのは厳しいですな

>>458
間違えました
Encoding.GetEncoding(String);でした
URLリンク(msdn.microsoft.com)
見ると、例外の情報も載ってますね


申し訳ありませんが、さらに質問させてください
普通にVC#2008ExpressEditionを使っていると、例外処理を行わなくてもコードが書けてしまいますよね
これを、VC#2008ExpressEditionが自動的に全ての例外を処理しなければ警告を出すような設定にすることはできないのでしょうか?
あと、またまたJavaに例えてしまい申し訳ないのですが、各例外にExceptionとRuntimeExceptionのような違いはないのでしょうか?

よろしくお願いいたします。

460:デフォルトの名無しさん
08/10/05 10:34:34
>>456
変な引数与えたときはたいてい ArgumentException。

Java と比べてってことは、「throws リストはないの?」ってことだろうけども。
あれは、「内部実装を外部に漏らしてしまう」って欠点がある割に、
どうせ「面倒だったらException型でcatchしちゃえ」って人が多くて
対して役に立たないから C# では採用しなかった。

461:デフォルトの名無しさん
08/10/05 10:38:38
>>459
URLリンク(msdn.microsoft.com)(VS.80).aspx

例外処理の強要は、Java みたいに throws リストでやるんじゃなくて、
単体テスト書いて、ちゃんとコーナーケースのテストもして、
例外が出たらテスト通さないようにするのがいいと思う。

462:デフォルトの名無しさん
08/10/05 11:11:25
VS2008C# Expressです。

フォームを作成すると、Form1.Designerに以下のような
コードが追加されますが、このSystem.ComponentModel
名前空間のインターフェース、クラスはどのような意味を
持つのでしょうか?ヘルプやHPで調べてもよくわかりません。

private System.ComponentModel.IContainer components = null;

private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
}

このフォームにボタンを追加すると、InitializeComponentの
this.components = new System.ComponentModel.Container();
が消えてしまいます。

そこからさらにTimerを追加すると、
this.components = new System.ComponentModel.Container();
が復活し、
this.timer1 = new System.Windows.Forms.Timer(this.components);
が新たに追加されます。

アンマネージドリソースの破棄に関係しているのでしょうか?
詳しく解説しているHP等ありましたら、教えてください。
宜しくお願いします。


463:デフォルトの名無しさん
08/10/05 11:19:38
はじめに入ってるのはそういうテンプレートだから
消えるのは多分使ってないと判断されたから
追加されるのは使うから

IContainerはComponent派生クラスの後片付け(Dispose呼び出し)のルール
自分がDisposeされるときに自分の持ってるComponentもまとめてDisposeするため

464:デフォルトの名無しさん
08/10/05 11:42:59
>>460-461
レスありがとうございます
確かにJava使ってたときもなんでもかんでもExceptionでcatchなさる御仁は多かったですね
うちの会社はルールが厳しくて許されませんでしたけど、下請けに出した古いコードはcatch(Exception e)の嵐…
しかも、何も処理して無いことも多いですし、酷いときはVMが突然終了するコードもありましたね


現実問題、例外処理はどうするもんなんでしょ?
たとえば、ArgumentExceptionとかはそもそもメソッドの使い方を間違えているわけだから、例外が出たらプログラマの責任でテスト失敗てのは納得できます
だから、ArgumentExceptionをcatchして例外処理を記述する必要は無いと思います

しかし、ファイル読み込みに失敗とかのケースはやはりcatchしてなんだかの処理をすべきですよね(少なくともアプリが突然終了はないですよね)
catchして処理すべき例外とプログラマの責任でそもそも例外が出ないようにテストする例外と、なんか、その辺を解説している記事とか本とかないですかね


465:462
08/10/05 11:43:51
>>463
レスありがとうございます。

Component派生クラスのオブジェクトをFormの
System.ComponentModel.IContainer componentsに登録させておき、
フォームをDisposeするときに一緒にDisposeさせる…

上記のような処理のためcomponentsが存在している。
といった理解でよろしいでしょうか?


466:デフォルトの名無しさん
08/10/05 11:47:56
>>465
うん

467:462
08/10/05 11:50:22
>>466
ありがとうございました。


468:デフォルトの名無しさん
08/10/05 11:51:50
Silverlight2RC0来たね

469:デフォルトの名無しさん
08/10/05 12:21:11
半透明なコントロールを親コントロールに貼り付けたとき、
親コントロールが子コントロールの領域を描画しなくなって
表示がおかしくなるのを防ぐために設定するのって何だっけ?

変な日本語ですまn

470:デフォルトの名無しさん
08/10/05 13:06:53
>>465
厳密に言うとそれだけじゃなくて Container Site Componentの
結合のために存在している。
しかし、この辺は ComponentModel の基本的なことだから押さえた
ほうがいいともいえるけどコンポーネントを作るんじゃなく使うだけ
なら気にしなくてもいいからわかんなくてもいいかも。


471:469
08/10/05 13:12:09
追記

Win32で言うところの
WS_CLIPCHILDREN と WS_CLIPSIBLINGS
を外したいってことなんだが。

472:デフォルトの名無しさん
08/10/05 16:26:58
例外処理はこれで十分

static void Main(string[] args)
{
  try{
     //ほげほげ
  }
  catch(Exception){
    MessageBox(e.ToString(), "えら~");
  }
}

473:デフォルトの名無しさん
08/10/05 16:28:36
hogeってなんなの?

474:デフォルトの名無しさん
08/10/05 16:32:19
hageやhigeの変種

475:デフォルトの名無しさん
08/10/05 16:32:58
>>472

e

476:デフォルトの名無しさん
08/10/05 16:33:04
hogeの定義は無いよ
適当とか未確定とかニュアンスでいいんじゃないでしょうか?

477:デフォルトの名無しさん
08/10/05 16:37:12
では、ハナモゲラ語とはなんですか?

478:デフォルトの名無しさん
08/10/05 16:59:13
Lengthだろ

479:デフォルトの名無しさん
08/10/05 17:05:41
!

480:デフォルトの名無しさん
08/10/05 17:13:57
想定外の例外は最上位でキャッチしてログ書いてメッセージ出して終了。
普通に想定される処理続行可能な例外はその場でキャッチして適度に処理。
続行出来ないようなのはあえてキャッチせず最上位に任せるか、
ラップして再スローしてやっぱり最上位に任せる。

例外処理って、厳密にやろうとすると細かいルールばかりになって、
しかもかなり慎重に考えないと意味なかったりやたらコーディングが複雑になったりして、
結局シンプルに決めた方がましなことが多い。


481:デフォルトの名無しさん
08/10/05 17:37:48
変数と配列・リストで命名規則の違いとかってありますか?

たとえば変数の場合は出だしが小文字でそれ以降は大文字

例) int variableNumber;

みたいな感じにするのが一般的とされていますが、これと似たような暗黙上のルールは
配列・リストにありますか?

482:デフォルトの名無しさん
08/10/05 17:54:20
>>481
暗黙っていうか、それはcamelスタイルって名前がついてる。
MSのクラスライブラリ作成のガイドラインに、なににどのスタイルを使うとか書いてある。

483:デフォルトの名無しさん
08/10/05 17:58:11
配列やリストだって変数に入れるインスタンスじゃん?

484:デフォルトの名無しさん
08/10/05 18:02:20
ローカル変数に大文字二十日湾だろ不通

485:462
08/10/05 18:10:02
>>470
基本的なことなら理解したいのですが、
解説サイトとしてはMSDNの「Visual Studioによるコンポーネント」
のあたりを読むしかないですかね?

コンポーネントのありがたみというかコンポーネントでないと
出来ない事なんかがよくわかりません。

486:デフォルトの名無しさん
08/10/05 18:56:11
どうしてプロパテーはジェネリックに出来ないの?

487:デフォルトの名無しさん
08/10/05 19:13:51
うまく質問している内容が伝わるか不安ですがよろしくお願いします

やりたいのは、データをファイルに保存するクラスを作りたいのですが
テキストファイル形式で保存するんじゃなくて、テキストエディタで開いても
みれないデータ形式ありますよね?.exeとか
そんな感じで保存したいんだけどどういう知識が必要なのかな?

保存したいのは計算結果の数値や文字列データです

488:デフォルトの名無しさん
08/10/05 19:16:59
>>487
好きにフォーマットを考えて、好きに読み書きすればよろし。

489:デフォルトの名無しさん
08/10/05 19:45:24
>>488
だから、普通に書き込んだらテキストファイルで見れるから
そうならないように書き込みたいからやり方教えろって言ってるんだけど
お前メクラか?

490:デフォルトの名無しさん
08/10/05 19:50:21
お前がテキストで書き込んでるから見えるんだろボケ

491:デフォルトの名無しさん
08/10/05 19:52:47
>>489
>>488は別に煽ってるわけでもないし、ましてメ○ラなわけでもない。
むしろ馬鹿でメ○ラでツ○ボでどうしようもないのは君の方だぞいやマジで。

492:デフォルトの名無しさん
08/10/05 19:54:08
>>489

> だから、普通に書き込んだらテキストファイルで見れるから

ならない。

バイナリを見れる、って意味では見れるけどなw

493:デフォルトの名無しさん
08/10/05 19:59:26
まあお前らKOOLになれよ

BinaryFormatterでシリアライズなんかどうかな

494:デフォルトの名無しさん
08/10/05 19:59:56
昨日splitで出力された配列に何個要素が入ってるのかわかる関数を教えてくれってレスして
count()を教えてもらったんだけどこの関数どうやって使うんですか…?
ググってもそれらしい構文が見つからなくて…

495:デフォルトの名無しさん
08/10/05 20:01:18
素直にLengthプロパティ見れ

496:デフォルトの名無しさん
08/10/05 20:06:59
>>494
だからお前はオブジェクト指向の概念から学べよ猿

あと、countだと、nullだった場合エラー出るからお勧めできない
countなんて薦めた奴はバカだから放置しろ

497:デフォルトの名無しさん
08/10/05 20:51:01
>>494
その人、たぶん Length って言いたかったんだと思うよ。
VBとか他の言語がいろいろ混ざっちゃってたっぽいので。

Split の結果って配列だから、それの長さ調べろってこと。

498:494
08/10/05 20:56:07
>>495-497
そうかLength見ればいいのか…
なんか変な考え方してたみたいですorz
皆さん優しくありがとう

499:デフォルトの名無しさん
08/10/05 21:10:30
初心者です。C#で

ある整数のセットに対して、最小値(か最大値)を配列で返す機能ってあります
でしょうか?ちょっと探してみたくらいじゃみつかりませんでした。

例 
[3,3, 5, 2, 2, 4, 4, 7] => [2,2]
[7,2,3,4,1,,-1,-1,-3,5] => [-3]

500:デフォルトの名無しさん
08/10/05 21:11:32
あ、,,になっている部分は、nullみたいな感じで無視します。


501:デフォルトの名無しさん
08/10/05 21:15:56
そのものはないけど、
new[] { data.Max() }


502:デフォルトの名無しさん
08/10/05 21:20:37
>>501
複数あったらその数だけ作るらしいぜ
var max = data.Max();
var result = Array.FindAll(data, x => x == max);

503:デフォルトの名無しさん
08/10/05 21:35:02
var min = data.Min()
var result = array.Where(n => n == min);
でもおk

504:デフォルトの名無しさん
08/10/05 21:35:34
>>503訂正
var result = data.Where(n => n == min);

505:デフォルトの名無しさん
08/10/05 21:41:21
みなさんありがとうござます。
早速ためしてから感謝しようとおもっておりましたが、
int[] d = {11,11,22,33,10,10};
d.Min()がない。
というような状況です。もしかして2.0には、Min,Maxないんでしょうか
(Math.Min,Maxはありましたが)

506:デフォルトの名無しさん
08/10/05 21:55:20
ああ、そう。
Min, Max は 3.0 から。

507:デフォルトの名無しさん
08/10/05 21:59:09
単に3.0って言うとややこしいぜ
.NET 3.5/C#3.0から

508:デフォルトの名無しさん
08/10/05 22:07:38
public static int[] Maxs(int[] arr)
{
int max, cnt;
if(arr.Length == 0)
{
return new int[0];
}

max = arr[0];
cnt = 1;
for(int i = 1; i < arr.Length; i++)
{
if(arr[i] == max)
cnt++;
if(arr[i] > max)
{
max = arr[i];
cnt = 1;
}
}
int[] result = new int[cnt];
for(int i = 0; i < cnt; i++)
result[i] = max;
return result;
}
こうかな?

509:デフォルトの名無しさん
08/10/05 22:10:48
>>508
もう少し短くまとめろよ・・・情けない

510:デフォルトの名無しさん
08/10/05 22:17:36
2.0 でちゃんとやると508になる気がするが。
C# 3.0 使えという話ではある。

511:デフォルトの名無しさん
08/10/05 22:18:10
>508 大変ありがとうございます。
double, floatなどでもつかえるようにしてみようとおもいましたが
==, >の比較ができなく困ってしまいました。
class MathEx
{
public static T[] Maxs<T>(T[] arr) where T : IComparable
{
T max;
int cnt;
省略
max = arr[0];
cnt = 1;
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] == max)
cnt++;
if (arr[i] > max)
{
max = arr[i];
cnt = 1;
}
}
T[] result = new T[cnt];
省略
}
}
もうちょい悩んでみます。

512:デフォルトの名無しさん
08/10/05 22:24:07
質問者です。以下でなんとかいきそうでした。
if (arr[i].CompareTo(max) == 0)
cnt++;
if (arr[i].CompareTo(max) > 0)

513:デフォルトの名無しさん
08/10/05 22:24:08
>>511
.CompareTo

514:デフォルトの名無しさん
08/10/05 22:27:46
>513
ありがとうございます。このスレでもでてきたEachForや今回のMaxsのような独自の便利
関数は、みなさんどのように管理されてるんでしょうか??なにかアドバイスあればお願い
します。

515:508
08/10/05 22:29:30
>>509
public static int[] Maxs(int[] arr)
{
int max = Int32.MinValue;
int cnt = arr.Length == 0 ? 0 : 1;

foreach(int value in arr)
{
if(value == max)
cnt++;
if(value > max)
{
max = value;
cnt = 1;
}
}

int[] result = new int[cnt];
for(int i = 0; i < cnt; i++)
result[i] = max;
return result;
}
うーん、こうかな…

516:デフォルトの名無しさん
08/10/05 22:37:19
>>515
まあ、まずまずだけど、ひとひねりほしいな
例えば再起処理を使うとかさ
forでやるのはダサイ

>>514
管理ってなんぞ?クラスで定義すればいいんじゃねーの?

517:デフォルトの名無しさん
08/10/05 22:40:25
こんなんで再帰使う方がアレだわ

518:508
08/10/05 22:41:45
よく見たらバグってんなこれ

519:デフォルトの名無しさん
08/10/05 22:55:13
>>514
適当にinternal staticなクラス作って入れとく
よほど汎用的で便利なものでなければプロジェクトごとに書き捨て

520:デフォルトの名無しさん
08/10/05 22:58:44
倹索とかで見つからなかった場合null帰すのとエラーはどっちがいいの

521:デフォルトの名無しさん
08/10/05 23:00:22
場合による
「検索」という意味合いのメソッドなら例外は投げない方がいいかも

522:デフォルトの名無しさん
08/10/05 23:00:59
>>514
CodeProjectに登録

523:デフォルトの名無しさん
08/10/05 23:02:17
>>516
なんという関数型脳w

524:デフォルトの名無しさん
08/10/05 23:06:52
この問題結構奥深いな…
最小値、最大値のセットだけでなく
2番目、3番目、そして一番多くはいってる数とか
だそうとして、
ヒストグラムに一旦入れて、やってみてたけど、朝までかかり
そうなかんじなんで、つかーれたのでエロみてくる。

525:516
08/10/05 23:14:49
おまえらバカだから答え教えてやるよ

まず、配列をList<>に入れる
その後。Sort()
あとは言わないでもわかるな?

526:デフォルトの名無しさん
08/10/05 23:18:27
>>521 そもそもnull使えない型とか…

527:デフォルトの名無しさん
08/10/05 23:25:43
null許容型もだめな型ってあるの?
あるいはDictionary.TryGetValueみたいに可否と結果を別に表す方法もあるし。

528:デフォルトの名無しさん
08/10/05 23:26:18
>>525
List<>に入れるときはforを使わず再帰処理を使うんですね
わかります

529:デフォルトの名無しさん
08/10/05 23:28:44
数字なら最大値でも返えせば

530:516
08/10/05 23:31:09
要素から最大値を抜き出す
その要素に-1を代入
また、要素から最大値を抜き出す
最初に取り出した最大値より小さい場合は
唯一の最初のが最大値

あとはわかるな?

531:デフォルトの名無しさん
08/10/05 23:32:19
タイプつかってヒストグラムできた。が馬鹿でかいものになった。
歪度とかCV、σとか無意味につけてしまった。

532:デフォルトの名無しさん
08/10/05 23:37:56
ダメだ、俺の頭では、-1を代入のところがよくわからん。。。
整数だからマイナス数値ばっかのセットだってあるんだよね

533:デフォルトの名無しさん
08/10/05 23:42:09
これに速度の差とかあるですか?

try
{
  int index = 0;
  for(;;)
  {
    if(name == list[index++].name)
    {
      break;
    }
  }
  return list[index];
}
catch(ArgumentOutOfRangeException)
{
  return null;
}

//int count = list.Count;
//for(int i = 0; count > i; i++)
//{
//  if(name == list[i].name)
//  {
//    return list[i];
//  }
//}
//retnrn null;


534:デフォルトの名無しさん
08/10/05 23:45:08
>>533
foreachのほうが早い

535:デフォルトの名無しさん
08/10/05 23:52:39
516は突っ込んだら負けなんだろうか

要素は全部0以上とか元の配列を破壊してもいいとか勝手な条件付けすぎ

536:デフォルトの名無しさん
08/10/05 23:53:23
>>530
最大値が負の数だったら?

537:デフォルトの名無しさん
08/10/06 00:00:40
エレガントな解はまだかーい?

538:デフォルトの名無しさん
08/10/06 00:08:52
>>535
>>536
屁理屈言うな

あくまで>>505の規格に即しただけ

誰が符号付整数なんて条件出したんだ?

539:デフォルトの名無しさん
08/10/06 00:11:54
元々の質問は>>499でそ

540:デフォルトの名無しさん
08/10/06 00:12:05
いや、499時点で負数出てきてるし…

541:デフォルトの名無しさん
08/10/06 00:18:21
組み紐群ならったときに、エレガントな方法あったきがする。。。
が教科書すら全部研究室おいたまま10年以上たっとるな。

542:デフォルトの名無しさん
08/10/06 00:36:00
ApplicationExceptionじゃなくて
ArgumentOutOfRangeExceptionとか
InvalidOperationExceptionとか
中の人以外が勝手に使ってもいいの?

543:デフォルトの名無しさん
08/10/06 00:46:30
真面目な話、いくらふらっとスレだからって、>>499ってそんな悩む問題なのか?
そっちの方が悩ましい問題だ。
こんなのベタにやればいいだけじゃん。
間違いなく(負の数について簡単に説明してやりさえすれば)小学生でも書けるコードにしか思えないんだが。

544:デフォルトの名無しさん
08/10/06 00:47:13
>>542
ApplicationExceptionは黒歴史になりました

545:デフォルトの名無しさん
08/10/06 00:51:22
>543
小学生でも書けるかもしれないが、万人が使いたくなるような
汎用的なもの、もしくは、ロジックがみためにも美しいもの
をつくるのは、難しいぞ。

そんなに簡単に書けるコードだというのなら、手本をみせてほしい。
ヒストグラムに入れるという方法が私には、なるほど!と思わせてくれた。

546:デフォルトの名無しさん
08/10/06 00:57:52
>>545
何を言っているのか意味がわからん。
汎用的?
汎用的かどうかがコードの書法によって変わるとでも言うのか?w


547:デフォルトの名無しさん
08/10/06 01:02:27
振る舞いが重要であり、内部の構成には興味ありませんね
>>545は概念から学べ

548:デフォルトの名無しさん
08/10/06 01:04:26
証明の結果よりも、証明の仕方に興味があるタイプです。

549:デフォルトの名無しさん
08/10/06 01:06:42
なら数理論理学でも学べよ
C#とは関係ない

550:デフォルトの名無しさん
08/10/06 01:13:31
>>548
それ自体はいいと思うんだが、だからといって三平方の定理レベルの話題で
悩むのはヤバいだろう。

551:デフォルトの名無しさん
08/10/06 01:17:20
三平方の定理=立方体の体積の出し方だと思った俺の居場所は

552:デフォルトの名無しさん
08/10/06 01:22:04
乱数なんてらんだむっぽいのがでりゃいいんだよ。
メルセンヌツイスターなんていらんわ。

553:デフォルトの名無しさん
08/10/06 01:25:34
C#ってなんでメソッドの引数でデフォルト値を廃止してしまったんですか(´・ω・`)?

554:デフォルトの名無しさん
08/10/06 02:16:15
>>553
メソッドオーバーロードで解決できるから
この質問いつも出るからテンプレに入れないか?

555:デフォルトの名無しさん
08/10/06 02:18:06
>>554
C++もメソッドオーバーロードは実装してません?

556:デフォルトの名無しさん
08/10/06 02:21:44
関数オーバーロードでデフォルト引数が表せるのだから
デフォルト引数なんていう分かりにくいものは使わないようにしようという方針

557:デフォルトの名無しさん
08/10/06 03:12:09
C++作ったBjarneも多重定義があればデフォルト引数なんて構文糖、みたいなことを自著に書いていた気がする。

558:デフォルトの名無しさん
08/10/06 03:46:50
デフォルト引数の方が直感的じゃないですか?

多重定義もいいですけどコードが冗長になって保守・管理が面倒くさくなりそうですが・・・

559:デフォルトの名無しさん
08/10/06 08:35:26
デフォルト引数はオーバーロードで出来ても逆は無理だろ。その時点で
どっちがなんて議論じたい意味なし

それとシグニチャと呼び方もよろしくない、デフォルト引数は

560:デフォルトの名無しさん
08/10/06 08:49:34
ドキュメントの保守が面倒だったりはしないのかね
ある機能の説明がオーバーロードされたメソッドごとにあるから
必然的に重複が多くなるし

561:デフォルトの名無しさん
08/10/06 09:13:27
デフォルト引数って、使う人が結局その値を理解する必要があるからね。
単に、無い、という方が安全だよね。

562:デフォルトの名無しさん
08/10/06 10:05:26
デフォルト引数無いのがC#の最大の欠点

563:デフォルトの名無しさん
08/10/06 10:16:24
敢えて無くしたのに
それを欠点と思ってるようじゃC#は向いてないよ

564:デフォルトの名無しさん
08/10/06 10:18:40
public void foo(bool bar = true){
 ・・・
}
で済むところを

public void foo(){
 foo(true);
}

public void foo(bool bar){
 ・・・
}
なんてダラダラ書くのは無駄すぎるな

565:デフォルトの名無しさん
08/10/06 10:29:43
オーバーライドすると途端にカオス

566:デフォルトの名無しさん
08/10/06 10:50:24
デフォルト引数は構造上、後ろから設定しなくてはならないし歯抜けができない。

567:デフォルトの名無しさん
08/10/06 12:42:12
文句があるならC++使えばいいじゃん

568:デフォルトの名無しさん
08/10/06 12:43:36
C++なんかもっと欠点だらけだろ

569:デフォルトの名無しさん
08/10/06 13:06:49
usingとかDisposeを多用しなきゃならん状況になると
C++ならもっと簡単に書けるのに、とか思ってしまう。

570:デフォルトの名無しさん
08/10/06 13:15:31
まそりゃ適材適所
C++の方が簡単に書けるならC++で書けばいい
DllImportだってC++/CLIによるラップだってできるんだから

571:デフォルトの名無しさん
08/10/06 13:20:35
VisualC#2008を使っています。
C#をコンソールからコンパイルする方法を知りたいです。
csc filename.cs
でよいらしいのですが、cscにパスが通っていないようです。
cドライブをcscで検索しても見つからないです。
どなたかご教示いただけないでしょうか。


572:デフォルトの名無しさん
08/10/06 13:25:26
スタートメニューに.NET 2.0 SDKみたいな項目あるだろ
それのSDKコマンドプロンプト使え

573:デフォルトの名無しさん
08/10/06 13:43:18
>572
ないです。
Microsoft Visual C# 2008 Express Edition
はあります。

普通の(WindowsXP標準の)コマンドプロンプトではだめなんですか?


574:デフォルトの名無しさん
08/10/06 13:50:10
C:\WINDOWS\Microsoft.NET\Framework\v3.5\csc.exe filename.cs
コンパイラのパスは環境によって違うかも分からん
もしくは環境変数PATHにC:\WINDOWS\Microsoft.NET\Framework\v3.5をついかして
csc filename.cs
とかシステム環境変数に入れたくなければ
set PATH=C:\WINDOWS\Microsoft.NET\Framework\v3.5;%PATH%
みたいなバッチファイルを用意してそれを使うとか

575:デフォルトの名無しさん
08/10/06 13:51:35
%windir%\Microsoft.NET\Framework\v?.?
にあるからなあ、検索時Windowsのディレクトリは除外してたかな。

576:デフォルトの名無しさん
08/10/06 13:55:05
標準のコマンドプロンプトからなら、vcvars32.batを実行すりゃいけるよ。
探してパス通ったとこにコピーしておいてみては。

577:デフォルトの名無しさん
08/10/06 13:57:50
>574、575
あ、ありました。Prorgam Fliesばっかり探してました。
Windowsの下だったのですか。
検索はシステムファイルは除いていたかもしれません。
ありがとうございました。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch