ふらっとC#,C♯,C#( ..
[2ch|▼Menu]
237:デフォルトの名無しさん
08/10/18 21:29:42
>>227でいい加減なこといってると思われそうな箇所は、

>2ちゃんレスレベルなど、ハッシュ計算の自体の方がはるかに負荷が大きい。
ディスク読み込みよりもハッシュ計算の方がはるかに思いといってるように読めるかもしれない。
→ここで書いたのは文字列比較よりもはるかに重いという意味

あとは、なんだ、ハッシュを暗号関連のハッシュではなく、.NETでのGetHashCodeによる
ハッシュの意味と思われてる可能性があるのかもしれないが、GetHashCodeの値はそもそも
ディスクに永続化なんぞしちゃいけない情報なのでこういう用途にはもともと使えないから除外してる。

あとはどこかいな?


238:デフォルトの名無しさん
08/10/18 21:32:08
あとGetHashCodeじゃ現実的に衝突を考慮する必要も出てくるだろうから使えないしね。


239:デフォルトの名無しさん
08/10/18 21:39:41
>>234
ハッシュを使う価値があるのは同じ文字列を複数回比較に使う場合
代表的にはn個の文字列の中に同じものが含まれるかどうかといった場合だ
文字列が長いとどうだとか瑣末な問題を全てであるかのように語っているのがいい加減だ

240:デフォルトの名無しさん
08/10/18 21:45:47
Dictionary<int, List<string>> cache = new Dictionary<int, List<string>>();
int hash;
List<string> sl;

foreach(string str in getStrings())
{
hash = str.GetHashCode();

if(!cache.ContainsKey(hash))
{
sl = new List<string>();
cache[hash] = sl;
}
sl.Add(str);
}

string input = Input();
hash = input.GetHashCode();
if(cache.ContainsKey(hash))
{
sl = cache[hash];
if(sl.Contains(input))
Console.WriteLine("一致");
}
205じゃないけどhash使う場合ってこんな感じになんの?

241:デフォルトの名無しさん
08/10/18 21:49:35
cache.TryGetValue(hash, out sl);
if(sl == null)
{
sl = new List<string>();
cache[hash] = sl;
}
こうか

242:デフォルトの名無しさん
08/10/18 21:50:48
それだと意味無いだろ
ハッシュの計算結果を使いまわさないと

243:デフォルトの名無しさん
08/10/18 21:55:07
>>239
んなもん今回のケースと全く合わないから触れもせんかったわ。
最初から今回のケースに関わる場合という前提で書いたから。


244:デフォルトの名無しさん
08/10/18 21:59:09
そういうハッシュも含めて文字列の長さが全てなんて言った覚えはない。
だいたい最初から一致判定の話あって、検索の話を書いてるのはお前だけだろう。
無論それを確認する意味はあるが、俺はあくまで用途がだいたい見えた状況以降を見て書いてる。

245:デフォルトの名無しさん
08/10/18 21:59:47
>>243
今回のケースなら、同じ文字列を複数回比較に使わんのだから
文字列が長かろうと短かろうとハッシュを使う理由はない

246:デフォルトの名無しさん
08/10/18 21:59:53
>>242
> ハッシュの計算結果を使いまわさないと

string input = Input();
hash = input.GetHashCode();
if(cache.ContainsKey(hash))
{
sl = cache[hash];
if(sl.Contains(input))
Console.WriteLine("一致");
}

の部分がループしてて何回も入力がある場合は意味があるって意味?

247:デフォルトの名無しさん
08/10/18 22:03:58
俺も>>227はいい加減なこと言ってると思う。
少なくとも結論は間違ってる。
つまりハッシュを使う意味は>>216のケースではありうる。

こんな説明は無用だとは思うが、ハッシュの実装はいろいろありえて、
全文比較をするより軽くてかつそれなりに使える実装は考えうると思われる。

極端な話、>>216の用途に特化するなら文字数(バイト数)でもいい。

キャッシュしてあるデータのハッシュ値は事前に用意できることも考慮に入れれば、
全文を比較するよりずっと軽いと思う。

248:デフォルトの名無しさん
08/10/18 22:04:35
>>245
やっぱり分かってないだろう。
文字列がかなり長いなら、ハッシュだけをディスクから読むことで効率化どきる可能性がある
って最初からそれを言ってるだけなのに。
それも可能性はあるって書き方しかしてないのに。

249:デフォルトの名無しさん
08/10/18 22:05:04
> hash = input.GetHashCode();
GetHashCode()のコストは高いので、このhashを何回も使い回すような
状況じゃなければ、直接文字列比較した方がよい、って意味。
1回比較して捨てちゃうんだったら意味ない。

250:デフォルトの名無しさん
08/10/18 22:10:48
C#ってネイティブコードも出せるんだっけ?

251:デフォルトの名無しさん
08/10/18 22:12:54
長さ比較レベルなどただの文字列比較でも最初にやってる。
そして今回のケースは違う場合を調べたいのだから、一致しても結局全文検査が必要。
暗号ハッシュなら現実的に一致は無視できるが。
暗号ハッシュじゃなくて現実的に一致を無視できるようなハッシュは作れるかもしれんが、
それは全文検査が必要だということは分かるだろう?
つまり最初から全文一致検査したほうが早い。
よって、ディスクから読むなど、対象文字列の準備に負荷がかかる場合しか意味がない。

あと俺はもともと、キャッシュした場合の話も書いてる。


252:デフォルトの名無しさん
08/10/18 22:13:31
>>249
ほうほうなるほど、そんな重いのか
適当に数千件の文字列食わせてhash使わない実装と比較してみる
ありがと

253:デフォルトの名無しさん
08/10/18 22:17:37
>>250
もちろん

254:デフォルトの名無しさん
08/10/18 22:19:31
>>251
>現実的に一致を無視できるようなハッシュ
そんなものは必要ないんだよ。
元のデータが違っててもハッシュ値が一致する確立が十分小さければ必要十分。
分かってるのかな

255:デフォルトの名無しさん
08/10/18 22:20:36
>>248
ハッシュを作るには長い文字列をまずディスクからとってくる必要がある
このケースでは文字列を一回しか読まないんだからハッシュを使う意味はない

>>249
Dictionaryの方のハッシュが何回も使われている
文字列の長さ×文字列数の比較が
文字列の長さ分のハッシュ値の取得になっている
ものすごく意味あるだろ

256:デフォルトの名無しさん
08/10/18 22:25:51
今回のケースは、それほど長くない文字列が大量に保存されていて、
最新の情報で変化があったものだけを抽出したい。
ディスクに対象の文字列がすでに大量に保存されている。

もし一つ一つの文字列がかなり長いなら、文書を保存する際にそれぞれ暗号的なハッシュを求めて
ディスクに保存しておき、比較時は最新の文字列のハッシュを計算、ディスクからはハッシュだけを読むことで、
長い文字列を大量に読み込む負荷を節約できる。
ハッシュだけならそもそも事前ににディスクからすべて読み出しておくこともできる。

だが文字列が短いならそもそも全文を事前にディスクからよんでキャッシュしておけば、
いちいちハッシュ計算するよりも全文一致検査の方が早い。

だから文字列がかなり長くないと意味がない。
文字列がかなり長いなら意味がある可能性はある。


257:デフォルトの名無しさん
08/10/18 22:29:10
>このケースでは文字列を一回しか読まないんだからハッシュを使う意味はない

今回のケースの用途から察するに、この処理を定期的に繰り返すんだろ。
おれはその想定で書いてる。
取ってきた文字列を保存するときに、ハッシュも同時に求めて保存しておく。

変更のある文字列は一部だと俺は予想していた。
これはまあ実際には違うかもしれないな。
だからほとんどの文字列は何度も比較されるから、ハッシュを事前に求めて保存しておく意味があると考えた。
多くが変わるのなら意味はない。


258:デフォルトの名無しさん
08/10/18 22:29:24
>>256

>>216
>チェックするため、手元にコピーしておいた過去の文字列と、たった今web上
>から落としてきた文字列を1つ1つ照らし合わせながら比較していきます。

ちゃんと嫁

259:デフォルトの名無しさん
08/10/18 22:33:59
>>256
>いちいちハッシュ計算するよりも全文一致検査の方が早い

だからハッシュっていったっていろんな実装がありうるっていってるのに。。
例えば簡単な一例として、下位2バイトが文字列のバイト数、上位2バイトが文字列の
真ん中の文字の文字コードとする4バイトの値を生成するハッシュ関数でも
それなりに使えそうだし、これなら比較よりずっと軽そうなのは想像できるでしょ?



260:デフォルトの名無しさん
08/10/18 22:39:59
>>258
どういうこと?

俺が想定していたのはこんな感じなわけ。

数千件のデータがあり、定期的に最新のものをとりに行く。
で変わったものだけを抽出して何か処理したい。
変わっているとしてもごく一部のデータの場合が多く、全く変わっていない場合もある。

変わっていた場合は、変わっていた文字列を最新情報として保存しなおすんだと思った。

>>216を読んでこう予想したわけだけど。
何かとんでもなく読み違えているかな?

まあともかく俺は、上のように予想して、なら文字列が長いならハッシュを利用する意味がある
可能性はあるだろうと書いた(ここでのハッシュは一応暗号的なハッシュ)。
しかし今回は文字列の一つ一つは短いらしいから意味はないと書いた。


261:デフォルトの名無しさん
08/10/18 22:43:37
>>259
あのな、ハッシュを計算して比較して、で、どうするわけ?
変わってるものを抽出したいんだろう?
ならそんな方法でハッシュを計算しても、一致した場合、
結局全文を一致検査しないと本当に変わってないかは分からない。
※そんなハッシュ計算じゃ一致しても本当に変わってないかチェックが必要なのはわかるだろう?

ハッシュが違った場合、確実に変わっていると判断できるが、
一致した場合は結局全文の検査が必要だろうが。


262:デフォルトの名無しさん
08/10/18 22:47:22
>>261
もともとハッシュというのはそういうものだから。
それでも>>254に書いたとおり、元のデータが違っていてもハッシュ値が一致する
確率が十分小さければ意味がある。

小学生でもわかる理屈だと思うけどなこれ。

263:デフォルトの名無しさん
08/10/18 22:50:34
>>259
ほとんどがガラッと変わってる前提で、変わってないものを抽出したいなら意味はあるかもしれないが、
Webの情報というと、文字列の一部だけが変わってる可能性もあると予想できる。

長さが変わってる可能性は高いだろうが、それは文字列のただの一致判定でも最初にチェックされるから、
わざわざハッシュでやる意味はない。

そういう簡単なハッシュの意味が出るとしたら、文字列の多くの場所が変わってる前提
かつ、数千件の文字列の多くが変わっている場合だろう。

おれはそんな前提とは思えなかった。


264:デフォルトの名無しさん
08/10/18 22:54:36
>>262
>それでも>>254に書いたとおり、元のデータが違っていてもハッシュ値が一致する
>確率が十分小さければ意味がある。

それには、>>263で書いたような前提が必要。
ガラッと変わっていない文字列でも一致の可能性を低くするには、
文字列の多くの場所を検査する必要があり、そうなるとただの一致検査に対する
パフォーマンスのメリットも小さくなる。
その上偶然一致する危険も無視できない。
無視できるほど小さくするには、文字列のずべてを使う必要がある。

まあ、ちょっとくらい違っても一致でいいやって思ってるなら、
そもそも話が合わないのでもういい。


265:デフォルトの名無しさん
08/10/18 22:57:59
>>264
だから無視できるほど小さくする必要なんてないんだってば。。
アバウトな言い方をすれば、一致する確率が両者の方法のパフォーマンスの比より
小さければ十分でしょ。

そしれそれがそんなに実現困難な目標とは思えん。

266:デフォルトの名無しさん
08/10/18 22:59:31
>>262
>>261
>もともとハッシュというのはそういうものだから。

それはハッシュテーブルなどで使う用途。
結局一致した場合は後できちんと一致比較する前提。
GetHashCodeなどの場合(といってもGetHashCodeも全文使って重いが)。

で、暗号的なハッシュは、現実的にそれが無視できるほど確率が低い。
もともと似た文字列で一致することがないように設計されているから。


267:デフォルトの名無しさん
08/10/18 23:07:23
>だから無視できるほど小さくする必要なんてないんだってば。。
>アバウトな言い方をすれば、一致する確率が両者の方法のパフォーマンスの比より
>小さければ十分でしょ。

それが意味があるのは、文字列の多くが変わってる可能性が高い場合。
その場合は、ハッシュが一致することが少ないので、変わってることを早く確認できる。
一致した場合のみ、全文確認すればいいから。

でも何度もそうは思えないって書いてる。
多くの文字列が変化してないなら、多くの場合ハッシュは一致するんだから、
多くの場合に全文の一致検査が必要になる。
つまりメリットは少ない。

つうかな、長さの比較レベルまでハッシュに含めたら、
もはやハッシュの話を別にする意味ないだろ。
それは単なる文字列の一致検査の実装のチューニングだ。
多分そういう感覚でいってるんだな?
なんとなく話題にしてるハッシュの前提が根本的に違うことは分かったわ。


268:デフォルトの名無しさん
08/10/18 23:12:56
初心者おいてきぼりのこの展開

269:デフォルトの名無しさん
08/10/18 23:19:44
あとな、全文一致検査でも頭から見て違った時点で検査は終わるんだから、
ガラッと変わってれ場合はかなり速い可能性が高い。
でもガラッと変わってなければ、簡単なハッシュじゃ一致する可能性が高い。
単なる長さ検査なら全文一致検査でも既にやってる。

やっぱりあんまり効果があるとは思えない。

270:デフォルトの名無しさん
08/10/18 23:27:26
おーい>>205生きてるか〜?


271:デフォルトの名無しさん
08/10/18 23:37:07
ハッシュってのは衝突しないのが前提だぞ。
ハッシュが一致してたら一致、一致してなければ不一致とみなす。
そうじゃないと世の暗号や署名なんか成り立たないじゃないか。

んで、本題に戻ると、文字列比較なんかREPE CMPSBすりゃ一発だから、
単純比較のためにハッシュを利用する意味はない。IOを考慮するなら
確かに意味があるケースもあるような気はするが。

272:デフォルトの名無しさん
08/10/18 23:48:31
まあ、今の話は暗号ハッシュとそうじゃないハッシュ、さらに、不一致をざっと確認するハッシュもどきまで話に出てきてるからね。

まあさすがに長さ検査はハッシュとは呼ばんと思うが。


273:デフォルトの名無しさん
08/10/18 23:51:52
まあこのスレ的には
最低限の常識さえ踏まえていれば後は実際に問題になってから考えればいい

274:205
08/10/19 01:33:09
>>270
((((((;´・ω・))))))ガクガクブルブル

275:デフォルトの名無しさん
08/10/19 02:35:53
>>271
逆操作が難しいってのは暗号に使うハッシュ関数の特徴であるけれども、
それは衝突が起こらない/起こりにくいという意味ではない。

そもそも128bitとかそこらで、どれだけの長さの文字列が表現できると思ってるんだ。

276:デフォルトの名無しさん
08/10/19 02:51:10
Imageクラスに入っている画像から24bit/RGBそれぞれのbyte配列を得たいのですが、
GetPixelでは遅すぎて困ってます。

高速に処理するにはどうしたらいいのでしょうか?

// Image imgを
// byte[] r;
// byte[] g;
// byte[] b


277:デフォルトの名無しさん
08/10/19 02:53:37
ImageにGetPixelはねーだろ

278:デフォルトの名無しさん
08/10/19 03:04:14
>>275
長さ?


279:デフォルトの名無しさん
08/10/19 03:09:49
MSはなんでgetpixelみたいな誰が見ても糞なやつを実装したんだ?

280:デフォルトの名無しさん
08/10/19 03:11:55
>>278
128bitの空間でハッシュが衝突しないようにするには、
どれだけの長さまでの文字列を保持できるのか、って話なんじゃね。

281:デフォルトの名無しさん
08/10/19 03:27:09
長さは関係ないでしょ。

282:デフォルトの名無しさん
08/10/19 03:28:39
同じハッシュが生成される文字列がいくらあろうが(っていうか無限にあるわけだが)、
現実に衝突発生の「確率」が低ければよい。


283:デフォルトの名無しさん
08/10/19 03:31:14
>>275
一般に確率的にしか衝突を起こせない場合、
十分なビット数があればそれでいい。
そして普通はそれを、衝突が発生しにくい、という。
そして、暗号ハッシュは衝突が発生しにくいのが大前提、と表現する、普通は。


284:デフォルトの名無しさん
08/10/19 03:32:47
逆操作が難しいだけじゃ暗号ハッシュとして使い物にならない。


285:デフォルトの名無しさん
08/10/19 04:33:09
>>276
ちょうどいい記事があった。
URLリンク(www.atmarkit.co.jp)

286:デフォルトの名無しさん
08/10/19 06:19:51
コピー元の値(参照型)を変更すると、コピー先の値も変更されるようにするにはどうすればいいでしょうか。
具体的には、

class A
{
public string text;
public A(string text) { this.text = text; }
}

int main()
{
string text = "abc";
A a = new A(text);
text = "def";
Console.WriteLine(text);
Console.WriteLine(a.text);
}

で、最後の出力がどちらも def になるような動作にしたいのです。

287:デフォルトの名無しさん
08/10/19 06:23:20
C#にそのような機能はありません

288:デフォルトの名無しさん
08/10/19 06:45:23
なるほど、無理ですか。もう一度構造見直して考えてみます。
どうもでした!

289:デフォルトの名無しさん
08/10/19 09:43:51
>>276
>>285はなんでこんな変なことしてるんだろう
普通はBitmap.LockBitsを使う

290:デフォルトの名無しさん
08/10/19 09:51:18
まだ2003も出てない時期の記事だぜ?
色々定石とかできてなかったんだよ

291:デフォルトの名無しさん
08/10/19 10:55:20
>>276
「MemoNyanDum」
URLリンク(junki.lix.jp)
こちらのサイトのここを見るといい
「C#(GDI+) : Bitmap の内部色データにアクセスする (1)」
URLリンク(junki.lix.jp)

292:デフォルトの名無しさん
08/10/19 19:53:30
VS2005のエディタ上でスラッシュ(/)を3回連続で打ち込むと突然

/// <summary>
///
/// </summary>

に変換されるんですがこれなんですか?

293:デフォルトの名無しさん
08/10/19 19:55:29
XMLドキュメント

294:デフォルトの名無しさん
08/10/19 19:57:47
XMLの書式でしたか。
ちなみにスラッシュ2回じゃ何もおこらず、3回目で変換された理由は何でしょう?

295:デフォルトの名無しさん
08/10/19 20:02:55
2回で起こったらおちおちコメントも書いてられんわw

296:デフォルトの名無しさん
08/10/19 20:03:13
や、ヘルプで調べろよ

297:デフォルトの名無しさん
08/10/19 20:17:14
//の後ろにはコンパイルされないコメントが書けるとか書けないとか

298:デフォルトの名無しさん
08/10/19 20:18:38
ちょっと質問を。

構造体を返すメソッドを記述しているんだけどエラーが発生したときの処理に困ってる。
エラーを探知したら終了させるようにしたいんだけどコンパイルするときに
「構造体を返すメソッド書いてんだからエラーが発生したときもちゃんと構造体を返せ( ゚Д゚)ゴルァ!!」
って怒られちまった。

エラーが発生したときに返す構造体なんて全く想定していなかったわけだがこういうときって
何を返せばいいんだろうか?

ちなみに
return null;
じゃコンパイルは通らなかった。

299:デフォルトの名無しさん
08/10/19 20:22:56
そもそもクラスでなく構造体を使う意味がわからんけど、
空の構造体でも返せばいいんじゃね?

300:デフォルトの名無しさん
08/10/19 20:29:12
>>298
>「構造体を返すメソッド書いてんだからエラーが発生したときもちゃんと構造体を返せ( ゚Д゚)ゴルァ!!」
そんなこと言うわけないと思うが。

こんなスレで質問するご身分なんだから、コンパイラ様のお言葉を勝手に意訳せずに
「ありのまま」書くべきなんじゃないのか?


301:デフォルトの名無しさん
08/10/19 20:29:12
値を返せないような場合は例外投げるしかないんじゃね?
でTry...パターンを追加

302:デフォルトの名無しさん
08/10/19 20:29:40
>>299
複数個のデータを効率よく渡そうと思って構造体を使った。
クラス的な活用方法はしないから構造体で十分かなと。

> 空の構造体でも返せばいいんじゃね?

return new myStruct();

↑こういうこと?こんな方法使っていいのかな?

303:デフォルトの名無しさん
08/10/19 20:32:50
>>298

intを返すメソッドで何らかの例外的な場合には0や-1を返したりするだろ。
nullを返すか?
クラスじゃなくてあえて構造体を使うなら、初期状態の構造体を返すなり
構造体メンバにフラグやメッセージを含めてそれにわかるようなもんを入れて
返したりするのがいいんじゃね

304:デフォルトの名無しさん
08/10/19 20:34:58
ここはCスレかと

305:デフォルトの名無しさん
08/10/19 20:41:13
エラーが起きて値が返せないなら例外を投げればいいだけだと思うが。

306:デフォルトの名無しさん
08/10/19 20:41:43
>>302
同じ意味だけどreturn default(myStruct);の方が誤解を生まない

307:デフォルトの名無しさん
08/10/19 20:41:57
例外投げるかnullable使えよ

308:デフォルトの名無しさん
08/10/19 20:42:45
> 同じ意味だけどreturn default(myStruct);の方が誤解を生まない

こんな方法があったとは・・・
C#って奥が深いな・・・

309:デフォルトの名無しさん
08/10/19 20:42:52
Nullableは意味のあるnullに使うものだと思うんだけど

310:デフォルトの名無しさん
08/10/19 21:02:52
そうでもない

311:デフォルトの名無しさん
08/10/19 21:20:21
戻り値が必須のメソッド内でも

throw Exception()

すれば戻り値設定しなくてもコンパイル通るの?

312:デフォルトの名無しさん
08/10/19 21:21:24
やってみればいいんじゃね?

313:デフォルトの名無しさん
08/10/19 21:39:58
>>311
愚問だよ。
例外を投げるって意味が分かってる?

314:デフォルトの名無しさん
08/10/19 21:48:18
>>311
当たり前の事だが、正常処理の戻り値は設定する必要はあるぞ。
で、例外というのは、その正常処理を続行出来なくなった時に、
処理を強制終了させる仕組みだから。

315:デフォルトの名無しさん
08/10/19 22:51:55
>>311
new がないからコンパイルは通らんね。

316:デフォルトの名無しさん
08/10/19 23:18:23
System.Exception Exception(){ return new System.Exception(); }

317:デフォルトの名無しさん
08/10/19 23:22:06
次は文末のセミコロンが無いから……

318:デフォルトの名無しさん
08/10/20 00:32:22
C#にてDWM(WindowsVistaのAeroグラス)をウィンドウに適用する方法についての
詳細な方法や情報はありませんか?

ちょっと好奇心でやってみたらどうもうまく行かなくて突っかかっています

319:デフォルトの名無しさん
08/10/20 00:40:36
>>318
単純な例で良ければ。
URLリンク(msdn.microsoft.com)

320:デフォルトの名無しさん
08/10/20 00:41:01
> 同じ意味だけどreturn default(myStruct);の方が誤解を生まない

残念だが同じ意味ではない。
return default(myStruct);
の方がいいのは事実だが。


321:デフォルトの名無しさん
08/10/20 00:44:44
>>318
ごめん>>319じゃほとんどコード無かったから、代わりにこっちを。
URLリンク(www.danielmoth.com)

322:デフォルトの名無しさん
08/10/20 02:00:10
NPlotを使って散布図を描こうと考えています。
二次元配列で格納してあるデータをそれぞれX軸Y軸に対応させて
linePlot.AbscissaData = test[j,0];
linePlot.OrdinateData = test[j,1];
のように設定しfor文でjを変えてデータをどんどんグラフに点を加えさせていきたいのですが上手くいきません。
どのように設定すればよいのか、ご存知の方ご指導お願いします

323:デフォルトの名無しさん
08/10/20 02:03:17
STLでよく使うイテレータってC#でも使う?

324:デフォルトの名無しさん
08/10/20 04:38:46
>>322
それforで回したら上書きされて最後のデータしか残らないやん
AbscissaDataとOrdinateDataにはコレクション入れるんでないの?

325:デフォルトの名無しさん
08/10/20 06:22:22
graphicsメンバに1ドットだけ描画するメソッドが見あたらないのですが、
1ドットだけ描画するにはどうすればいいのでしょうか?
drawlineで 1,1,1,1 にしても何も表示されませんでした。

326:デフォルトの名無しさん
08/10/20 09:21:58
ドットなんて概念を排除してるからねー
FillRectangleで代用かな

327:デフォルトの名無しさん
08/10/20 11:41:14
STLみたいな柔軟な使い方はない。
基本的には前方読み取りのみだから。


328:デフォルトの名無しさん
08/10/20 12:29:36
C#を始めたばかりなので上手く質問が出来るのか分からないのですが

今、平均点を求めるクラスを作り
heikinten Asan = new heikinten();
でAさんの平均点を求めることが出来るようになりました

これをAさん固定ではなく
Bさん、Cさん、、、、Zさんなど
いろいろな名前が記載されてるname.txtから人数を数えて
その人数分だけそれぞれ平均点を求めたいと思っています
人数に応じて動的にheikintenクラスをオブジェクト化する方法は無い物でしょうか

こんな方法もあるぞみたいなのがありましたら教えていただけないでしょうか
よろしくお願いいたします




329:デフォルトの名無しさん
08/10/20 12:57:55
List<heikinten>
heikinten[]


330:デフォルトの名無しさん
08/10/20 13:01:08
>>328
人数を数える方法はいいのかな?
人数がわかればその分だけList<heikinten>に突っ込めばいいんじゃないかな?
List<heikinten> people = new List<heikinten>();
for (int i = 0; i < 5; i++)
  people.Add(new heikinten());

331:デフォルトの名無しさん
08/10/20 13:17:24
訂正:
for分のi<5は人数を入れてね

List<heikinten> people = new List<heikinten>();
for (int i = 0; i < 人数; i++)
  people.Add(new heikinten());


332:デフォルトの名無しさん
08/10/20 13:24:02
heikintenクラスに突っ込みたくてならないのだが
StudentクラスにAverageメソッド用意するのが普通だろうと

333:デフォルトの名無しさん
08/10/20 13:48:30
>>329->>332
思った通りのことが出来ました
ありがとうございます


人数を数える方法は 改行コードをカウントして行けばいいかなと思っていますので
ファイル操作周りを勉強してやって行こうと思います




334:デフォルトの名無しさん
08/10/20 14:02:59
計算した値を返すメソッドを実装しています。

中には計算が無意味なケースもあり、そういうときはNullableの変数を返して
大元の呼び出しもとでの処理に役立てようと思っています( .hasValueフィールドで
Nullableかどうか判別がつきます)。

そこで普通の変数と、Nullableの両方を返すメソッドを書くことにしました。

public Nullable<int> Method(int x)
{
   ・・・(処理)・・・
   if (計算が無意味なケース)
   {
       return Nullable<int> null;
   }
   return (計算結果);
}

↑のように実装したところ、return Nullable<int> null; のところでエラーが出てしまいました。
そこでこの部分を、

Nullable<int> i = null;
return i;

としたところ問題なく通ったのですが、Nullableを返すためだけにわざわざNullable型の変数iを
宣言してやる必要はあるのでしょうか?なにか無駄なことをやっているような気がしてならないのですが。

335:デフォルトの名無しさん
08/10/20 14:10:58
return null;
でいいんじゃないかな
return Nullable<int> null;はたとえばintの3を返すときに
return int 3;
とかやるようなもんだべ

336:デフォルトの名無しさん
08/10/20 14:27:15
>>335
> return null;
> でいいんじゃないかな

( ゚д゚)!

うわぁ・・(;´・ω・)、それで通っちゃいましたorz・・・

お騒がせしてすいません(´・ω・`)

337:デフォルトの名無しさん
08/10/20 15:38:22
>>334
余計なお世話かもしれんが、int.TryParseとかDictionary<T>.TryGetValueみたいに

Public bool Method(int value, out int result){
{
   ・・・(処理)・・・
   if (計算が無意味なケース)
   {
       return false;
   }
   result = (計算結果);
return true;
}

こうした方が良くないかね?

338:デフォルトの名無しさん
08/10/20 16:11:00
>>337
処理を明確化する意味でもNullableを使わずにbool値を使った方がいいでしょうか?

逆にNullableを活用すべき分野はどういったところでしょうか?

339:337
08/10/20 16:18:23
>>338
俺は使ったことないから分からんけど、たとえばPoint構造体を使って座標計算をするときに、
普通にPoint p = new Point(); とやるとX=0,Y=0の構造体ができちゃうけど、それをそのまま座標計算に
使われると困ってしまうような設計のクラスライブラリとかで、Nullable<Point>とかを使うとか。
あくまで想像だが。

処理を分岐させたいだけだったらやっぱり>>337の方法にすべきだと思う。

340:デフォルトの名無しさん
08/10/20 16:21:31
out を使うのは負けだと思ってる・・・

341:デフォルトの名無しさん
08/10/20 16:22:29
>>338
よく使われる例だけど
データベースなどでは、通常の(有効な)値と null(無効な値)を取る型が使われる為、Nullable型があると便利。

342:デフォルトの名無しさん
08/10/20 16:30:07
まとめますと

-データベースや行列のように大量のデータを一括して扱うときにNullable型を活用すると
 処理に一貫性が出て楽

-一つ一つの処理を確実に行いたいときは戻り値にbool型で計算の可否を判定、計算結果の値は
 参照型として渡す

というのが定石ということですね?

343:デフォルトの名無しさん
08/10/20 16:37:58
参照型じゃなくて参照渡しな

344:デフォルトの名無しさん
08/10/20 17:44:56
すいません質問です。
publicなフィールドと両方publicな自動プロパティ、具体的に動作が異なるのはどんな時でしょうか?

345:デフォルトの名無しさん
08/10/20 17:50:36
>>344
virtual とかできる。

346:デフォルトの名無しさん
08/10/20 17:57:05
数字を指定したスペースに表示させたいのですが、

Console.Write("{0,10}", num);

上記の例は数字numを10桁分のスペースに右詰めで表示させよ、という意味です。
この「10桁分」のところを変数にして、状況に応じて任意のスペースにさせたいのですが
プログラムはどう書けばよろしいでしょうか?

任意のスペースを表す変数を n とします。

おそらく
Console.Write("{0, n}", num);
とするとエラーが生じてしまうと思います。
他に方法はあるでしょうか?

347:デフォルトの名無しさん
08/10/20 18:08:43
string fmt = "{0," + n.ToString() + "}";
Console.WriteLine(fmt, num);

348:デフォルトの名無しさん
08/10/20 18:09:22
C#で画像ビューア作りながら勉強しているのですが、Google Picasaみたいな
画像一覧部分でのスムーススクロールってどうやるのでしょうか?

ListViewで画像一覧は出せたのですが、スムーススクロールもやってみたいのです。
画像に限らずスムーススクロールの仕組みを教えていただけるとありがたいです。

349:デフォルトの名無しさん
08/10/20 18:20:05
>>345
逆に言えばvirtualをつけなければ、同じなんですね。ありがとうございました。

350:デフォルトの名無しさん
08/10/20 18:26:56
>>347
どうもです

351:デフォルトの名無しさん
08/10/20 18:36:30
プロパティかフィールドかっつう最も大きい違いがあるがな

352:デフォルトの名無しさん
08/10/20 19:57:56
プロパティは参照渡しできないし値型のときはコピーが発生する
後でフィールドを何の問題もなくプロパティに変更することはできないから,
とりあえず何も考えずプロパティにしとけ

>>320
>>302の場合はまったく同じだよ
違いが出るのは対象がジェネリック型パラメータの場合のみ

353:デフォルトの名無しさん
08/10/20 20:01:16
private void Form1_FormClosing(object sender, EventArgs e)
{
//なぜか設定の保存が出来ない
Settings.Default.SettingFont = textBox1.Font;
}

private void Form1_Load(object sender, EventArgs e)
{
//なぜか設定の読み込みができない
textBox1.Font = Settings.Default.SettingFont;
}

SettingFontはSystem.Drawing.Font型です
エラー警告メッセージ出ません
両辺を逆にしても駄目でした
複雑なコードにしたくありません
処理の早さ等は考慮しません
よろしくおねがいします

354:デフォルトの名無しさん
08/10/20 20:05:03
>>353
Saveしてない、なんてオチではないだろうな

355:デフォルトの名無しさん
08/10/20 20:10:32
オレもまっ先に >>354 と同じ発想がうかんだのだが
それはあまりにも…w と思い書けなかった


356:デフォルトの名無しさん
08/10/20 20:18:13
こっちのページですか?
下の二つのイベントハンドラを有効にして
いま下の怪しいところにSave();を足してみました

private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
// SettingChangingEvent イベントを処理するコードをここに追加してください。
}

private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
Save();
// SettingsSaving イベントを処理するコードをここに追加してください。
}

これでもエラーでませんでしたが
保存できていません、もしくは読み込まれていませんでした
>>353のコードにも何か書くのですか?

357:デフォルトの名無しさん
08/10/20 20:19:30
>>355
勇気を持って全てをさらけ出してくれませんか?
わからないんです

358:デフォルトの名無しさん
08/10/20 20:26:28
Properties.Settings.Default.Save();
を書いてなけりゃSaveされんだろう?ってことだったんだけど。


359:デフォルトの名無しさん
08/10/20 20:39:09
>>358
private void Form1_FormClosing(object sender, EventArgs e)
{
//なぜか設定の保存が出来ない
//↑出来ました
Settings.Default.SettingFont = textBox1.Font;
//今、感動して涙が止まりません
Settings.Default.Save(); //Saveって本当に良いものですね
//ありがとうございました
}

360:デフォルトの名無しさん
08/10/20 21:03:33
ワロタ

361:デフォルトの名無しさん
08/10/20 22:17:35
>>321
レスありがとうございます。
DWMを利用するまでは自分でも何とか検索して出来たのですが、ボタン等のコントロール上の黒色が
透明化されてしまう、という問題があったので、それについて調べた所

URLリンク(piece.coron.jp)
こちらのサイトで、UseCompatibleTextRenderingをtrueに変更してやる方法、というのがあったのですが
どうも使い方が分かりません、Program.csにてApplication.SetCompatibleTextRenderingDefault(true);に
してみたのですが、全く状況が変わりません

自分のレベルではまだこのようなことをするのは早いのでしょうか?
DWMは情報が少なすぎて困っています・・・

362:デフォルトの名無しさん
08/10/20 22:21:42
>>361
UseCompatibleTextRenderingはButtonやLabelとかの一部のコントロールにプロパティとして存在する。

363:デフォルトの名無しさん
08/10/21 11:56:48
DataGridViewのColumnsプロパティのようなものを自作するにはどういう方法が一般的なのでしょうか?
やりたいことは、Columnsのようにプロパティ名[インデクサ]が実装したいのと
Columns[i].Visible=false等で親クラスにプロパティ変更を知らせることです。

初めはColumnsクラスにイベントを作って親クラスに知らせる方法を考えたのですが、
その方法だと外からColumnsのイベント一覧が見えてしまいます。

そもそもそんなやり方は一般的ではないのでしょうか?宜しくお願いします。

364:デフォルトの名無しさん
08/10/21 12:06:59
普通にコレクション作ればいいじゃん
> Columns[i].Visible=false等で親クラスにプロパティ変更を知らせることです。
このVisibleの変更はDataGridViewColumn.Visibleの変更であってColumnsとは関係ない

まあ実際には大抵internalでDataGridView持ってたりするけどな

365:363
08/10/21 12:34:44
ありがとうございます
早速試してみたのですが、internalを指定しても外部から見えてしまうのですが…

[test1.cs]
public class Data
{
  internal Parent parent;
}

[test2.cs]
Data test=new Data();
test.parent=null; ←通ってしまう

internalって別ファイルからは参照できなくなると理解したつもりなのですが違うのでしょうか?

366:デフォルトの名無しさん
08/10/21 12:37:45
別アセンブリ。
exe/dll単位。

367:363
08/10/21 12:44:57
ありがとうございます。
すると同アセンブリ内では隠しようがないんですね。フレンドもないようですし…
となるとデータクラスのコンストラクタで親クラスを渡すしかなさそうに思えます。

ただ、データクラスのプロパティ変化時に親クラスのプライベートな処理を走らせることも難しそうですね^^;
DataGridであればColumnクラスのWidth等変更時にグリッドの表示幅が更新されたりしていますが
あれはどういったメカニズムなんでしょうか…

さらに言えば、コレクションクラスにはデフォルトでRemoveAtが実装されているようですが、
これでは外部から削除できてしまいます。外部から要素数の変更はさせたくない場合、
コレクションクラスの実装は向かないのでしょうか…

混乱してきた・・・・長々とすみませんm(_ _)m

368:デフォルトの名無しさん
08/10/21 12:50:59
> ただ、データクラスのプロパティ変化時に親クラスのプライベートな処理を走らせることも難しそうですね^^;
> DataGridであればColumnクラスのWidth等変更時にグリッドの表示幅が更新されたりしていますが
> あれはどういったメカニズムなんでしょうか…
別にevent使ってもいい。
DataGridViewColumn.Widthなら多分DataGridViewのinternalなメソッド呼び出してる。
いやまあ再描画だけならInvalidate呼び出すだけだけどな。

> さらに言えば、コレクションクラスにはデフォルトでRemoveAtが実装されているようですが、
> これでは外部から削除できてしまいます。外部から要素数の変更はさせたくない場合、
> コレクションクラスの実装は向かないのでしょうか…
やらせたくないなら例外投げればいいだけ。

369:デフォルトの名無しさん
08/10/21 13:09:38
なるほど、例外を投げるという手がありますね。参考になります。
イベントで実装もありかと思うのですが、何れにしろ同アセンブリ内なので
外部クラスからイベントの定義も出来てしまいますね。そこだけが問題です。

しかし実装自体は出来そうなので頑張ってみます。ありがとうございました!

370:デフォルトの名無しさん
08/10/21 13:57:37
0以上の整数しか使わないような変数に積極的にuintを使うのはいい方法でしょうか?
それとも整数は特殊な事情がない限りintで統一するべきですか?

371:デフォルトの名無しさん
08/10/21 14:22:31
符号なし整数はCLS非準拠なので他の言語で使えないかもよ、と
実際VB7では扱い面倒だったしな

private/internalならお好きに

372:デフォルトの名無しさん
08/10/21 15:00:49
2次元配列を作成し
ARRAY[*,0]に得点を入れて
ARRAY[*,0]の順番は変更しないで
ARRAY[*,1]に順位を作成したいと思いるのですがいい方法が浮かばないで困っています
皆さん何かいい方法は無いものでしょうか

373:デフォルトの名無しさん
08/10/21 15:01:27
>>371
> 符号なし整数はCLS非準拠なので他の言語で使えないかもよ、と

おお、そういう落とし穴があったとは・・・
int型に統一させていただきますm(_ _)m

374:デフォルトの名無しさん
08/10/21 15:03:30
>>372
心底意味が分からん。
具体的に値入れて説明してくれ。

375:デフォルトの名無しさん
08/10/21 15:13:44
Console.Writeline("hoge");

で白文字以外にカラフルな文字を表示させることってできませんか?

それが無理なら反転文字とか、アンダーライン文字とか、目立つ文字を表示できないでしょうか?
文書の一部分を強調表示したいんです。

376:デフォルトの名無しさん
08/10/21 15:18:49
>>374
分かりにくくて申し訳ないです
詳しく書くと

int[,] array = new int[8,2];
array[0,0]=100;
array[1,0]=10;
array[2,0]=80;
array[3,0]=20;
array[4,0]=90;
array[5,0]=40;
array[6,0]=60;
array[7,0]=30;
という得点が入ってるとして
得点によって順位を決めて隣の要素に入れて行きたいと思っています
array[0,1]には1
array[1,1]には8
array[2,1]には3
array[3,1]には7
array[4,1]には2
array[5,1]には5
array[6,1]には4
array[7,1]には6
といった感じに、、、、
まだ分かりにくいかもしれないのですが
何かいい方法無い物でしょうか


377:デフォルトの名無しさん
08/10/21 15:40:49
>>375
Console.ForegroundColor = ConsoleColor.Red; とかで切り替えればいいかも。

378:デフォルトの名無しさん
08/10/21 15:49:39
>>377
ありがとうございます、無事変えられました

379:デフォルトの名無しさん
08/10/21 16:09:19
>>376
static void setRank(int[,] array)
{
SortedList<int, int> sl = new SortedList<int, int>();

for(int i = 0; i < array.GetLength(0); i++)
{
sl.Add(array[i, 0], i);
}
int rank = 1;
foreach(var kvp in sl.Reverse())
{
array[kvp.Value, 1] = rank++;
}
}
こうかな、なんかもっとうまく書けそうで俺には書けなかった

380:デフォルトの名無しさん
08/10/21 17:20:37
>>379
こういうのって、「もっとエレガントにかけるかも」って思ってしまうよな…w

381:デフォルトの名無しさん
08/10/21 17:21:25
複数の計算結果を配列に格納する予定なんですが、あいにく得られる計算結果の順番と
配列の順番が逆だったりします。というわけで計算結果は配列の先頭からではなく最後尾から
先頭に向かって格納する必要があるわけですが、これを実現するには


a) とにかくもうひとつ仮の配列(同サイズ)をつくり、何も考えずに先頭から計算結果を
  詰め込む。全ての計算結果が出たところで本来の配列に後ろから値をコピーしていく。

b) 配列の要素数を表すstaticな変数を準備し、その変数を参考に配列に書き込む場所を特定する。
  配列に書き込むたびにそのstaticな変数を -1 することで保存すべき配列の位置を特定することができる。

c) 配列をNullable型として宣言し、書き込む位置はnullが格納されている最後尾と決めれば
  後ろからデータを格納することができる。

d) c)の亜種。配列を用意し、あり得ない数字(0とか-10000とか)で初期化する。
  あり得ない数字の最後尾からデータを格納していけば後ろからデータを詰めていったことになる。


ざっと考えて上記のa)〜d)が思いついたんですがどの方法がいいでしょうか?
あるいは他に方法がありますか?

382:デフォルトの名無しさん
08/10/21 17:33:27
初めから要素数が分かってるならbで十分だし(ていうか何故static?)
そうでないならList<>に突っ込んでいって最後にReverseすればいいだろ

383:デフォルトの名無しさん
08/10/21 17:40:32
labelのTextが増えたとき、左に伸びていくようにするには
どうすればいいでしょうか?

例えば、
label1.AutoSize=true;
label1.TextAlign=TopRight;
for(int i = 0; i < 10; i++) label1.Text += "あ";
では右に伸びていってしまいました。

384:デフォルトの名無しさん
08/10/21 17:40:41
>>382
> 初めから要素数が分かってるならbで十分だし(ていうか何故static?)
> そうでないならList<>に突っ込んでいって最後にReverseすればいいだろ

もしかしてReverseってList<>だけでなく普通の配列にも使えたりしません?
要素数は分かっているので何も考えず計算結果を配列に突っ込んだ後
最後にReverseかければa)〜d)のようなややこしいことをするまでも無い気が・・・

385:デフォルトの名無しさん
08/10/21 17:44:23
もしかしなくても、.NET 3.5では配列はおろかIEnumerable<T>ならReverseが使える。

386:デフォルトの名無しさん
08/10/21 18:35:45
>>382
> そうでないならList<>に突っ込んでいって最後にReverseすればいいだろ

List<>型に対してReverseはどう使えばいいでしょうか?

List<int> a;

に対して

Array.Reverse(a);

としたらエラーが返されてしまったのですが。
ちなみに一般的な配列なら問題ありませんでした。

387:デフォルトの名無しさん
08/10/21 18:39:17
a.Reverse();

388:デフォルトの名無しさん
08/10/21 18:50:32
>>387
ありがとう( ´∀`)

389:デフォルトの名無しさん
08/10/21 19:36:09
メソッドに変数を渡して、そのメソッド内で変数を書き換えてかえしてもらうとき
値型なら問答無用でout/refを付ければいいとして、参照型の変数のときはどうすればいいでしょうか?

参照型なら別にout/refは付けなくてもメソッド先での変更はちゃんと反映されるかと思いますが・・・

390:デフォルトの名無しさん
08/10/21 19:42:15
どうしたいかによるとしか

391:デフォルトの名無しさん
08/10/21 19:45:00
例えば、参照型でもそれ自体を書き換えるなら必要。
void f(out object o)
{
o = new object();
}

392:デフォルトの名無しさん
08/10/21 19:56:44
newするかしないかで使い分ければいいということですね

393:デフォルトの名無しさん
08/10/21 20:23:58
使い分けというのは変だな
どうしても必要な場合以外は基本的に参照渡しは使わない,でいいと思う

394:デフォルトの名無しさん
08/10/22 00:04:42
>>379-380
一次元配列ならこれだけなんだがなぁ

var array = new[] { 100, 10, 80, 20, 90, 40, 60, 30 };
var indices = Enumerable.Range(0, array.Length).ToArray();
Array.Sort(array, indices);


てか、誰か指摘してやれよ
>>376の問題に多次元配列を使うこと自体が愚策だと

395:デフォルトの名無しさん
08/10/22 00:07:16
特別な事情があるか、どうせそのうち丸ごと捨ててやりなおすかと思ってさ

396:デフォルトの名無しさん
08/10/22 01:50:42
C++と違ってC#は構造体にもメソッドを定義できるようにされていると聞きますが、
わざわざクラスではなく構造体でメソッドを定義できるようにした意味は何でしょうか?

メソッドを書くならクラスにするよう統一しても良かったと思いますが・・・

397:デフォルトの名無しさん
08/10/22 01:58:07
わざわざメソッドが定義できるのをクラスに限定するメリットがわからん


398:デフォルトの名無しさん
08/10/22 02:09:36
それ以前にC++でもstructにメンバ関数書けるんだが。



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

5383日前に更新/145 KB
担当:undef