ふらっとC#,C♯,C#(初心者用) Part32at TECH
ふらっとC#,C♯,C#(初心者用) Part32 - 暇つぶし2ch2:ななしぃ#
08/10/12 15:09:52
C#, C♯, C#相談室 Part48
スレリンク(tech板)

WPF(XAML,XBAP,.NET3.5)GUIプログラミング
スレリンク(tech板)

Live3
スレリンク(tech板)

初心者のためのプログラミング言語ガイド Part11
スレリンク(tech板)

3:ななしぃ#
08/10/12 15:11:43
参考サイト。まずはここで検索してから。
URLリンク(www.google.co.jp)
URLリンク(msdn.microsoft.com)
URLリンク(homepage3.nifty.com)
URLリンク(www.atmarkit.co.jp)
URLリンク(dobon.net)
URLリンク(jeanne.wankuma.com)
URLリンク(www.labasp.net)

4:デフォルトの名無しさん
08/10/12 15:17:02
>>1


5:デフォルトの名無しさん
08/10/12 15:22:45
>>1
糞スレ乱立すんな

6:デフォルトの名無しさん
08/10/12 15:23:40
>>1重複
↓↓以降こちらへ
スレリンク(tech板)

7:デフォルトの名無しさん
08/10/12 15:35:47
>>1

ぷらっととかいうスレを立ててる荒らしは死ね

8:デフォルトの名無しさん
08/10/12 15:42:15
楽しいか?
しかし幼稚な奴らばっかりだな本当。

9:デフォルトの名無しさん
08/10/12 15:46:29
さて、こちらをお気に入りに追加して
ぷらっとを削除する作業に戻るとするか

10:デフォルトの名無しさん
08/10/12 15:51:49
>>1 おい、重複だぞ

スレリンク(tech板)

11:デフォルトの名無しさん
08/10/12 15:55:47
>>10
いい加減にしろ
死ね

12:デフォルトの名無しさん
08/10/12 15:59:11
>>1


ぷらっととかという荒らしの立てたスレは放置で。
質問のある方どうぞ


13:デフォルトの名無しさん
08/10/12 16:00:14
>>10
死にません。

以降、こちらのすれをご利用ください。
スレリンク(tech板)

14:デフォルトの名無しさん
08/10/12 16:02:14
>>13
いいえ使いません

15:デフォルトの名無しさん
08/10/12 16:30:14
質問です、以前のWindowsではプロセス間通信をDDEやOLEで行っていたかと
思いますが、.NETではそれに代わるものが出来たのでしょうか?
よろしくお願いします。

16:デフォルトの名無しさん
08/10/12 16:33:57
リモーティングとかWCFとか

17:デフォルトの名無しさん
08/10/12 17:48:21
アセンブリ情報のタイトルと製品の違いが分かりません
どのように表記すべきか

ご教授ください

18:デフォルトの名無しさん
08/10/12 18:01:28
他のEXEのプロパティとか見てみては

19:デフォルトの名無しさん
08/10/12 18:19:49
例えば
タイトルがVisual C# 2008
製品がVisual C# 2008 Express Edition
みたいな感じとかで考えたらどうだろう
ちなみにAssemblyTitle属性はXP以降でタスクバーボタンのグループ化したときにも表示されたりしたはず

20:デフォルトの名無しさん
08/10/12 19:19:01
つまりタイトルはタイトルバーに表示されるべき範囲の名称に留め、製品はそれを個と見なした場合の製品名ということですね!わかります!!

21:デフォルトの名無しさん
08/10/12 19:57:04
タイトルに2バイト文字列使うってプログラマとしてどうなの?

22:デフォルトの名無しさん
08/10/12 20:02:21
突っ込む奴が馬鹿だと笑えない。
「2バイト文字列」っていつの時代の概念だよ。

23:デフォルトの名無しさん
08/10/12 20:51:02
Windowsの人たちはUTF-16LEBOMありのことを
昔からの慣習を引きずってUnicodeとか言うので
2バイト文字列って言ってくれたほうが正直ありがたい

サロゲートペア?シラネ

24:デフォルトの名無しさん
08/10/12 22:00:12
今時2バイトだの3バイトだの言ってる奴プログラマ(の重鎮だと思ってる)人としてどうなの?

25:デフォルトの名無しさん
08/10/12 22:20:36
文鎮としてはどうでもいい

26:デフォルトの名無しさん
08/10/12 23:15:59
System.Stringは2バイト/文字だから(例えASCIIの範囲内でも)タイトルに使ってはいけないということですね

27:デフォルトの名無しさん
08/10/13 01:05:49
サロゲートペアと組み合わせ文字わすれんなカス

28:デフォルトの名無しさん
08/10/13 08:54:45
byte配列からデータを抜き出して使用する場合って、みんなどうしてるの?

CやC++だと構造体のポインタにキャストしてアクセスすれば、
間にデータが追加になっても変更が楽なんだけども

調べたらC#でもunsafe fixed使えばキャストできるけど、これが常套手段だとは思えないし、
インデックス値を直に指定してアクセスなんてしたら、データの追加削除が発生したら
変更が大変すぎる

そもそもキャストなんてしないように思えるんだけど、良い方法が思い浮かばない

29:デフォルトの名無しさん
08/10/13 09:28:58
日本語でおk

30:デフォルトの名無しさん
08/10/13 09:46:21
>>28

Marshalクラス使うんじゃね
Marshal.Copyでbyte[]からIntPtr取って、Marshal.PtrToStructureで帰ってきた
のを構造体にキャストするんじゃないかとおもうが……

外してたらごめんね

31:デフォルトの名無しさん
08/10/13 09:52:48
>>28
BinaryReader, MemoryStream 使う。

32:デフォルトの名無しさん
08/10/13 18:03:39
>>28
配列の長さにもよるけど、簡単ならBitConverter、少し複雑ならBinaryReaderかな

33:デフォルトの名無しさん
08/10/13 19:57:27
文字列stの中に1320があるのであればAを実行するというプログラムをかこうとしているのですが int.Parse(stArray[0])のところで止まってしまいます

int code = 1320;
string st = "1320,野田,め組,578954";
string[] stArray = st.Split(',');
if (int.Parse(stArray[0]) == code)
{
Console.WriteLine("1320あり");
}

codeをstringに変更し
if (stArray[0] == code)にすると問題ないのですが 数値として比較したいと思っています
いろいろと調べたのですが私の調べる力が足りないのか解決方法が見つかりませんでした
どのようにすれば上手くいくのか教えていただけないでしょうか


34:デフォルトの名無しさん
08/10/13 20:11:57
それで動くと思うよ。エスパーを待ってもいいけど
どう「止まる」かを具体的に書くといいかもしれない
エラーが出るならそのメッセージとか

35:デフォルトの名無しさん
08/10/13 22:00:47
>>33
要はそのコードなら止まらないが、st = "Hoge,野田,め組,578954"とかだと
int.Parse(stArray[0])の呼び出しで例外が発生する。
それを回避するために
int.TryParse(stArray[0],out value)

こっちを使うといい。

36:デフォルトの名無しさん
08/10/13 22:34:16
>>33
教師やっててそんなこともわからないのかよ

37:デフォルトの名無しさん
08/10/13 22:41:48
のだめ知らんのか

38:デフォルトの名無しさん
08/10/13 22:42:45
みんなsprintfを自作して使っていると思う。俺は、へたれだから、Formatでいやいや逃げてきている。
ここらで、便利なsprintf もってる椰子がいたら公開してはくれんだろうか。


39:デフォルトの名無しさん
08/10/13 22:49:54
普通にstring.Formatのほうが便利

40:デフォルトの名無しさん
08/10/13 22:51:16
まじですか。c++が長すぎて、なんか直感的じゃないんだよな。

41:デフォルトの名無しさん
08/10/13 23:01:23
Stringってかかなきゃいかんのがめんどいよなあ

42:デフォルトの名無しさん
08/10/13 23:03:21
俺も、MSDNの文字列化の書式指定辺りが訳わかめだし。
正規表現も思ったように指定するのがめんどいんで、
sprintf,sscanf互換の関数が欲しい。

43:デフォルトの名無しさん
08/10/13 23:10:20
string.Sprintf()でもいいから、欲しいくらいだよ。
それか、perl, ruby風の文字列表記。

44:デフォルトの名無しさん
08/10/13 23:11:50
なんかねえ
慣れろとしか言えん

45:デフォルトの名無しさん
08/10/13 23:19:45
わからないから戻せっていうんならずっとCやってれば

46:デフォルトの名無しさん
08/10/13 23:21:11
C#のほうが高尚だとおもってる奴がまたでたな。

47:デフォルトの名無しさん
08/10/13 23:28:51
URLリンク(d.hatena.ne.jp)
俺は、このまんま、ちょい必要なの足して使ってるな。

48:デフォルトの名無しさん
08/10/13 23:29:55
ほとんどは型指定なしの{0}ですむんだから、難しく思えるのはどのあたりだろ?
整数とか実数のことをいってるのかな。前詰め後ろ詰めのこと?

49:デフォルトの名無しさん
08/10/13 23:35:50
使い方なんて、わかんないとこないとおもうし、わからなかったら調べるだけ。
問題なのは、 直感的に最終的な文字列がわかり難い ことだとおもう。
無駄に長い記述になるし。

50:デフォルトの名無しさん
08/10/13 23:45:43
俺は、%02X 相当のことするのにだいぶヘルプを探しまくった。
結局、精度指定子とやらが文章中に埋まってるのをようやく発見したが、
あんな仕様書は俺が上司だったら却下だな。
同じヘルプのsprintfとかの方が全然読みやすいのに。なんだあれは。


51:デフォルトの名無しさん
08/10/13 23:53:34
そういう話なら慣れの問題としかいえないね。
あとはマニュアル(MSDN)の記述がよくなくて探しにくいというのが大きいかも。

{ 位置情報 [[ , 総桁数] : 型[[0]サイズ]] }
「カンマ総桁数」のあたりの書き方がどわすれすることが多いよね。


52:デフォルトの名無しさん
08/10/14 00:48:54
私はfontDialog1で選択されたフォントをtextBox1に適用しようとしています

private void fontDialog1_Ok(object sender, EventArgs e)
{
textBox1.Font = fontDialog1.Font;
}

これで何も変化がありません
エスパー助けてください

53:デフォルトの名無しさん
08/10/14 01:31:28
if (fontDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Font = fontDialog1.Font;
}
じゃだめなのか?

54:デフォルトの名無しさん
08/10/14 01:36:10
適用ボタンでもいけた。呼ばれてないんじゃない?

55:52
08/10/14 01:40:37
>>53
思い通りの動作になりました有難うございます

56:デフォルトの名無しさん
08/10/14 01:47:35
Okというイベントが無いみたいで呼ばれてなかったです
小生Applyでは簡単に反映は出来ていたんですが、適用ボタン表示したくなかったのでOKボタンで反映させる方法が知りたかったのであります

57:デフォルトの名無しさん
08/10/14 01:57:43
なるほど、自前で無理やり用意したのかw

58:デフォルトの名無しさん
08/10/14 12:19:36
Media Player Classicのような再生プレイヤーを作るのって難しいでしょうか?

デコードはxdivなりffdshowなり各自インストールしてもらってそちらに任せるとして、
あとは映像を指定の領域に再生させたり、一時停止させたり、シークバーで任意の
場所に移動できたり、音量を変えられれば満足なんですが・・・

もしこれらの機能を実装するとしたらどんなことを勉強する必要がありますか?

59:デフォルトの名無しさん
08/10/14 12:21:19
過去の遺産だが俺ならDirectShow

60:デフォルトの名無しさん
08/10/14 13:57:35
いろいろと問題も多いけど、AudioVideoPlaybackを触ってみるのもいいかも。

61:58
08/10/14 14:16:19
どうもです。
目指すのは本当にシンプルで再生負荷が極めて軽いプレイヤーです。
8年前のPCでH.264といった動画も再生できるような軽さを追求したいと思っています。

プログラムの工夫いかんで軽くすることは可能でしょうか?

62:デフォルトの名無しさん
08/10/14 14:20:41
それはH264デコーダの革命が必要だろう
プレイヤー関係ないと思うけど

63:デフォルトの名無しさん
08/10/14 14:30:31
こんな質問してる奴が作れるのかね

64:デフォルトの名無しさん
08/10/14 14:41:37
C#の開発手順?というか定石みたいなのが書いてあるWebサイトってありますか?
Program.csに書いたらいいのか、新しいクラス作って書いていけばいいのか、、、など。

65:デフォルトの名無しさん
08/10/14 14:45:58
取りあえずProgram.cs(Main)は殆ど触らん

66:デフォルトの名無しさん
08/10/14 14:59:14
>>65
ありがとうございます。
そうなんですか。。。今とりあえずprogram.csの中にメソッド追加してるんですが、良い方法ではないんですね。
プロジェクト->クラスの追加
でクラスを追加して、そこにコーディングしていくのが良いんでしょうか。
もしそうなら、そのクラスをnewするのはどこが一番いいですか?

67:デフォルトの名無しさん
08/10/14 15:08:11
>>63
誰もが一度は通る道だろ。
お前さんだって、俺だって・・・

68:デフォルトの名無しさん
08/10/14 15:15:00
>>66
おまいさんに必要なのは、まず何を作りたいのかはっきりさせることだ。
次にそれを作るのに必要なクラスを考えることだ。

69:デフォルトの名無しさん
08/10/14 15:20:28
>>68
それをmain()の中でnewすればいいですか?

70:デフォルトの名無しさん
08/10/14 15:42:59
7年前のノートPC使ってるけどWMPでH.264再生してますよ
この1年で何があったんだよ・・

71:デフォルトの名無しさん
08/10/14 16:26:24
ベストプラクティス的なものは本を買わないと無いんでしょうか?
ググりまくっても、なかなかいい資料に出会えません。
初心者の道しるべがほしい・・・。

72:デフォルトの名無しさん
08/10/14 17:44:33
そういうのは先人のコードから学ぶのが一番だと思う。
SourceForge や CodePlex 等から適当なやつを拾ってきて読むと、いい勉強になるんじゃないかな。

73:デフォルトの名無しさん
08/10/14 18:33:20
メニョーストリップで一個一個のアイテムのハンドラで処理するんじゃなくて、
一箇所で受け取って、このアイテムが押されてたからこの処理。的な事はできないの?

74:デフォルトの名無しさん
08/10/14 18:37:40

座標しかわからないよ

75:デフォルトの名無しさん
08/10/14 18:40:03
できるよ

76:デフォルトの名無しさん
08/10/14 18:44:08
むりよ

77:デフォルトの名無しさん
08/10/14 18:45:54
ハンドラ一ヶ所にしたい、ということならできる。

78:デフォルトの名無しさん
08/10/14 18:47:43
イベントハンドラ使い廻すか。
ストリップ本体のClick拾って項目突き止めるか。

79:デフォルトの名無しさん
08/10/14 22:04:59
「メニョー」では無理

80:デフォルトの名無しさん
08/10/14 22:08:06
「メニェー」とか発音が困難になるよかマシ

81:デフォルトの名無しさん
08/10/14 22:50:59
3.5SP1は何時になったら完全日本語になんねん!

82:デフォルトの名無しさん
08/10/15 02:37:55
for文とかのループ中ではプロパティは使わない方がベター?

83:デフォルトの名無しさん
08/10/15 03:29:49
>>82
単純なGet/Setならインライン化されるので問題なし

84:デフォルトの名無しさん
08/10/15 03:31:47
インライン化されるプロパティとされないプロパティはどう区別するの?

85:デフォルトの名無しさん
08/10/15 04:33:42
CLRの気持ちになって考える

86:デフォルトの名無しさん
08/10/15 16:18:04
コントロールには処理自体に時間のかかるプロパティが多いので場合によってはキャッシュ
System.Drawingも注意

87:デフォルトの名無しさん
08/10/15 17:51:51
スペース区切りで1行に3項目ずつあるファイルを読み、それを二次元配列に入れたいと思っています。単に配列に読む場合には、

fruit.txt
2008/10/12(日) 12:03 バナナ
2008/10/13(月) 16:25 りんご
2008/10/14(火) 12:05 みかん
2008/10/15(水) 17:06 梨

string fileName = @"fruit.txt";
string[] fruitname = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS"));

でよいのですが、これを二次元配列にするにはどうしたらよいでしょう。
通常二次元配列は、
string[] fruitname = new string[4,3];
のようにして設定し、りんごを取り出すには、
fruitname[1,2]
でできるようなのです。
ご教示ください。


88:デフォルトの名無しさん
08/10/15 17:57:35
二次元配列なんて捨ててDateTimeとFruitの二つのプロパティ持ったクラスの配列にしたほうがいいと思うけどなー

とりあえずReadAllLinesで読み込んで
その後二次元配列を生成
読み込んだのをループで回してSplitで分割して挿入していく

89:デフォルトの名無しさん
08/10/15 17:58:55
普通そういうときは二次元配列じゃなくて配列の配列にするね
string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS"));
string[][] fruitname = new string[lines.Length][];
for (int i = 0; i < lines.Length; i++) {
 fruitname[i] = lines.Split(new[] {' ');
}

90:デフォルトの名無しさん
08/10/15 19:01:46
どこからも参照されていないメソッドの列挙とかって出来ますか?

91:デフォルトの名無しさん
08/10/15 19:07:42
FxCop使ってみるとか

92:デフォルトの名無しさん
08/10/15 19:13:14
普通に考えて無理。
まあソリューション内で直参照だけでいいなら、全ての参照を検索だったかで出来る。


93:デフォルトの名無しさん
08/10/15 19:14:38
あごめん、それじゃ駄目なんだなきっと。
FxCopってできたっけかな?


94:デフォルトの名無しさん
08/10/15 19:16:26
FxCopでできるよ

95:デフォルトの名無しさん
08/10/15 19:20:40
あやうくgrepとか答えて赤面するところだった

96:デフォルトの名無しさん
08/10/15 19:23:00
>>88
二つのプロパティ持ったクラスの配列を作った場合に例えば
DateTimeだけの配列やFruitだけの配列を取り出したい場合は
for文などで新たな配列を作るしか思いつかないのですが
他に良い方法はないでしょうか。

97:デフォルトの名無しさん
08/10/15 19:24:58
fruits.Select(x=>x.Fruit).ToArray()

98:デフォルトの名無しさん
08/10/15 19:26:48
そんなのは別に二次元配列だろうがジャグ配列だろうが変わらんが
まあC#3.0ならlist.Select(x => x.Fruit).ToArray()とかできるけどな

99:デフォルトの名無しさん
08/10/15 19:29:50
>>88
アドバイスありがとうございます。
二次元配列を生成、というところができていないので、
具体的なソースもいただけるとうれしいです。
>>89
配列の配列。そういう考え方があるのですね。
このコード、{}の対応がとれていないみたいなのですが、
Split(new[] {' ');
のところって、
Split(new[] {' '});
Split(new[] ' ');
Split(' ');
とかやってみたのですが、うまくいかず。

ところで、二次元配列にはしないものなのですか?


100:デフォルトの名無しさん
08/10/15 19:46:33
string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS"));
string[,] fruitName = new string[lines.Length, 3]

for(int i = 0; i < lines.Length; i++)
{
string[] tmp = lines[i].Split();
fruitName[i, 0] = tmp[0];
fruitName[i, 1] = tmp[1];
fruitName[i, 2] = tmp[2];
}

101:デフォルトの名無しさん
08/10/15 19:49:49
まあ使ってるうちにわかるよ
そのうち気がついたら2次元配列は全く使わなくなってるから

102:デフォルトの名無しさん
08/10/15 19:58:38
>>88、100
ありがとうございます。

>>96、97、98
fruits.Select(x=>x.Fruit).ToArray()
って全文書くとどうなるんですか!?
ひょっとしてこれ、すごくスマート!?

>>101
うっ。そうなんですか。


103:デフォルトの名無しさん
08/10/15 20:04:37
//class Fruit { public DateTime Date { get; set; } public string Fruit { get; set; } }
Fruit[] fruits = 読み込み…;
string[] fruitNameArray = fruits.Select(x => x.Fruit).ToArray();//Fruitだけの配列を作成

104:103
08/10/15 20:06:03
すまん上のはエラーになるね
//class Fruit { public DateTime Date { get; set; } public string FruitName { get; set; } }
Fruit[] fruits = 読み込み…;
string[] fruitNameArray = fruits.Select(x => x.FruitName).ToArray();//FruitNameだけの配列を作成

105:デフォルトの名無しさん
08/10/15 20:19:46
どうしてプログラムのサンプルって動物とかフルーツなの?

106:デフォルトの名無しさん
08/10/15 20:21:11
string[] lines = File.ReadAllLines(fileName, Encoding.GetEncoding("Shift_JIS"));

var fruits = lines.Select(x =>
{
string[] tmp = x.Split();
return new
{
Date = tmp[0],
Time = tmp[1],
Fruit = tmp[2]
};
}).ToArray();
匿名形使ってみたり

107:デフォルトの名無しさん
08/10/15 20:58:00
PointとPoint、SizeとSize、同士では足したり引いたりできないの
書いたらこんな風に

ポリフォニカは普通かった面白いだろ。
特に姉妹がかわいいし。

108:デフォルトの名無しさん
08/10/15 20:59:03
>>104、106
これで
バナナ
りんご
みかん

のみを一括して出力するには、
Console.Write(Fruit[]); //104
Console.Write(Fruit); //106
でいいと思うのですが、
問題はこの行をどこに書くかです。
どこに書きゃいいんでしょ?


109:96
08/10/15 21:21:02
C#2.0環境なので、LINQ使わずに実現したいのですが方法は無いでしょうか。

110:デフォルトの名無しさん
08/10/15 21:26:47
>>107
意味的におかしいからできない
WPFのPointは引き算できるんだけど、位置ベクトル扱いで戻り値はVector型だったりする

111:デフォルトの名無しさん
08/10/15 22:56:30
byteとByteみたいに同じような型がいっぱいあるのはなんでなの?

112:デフォルトの名無しさん
08/10/15 22:59:29
byteとByteは同じですよ?

113:デフォルトの名無しさん
08/10/15 23:04:04
回答になってない
なんでおなじのがあるんだよ

114:デフォルトの名無しさん
08/10/15 23:06:58
System.Int32 i;
とかやるのが面倒だから?

115:デフォルトの名無しさん
08/10/15 23:07:45
まあ、よく使う型は短くないと使いにくいからな。

位置づけとしては、
byte の方は C# の組み込みキーワード。
System.Byte の方は .NET Framework の正式名称。

116:デフォルトの名無しさん
08/10/15 23:07:55
基本型だってのを強調するためじゃないの

117:デフォルトの名無しさん
08/10/15 23:27:10
プログラマとしてはどう使い分ければいいの?

118:デフォルトの名無しさん
08/10/15 23:30:48
変数宣言ならキーワード使ってればいい
ただしメソッド名とかの場合はInt32とか使う Convert.ToInt32みたいなの

119:デフォルトの名無しさん
08/10/15 23:30:52
予約語の方一択。

120:デフォルトの名無しさん
08/10/15 23:32:14
自分は定義されてるstaticメソッドを呼び出すときはエイリアスじゃない方をつかうな
Int32.Parse()
Char.IsDigit()
とか
なんでかはわからんが

121:デフォルトの名無しさん
08/10/15 23:33:58
using System が使われていないときに

Byte[] byteStream;

とかやるとByte何それってコンパイラに怒られるから
なるべくbyteを使うようにすればいいんじゃないかと思ったり

122:デフォルトの名無しさん
08/10/15 23:39:36
byteはmscorlib参照しなくても使える

123:デフォルトの名無しさん
08/10/15 23:43:17
予約語一択が無難なんですね
ありやとやんした!

124:デフォルトの名無しさん
08/10/15 23:54:19
理念的にはC#と.NET Frameworkは独立している(例えばintがSystem.int32じゃない
C#の実装もありうる)っていうような「アリバイ作り」以上の意味はないという
認識だったんだが、違うのか?


125:デフォルトの名無しさん
08/10/15 23:56:54
intはSystem.Int32のエイリアスだと言語仕様できまってる

126:デフォルトの名無しさん
08/10/16 01:10:00
それはMSのC#コンパイラの仕様じゃないの?

127:デフォルトの名無しさん
08/10/16 01:17:11
たしかに

128:デフォルトの名無しさん
08/10/16 01:30:09
EcmaのC#言語仕様で 予約語 int は System.Int32 のエイリアスだって決まってる
(Ecma 334 C# Language Specification の 11.1.4 Simple types)
だからMSのコンパイラが、ってわけじゃないと思う。勘違いしてたらごめんね

129:デフォルトの名無しさん
08/10/16 09:28:24
たしかに

130:デフォルトの名無しさん
08/10/16 14:05:50
ListBoxにDisplayMemberとValueMemberを設定してKeyValuePairを
放り込んで操作しているんですが、こういうやり方と、DataSourceを
設定してそっちを操作するのでは、どちらが軽いんでしょうか。

131:デフォルトの名無しさん
08/10/16 14:12:16
普通は問題にならんよそんなのの差

132:デフォルトの名無しさん
08/10/16 14:14:40
知らないならレスしなくていいよ

133:デフォルトの名無しさん
08/10/16 16:43:05
すいません小数点→文字列変換時の丸めについて質問です。
double i = 1999.999999;
Console.WriteLine(i.ToString("F2"));
の結果が 2000.00 になってしまいます。
1999.99 にしたいのですが、勝手に丸められてしまいます。
丸められない方法はないですか?

134:デフォルトの名無しさん
08/10/16 17:17:11
>>133
#.##

135:デフォルトの名無しさん
08/10/16 17:22:03
>>134
丸められてしまいます。

136:デフォルトの名無しさん
08/10/16 17:25:31
数値を切り捨てるか、文字列にしてから切り出す、かなあ。
数値で切り捨てるのは、小数点以下2ケタなら100倍してMath.Floorとか。

137:デフォルトの名無しさん
08/10/16 17:33:26
>>136
グーですグー!
result = Math.Floor(result * 100) / 100;
result.ToString();
でいけました。どもです!

138:デフォルトの名無しさん
08/10/16 19:32:41
decimal 使うたれや

139:デフォルトの名無しさん
08/10/16 20:33:40
Bitmap bmp = new Bitmap("hoge.jpg");
で読み込んだ画像を png 形式のバイト列に変換したいんですけど、どうすればよいんでしょう?
ImageConverter.ConvertToの引数が4つのほうを使えば良いんだろうとは思うんですが、
1, 2個目に入れるべき物がよくわかりません。

Bitmap bmp = new Bitmap("hoge.jpg"); // 実際には読み込んだ後、加工された物
ImageConverter cnv = new ImageConverter();
string str = System.Convert.ToBase64String((byte[]) cnv.ConvertTo(?, ?, bmp, typeof(byte[])));

140:デフォルトの名無しさん
08/10/16 21:02:45
自己解決。
ConvertToに与える加工済みのbmpは既にpng形式になってたので引数2個のほうで問題ありませんでした。

141:デフォルトの名無しさん
08/10/16 21:21:48
普通はMemoryStreamに対してSaveする。

142:デフォルトの名無しさん
08/10/16 22:10:29
>ガベージ コレクションにより、メモリ開放の煩雑さが不必要
Disposeしなくていいってことですか?

143:デフォルトの名無しさん
08/10/16 22:19:33
どこの文章かは分からんがIDisposable.Disposeと.NET管理下のメモリとは何の関係も無い

って何回繰り返したことだろう

144:デフォルトの名無しさん
08/10/16 22:23:19
大事なことなので繰り返しました

145:デフォルトの名無しさん
08/10/16 22:27:23
>>143
それは不正確だと思うが。。
Disposeの個別の実装次第だろう。

146:デフォルトの名無しさん
08/10/16 22:36:59
>>145
じゃあ具体的にマネージドメモリをDisposeの実装でどうにかしてくれ

147:デフォルトの名無しさん
08/10/16 22:42:02
>>146
言ってる意味理解して反論してる?

148:デフォルトの名無しさん
08/10/16 22:45:04
うん
でDisposeの個別の実装をどうマネージドメモリに関係させるの?

149:デフォルトの名無しさん
08/10/16 22:58:25
例えば(Disposeに期待される役割から言って意味がないから普通はやらないけど)
巨大配列への参照をnullにする実装だってありうる。

「それはメモリを開放したことにならん」って言いたいかもしれんが、
その時は落ち着いて>>143を読もう。


150:デフォルトの名無しさん
08/10/16 23:16:06
でもやっぱり関係ないよね
参照を消しただけだもの

151:デフォルトの名無しさん
08/10/17 00:10:34
良く分からんが、Disposeの実装でGC.Collect()を実行するような話か?

152:デフォルトの名無しさん
08/10/17 00:19:19
func<T>( T t )

のように、任意の型の引数を取るメソッドがあったとして、以下のようなことはどうやればできるでしょうか。

・引数のtが何らかの型の配列かどうか(Tが配列か否か)を取得
・配列であれば何の型の配列か(TはT2[]の時、T2)を取得
・配列の型(T2)が取れた場合、T2型のオブジェクトを宣言する

funcの中で、

if ( t is 配列 ) {
 //TはT2の配列と仮定
 foreach ( T2 t2 in t ) {
  //t2に何らかの処理
 }
}

というようなことをやりたいと思っています。
よろしくお願いします。

153:デフォルトの名無しさん
08/10/17 00:32:02
普通にはできない。
foreachしたいだけなら、IEnumerable<T>を引数にしたほうがいい。

154:デフォルトの名無しさん
08/10/17 02:34:02
C♯ってくらいだからC言語の内容を包括してますか?
あとC♯を勉強してたらJAVAやD言語についての理解も深まって
いざってときにそれらにシフトしていくことも可能ですか?
C♯に一番興味あるんですけど、JAVAやC言語、D言語ってのも
いいってきくのでその3つにつなげることができるのか疑問です。

155:デフォルトの名無しさん
08/10/17 03:00:47
お前には無理

156:デフォルトの名無しさん
08/10/17 03:41:55
s.Close;ってなんなの
何でいちいちこんなことする必要あるの?

157:デフォルトの名無しさん
08/10/17 04:33:25
>>156
書いておく癖をつけとかないと、なんか色々漏れるんだよ。
理由が想像すらつかない程度の知識しかないんなら、とりあえず面倒でも従っとけ。

158:デフォルトの名無しさん
08/10/17 04:44:09
>>154
言語の知識だけで一人前になれるほどプログラムは単純じゃありません。
興味を持っただけの段階で知識の応用範囲を気にするなんて小賢しい真似をする暇があるなら
さっさと勉強した方がなんぼか有意義です。
でないと自分に必要な分野すら見えてきません。

159:デフォルトの名無しさん
08/10/17 05:22:12
>>153
なんで嘘つくの?

160:デフォルトの名無しさん
08/10/17 06:11:34
>なんなの、するの? 
こういう言い回しする奴はとことん頭悪そうだな

161:デフォルトの名無しさん
08/10/17 06:54:25
>>152
リフレクション

162:デフォルトの名無しさん
08/10/17 08:24:22
名前空間 Hoge のクラス Aと、名前空間 Hage のクラス Aがあるとして、
Aは両方とも中身(フィールド・プロパティ・コンストラクタ定義。メソッドは持たないデータ格納用クラス)は全く同じで、
名前空間のみが異なるとします。
仕様上そうなっているので、クラスを一つに統一するのは難しい状況です。
このとき、HogeのAとHageのAのオブジェクトを相互変換したいのですが、何かうまいやり方はありますでしょうか?

最も愚直な方法は、メンバを全て列挙して、一つ一つ代入していくことだと思いますが、
量が非常に多いのであまりやりたくありません。
Hoge.A.BやHage.A.B等、Aの中に同様のサブクラスBがあったりして、.NETで提供されるstring等の基本的なクラスに
落ちるまで、全て展開してやる必要がありますし。

単純にasやキャストを使っても変換できないと言われますし、
XMLシリアライザでメモリストリーム上にシリアライズし、他方の型を指定してデシリアライズしても、
型が違うと怒られます。
何かうまいやり方はありますでしょうか。よろしくお願いします。

163:デフォルトの名無しさん
08/10/17 08:31:06
>>152
同じ名前で通常版と配列版をつくってオーバーロードすればいけると思う。
配列がobjectにキャストされてたらダメだけど。
static void Func<T>(T [] ts) { foreach (T t in ts) Console.WriteLine(t); }
static void Func<T>(T t) { Console.WriteLine(t); }


164:デフォルトの名無しさん
08/10/17 08:52:18
>>162
両方同じインターフェース継承させちゃダメなのか?

それがダメなら、リフレクションでやれ。

165:デフォルトの名無しさん
08/10/17 09:17:07
>>162
CodeDomやEmitでコード生成

166:デフォルトの名無しさん
08/10/17 12:22:53
>>162

どれぐらいメンバ変数があるんだかわからないけれど、一個一個やるんじゃなくて
Hoge.Aを引数にとってHage.Aを返すメソッドを一個書けばすむんじゃねーの?

Hage.A ConvertHogeToHage(Hoge.,A a)
{
b = new Hage.A();
b.x = a.x;
b.y = a.y;
.......
return b;
}
てな具合にさ。


167:デフォルトの名無しさん
08/10/17 12:46:33
それが面倒だって言ってるんだろ

168:デフォルトの名無しさん
08/10/17 13:59:56
配列
int[] a = a[10];
があるとします。

この配列の範囲外にアクセスしようとしたら、たとえばa[-1]やa[10]にアクセスしようとしたとき、
特定の数字(たとえば-1)を返すようにすることは可能でしょうか?

169:デフォルトの名無しさん
08/10/17 14:01:16
無理
インデクサを実装した型を自作してそれっぽく振る舞わせることは可能
意味がわからなかったら勉強しろとしか言えない

170:デフォルトの名無しさん
08/10/17 14:07:39
インデクサですか、ちょっと勉強してきます。

あるいは簡単にメソッドで実現するという方法は一般的でしょうか?
int a(int x)
とし、0 <= x <= 9 以外の範囲を指定したら-1をreturnするようなメソッドの中に
int a[];
を宣言するという方法もあるかと思いますが・・・

171:デフォルトの名無しさん
08/10/17 14:20:08
ま別にそれでもいいんじゃね
今なら拡張メソッドでGetValueOrDefault<T>(this IList<T> list, int index, T default)とかか
やらんけど

172:デフォルトの名無しさん
08/10/17 14:57:16
ここ初心者用なのに初心者叩かれるよね

173:デフォルトの名無しさん
08/10/17 15:08:31
全然

174:デフォルトの名無しさん
08/10/17 15:10:08
ディスプレイ(もしくは特定のウインド)を(動画で)キャプチャし
その動画をLAN内の別のPCのメディアプレイヤーで見れるようにする(WMEのような)ソフトを作りたいのですが

非常に大雑把な作成の流れですが下のような流れで作ろうとすれば作れるでしょうか?
ココをこうすればいい、この部分に注意するようになどのご意見を賜りたいので書き込みました



Graphics.CopyFromScreenメソッドを使用して
連続でディスプレイをキャプチャ

画像ファイルを繋げて動画へ変換しつつ
httpとUDPで通信できるサーバを立てる

メディアプレイヤーから接続があった場合
そこへ動画を配信する

175:デフォルトの名無しさん
08/10/17 15:28:02
エンコードはしないの?

176:デフォルトの名無しさん
08/10/17 15:33:40
エンコードしないとサイズやらなんやら大きくなってしまいますね・・
メモしておきます

177:デフォルトの名無しさん
08/10/17 16:26:30
WindowsMediaServiceで出来るだろん

178:デフォルトの名無しさん
08/10/17 18:36:23
C#の正規表現で、「スペース(半角、空白)か改行しかない」という
条件はどう表現するのでしょうか。

179:デフォルトの名無しさん
08/10/17 18:51:25
>>169
インデクサに関してちょこっと調べてきました。
setやgetで要素を設定・取得するわけですが、要素数が100個とか1000個になると
swich~case文で設定していくのは大変な作業になってしまう気がするのですが・・・

180:デフォルトの名無しさん
08/10/17 18:58:13
意味が分からん
普通そんなのはDictionary使うだろ

181:デフォルトの名無しさん
08/10/17 18:59:07
私の辞書にその発想は無かったわ。

182:178
08/10/17 20:13:57
^\s+\n と ^\s*$ を組み合わせる事で表現出来たような気がする
んですが、間違ってないでしょうか。

183:デフォルトの名無しさん
08/10/17 20:20:22
>>179
なんでswitch? その発想はなかったわw
class MyArray<T> {
 private T[] array;
 public T this[int index] { get { 0 <= index && index < array.Length ? array[index] : -1 } }
}

184:178
08/10/17 20:21:18
すいません。正規表現スレ行きます。

185:183
08/10/17 20:22:17
return忘れてた
setはarray[index] = value;ね

186:デフォルトの名無しさん
08/10/17 20:56:23
>>183
>>185
どうもです(^-^)ノ
そのsetを実装すればあとはfor文なりで配列に値を普通に格納していけるわけですね。

187:デフォルトの名無しさん
08/10/17 21:34:02
すみません。
配列で複数作ったクラスに継承使ったら複数の基底クラスが生成されて負担が大きくなる
という事はありますか?

188:デフォルトの名無しさん
08/10/17 21:36:06
うぜえよお前!

189:デフォルトの名無しさん
08/10/17 21:36:14
C#か日本語でおk

190:デフォルトの名無しさん
08/10/17 22:13:47
クラスを入れる変数はポインタだからクラスの大きさとは関係ない
配列は変数がたくさん並んだものだからクラスの大きさとは関係ない

191:デフォルトの名無しさん
08/10/17 22:31:55
>>190
分かりました。ありがとうございます。

192:デフォルトの名無しさん
08/10/18 00:21:21
コマンドライン引数に関する質問です。
class MyApp { static void Main(string[] args) { foreach(string s in args) System.Console.WriteLine(s); } }
こんな感じの引数を表示するだけの物を動かしてて気付いたんですが、
argsにはワイルドカードが展開されない状態のコマンドライン引数が入るみたいですけど、
展開済みの引数配列を得るにはどうすればよいんでしょう?

193:デフォルトの名無しさん
08/10/18 00:25:14
そもそも引数にそんな概念はないだろ
自分で好きなように処理するだけ

194:デフォルトの名無しさん
08/10/18 00:35:22
Unixのシェルには存在するらしいよ
シェルだからプログラムに渡される前に展開される

195:デフォルトの名無しさん
08/10/18 00:39:34
ワイルドカードを「展開」するとかされるって言い回しは一般的なんだろうか

196:デフォルトの名無しさん
08/10/18 01:10:11
>>195
Unixシェルがやってくれるのは展開すると言われることが多いと思う。

197:デフォルトの名無しさん
08/10/18 01:23:21
VC++のsetargv.objみたいなのは.NETにはないのかな
自前で展開すればいいんだろうけど
いかにも車輪の再発明になりそうで躊躇してしまうね

198:デフォルトの名無しさん
08/10/18 05:08:21
Directory.GetFiles()でダメな理由は?
URLリンク(msdn.microsoft.com)

199:デフォルトの名無しさん
08/10/18 05:14:46
別にダメでもないが

200:デフォルトの名無しさん
08/10/18 06:58:55
>>198
Directory.GetFiles() がダメっていうよりシェルが展開しないとダメな理由は
ワイルドカード展開処理が各プログラムごとに異なって実装される可能性があるから。

201:デフォルトの名無しさん
08/10/18 10:10:01
>>200
例えばdir *\*.txtは文句言われるけど、
ruby -e"p ARGV" *\*.txtは1階層下の.txtのリストを表示してくれる、
みたいに実際に処理できるパターンが違うものがあります。

結局の所、展開処理は標準ライブラリでは用意されてないから
Directory.GetFiles, Directory.GetDirectoriesを使って自前で処理を書かないと駄目ってことでしょうか。

202:デフォルトの名無しさん
08/10/18 11:24:32
URLリンク(www.google.co.jp)
Cのリンカオプションには存在するみたいだな。

203:デフォルトの名無しさん
08/10/18 12:35:43
pythonにはパターンからそのパターンにマッチする
ファイルのリストを返すglobとかいうモジュールが標準でついてた気がする
そういうのがほしいのか

204:デフォルトの名無しさん
08/10/18 13:30:35
結局自前で書いてみた。
URLリンク(www.uploda.org)

205:デフォルトの名無しさん
08/10/18 17:28:30
2つの文字列が一致しているかどうか判定するプログラムを書きたいと思っています。

string A="(文字列)";
string B="(文字列)";

とし、
if (A == B)
で判定はできるかとは思いますが、たとえば比較する文字列が長い場合(2ちゃんに投稿
される平均的な1レスくらい)でもこの方法を使うべきでしょうか?

それとも長い文字列の比較のためには別に推奨された方法がありますか?

206:デフォルトの名無しさん
08/10/18 17:39:07
>>205
予め等しいか等しくないかが分かっているのでなければ、
少なくとも一度は線形時間かかる方法で比較しないといけない。

でも、一度等しいかどうかを判断すれば、その結果を変数に保存しておくとか、
System.Xml.NameTableのような仕組みを使ったりすることで、
二度目以降は定数時間の比較で済む。

207:デフォルトの名無しさん
08/10/18 17:44:36
>>206
不用意な回答だと思うなあ。
まあ質問者の質問の仕方が悪いんだが。
例えばDBとか検索エンジンのようにハッシュを使う方法もありうるし、
目的を明確にせずに一概に言えないとしかいいようがないと思うんだが。

208:デフォルトの名無しさん
08/10/18 17:48:30
比較対象の傾向にもよるけど、例えばまず文字列長を比較するとか
基本的に数文字で一致しなくなる掲示板レスみたいなのなら普通に比較するだけでも十分だろうし
そもそも比較回数が少ないなら気にすることもないだろうし

209:205
08/10/18 18:07:32
>>206-208
ハッシュという方法がありましたか( ´・ω・)!

文字列をハッシュを使っていったんハッシュ値に変換してから比較するのと、
C#に標準で用意された文字列比較(==)とではどちらが短時間で済むでしょうか?

あとC#にはハッシュ関数は用意されていましたっけ?
それとも自前で構築する必要がありますか?

210:デフォルトの名無しさん
08/10/18 18:09:24
初心者がハッシュね
うん

211:デフォルトの名無しさん
08/10/18 18:14:22
ちなみに==よりもString.Equalsの方が早いよ。

212:デフォルトの名無しさん
08/10/18 18:14:55
どういうシステムなのか次第で最適な方法なんていくらでも変わってくるんだから、
その辺を明らかにせずに聞いても仕方ないんじゃないか?

たった2つの文字列を1回きり比較するだけとか、
数百万件の文字列データを高速に比較したいとかで
全然やり方なんて違うだろ。

213:デフォルトの名無しさん
08/10/18 18:24:54
object.GetHashCode()でハッシュは取れるが
そんなこと考えず==で普通に比較すりゃいい

214:205
08/10/18 18:36:28
>>211-213
プログラムは2ちゃんに投稿される1レス相当の文字列を数千回程度比較する規模です。
このくらいでしたら==やString.Equalsを使った方が速いでしょうか?

215:デフォルトの名無しさん
08/10/18 18:39:28
>>214
数千回と一口に言っても
一つの文字列と複数の文字列を比較する場合とか、
複数と複数を比較する場合とかで違ってくるわけだが。

やりたいことを全部書けよ。

216:205
08/10/18 19:19:53
>>215
はい(´・ω・`)

比較する文字列はすべて違います。
webにアップロードされてる文字列に変更が加えられている物が無いかを
チェックするため、手元にコピーしておいた過去の文字列と、たった今web上
から落としてきた文字列を1つ1つ照らし合わせながら比較していきます。
その数が一回の処理でだいたい数千回に上るという仕様です。

217:デフォルトの名無しさん
08/10/18 19:27:12
それなら普通に==で比較するのでいいんじゃね。
「異なっていること」を判断するのにハッシュはあまり役に立たない。

218:デフォルトの名無しさん
08/10/18 19:33:16
初心者ほど何故か小出しにするから、中級者以上の回答者が混乱して無駄に議論を始める

219:205
08/10/18 19:34:46
>>218
す、すいません(´;ω;`)ブワッ

>>217
そうなんですか(´・ω・`)・・・
逆にハッシュを使った文字列比較が活躍する場所は何でしょうか( ´・ω・)?

220:デフォルトの名無しさん
08/10/18 19:35:36
>>216
== or String.Equalsで良いと思う。

221:デフォルトの名無しさん
08/10/18 19:36:51
>>219
ハッシュは文字列の場合はパスワードの認証とかに使われるし、それ以外ならほとんどバイナリの整合性を取るために使われる。

222:デフォルトの名無しさん
08/10/18 19:40:49
>>219
保存されてる数千の文字列を総当たりで比較する場合とか。
ハッシュ作るのに相当なコストかかるから、比較の一方が1回しか
比較の対象にならないならば、効率が悪すぎる。

223:デフォルトの名無しさん
08/10/18 19:52:59
==とString.Equalsに違った部分があるかのような言説はなんなんだよ

224:205
08/10/18 19:53:08
同じ文字列を何度も比較に使うときはハッシュにすると効率がよくなるということですね?

225:デフォルトの名無しさん
08/10/18 19:58:26
ちゃんとキャッシュすればね

226:デフォルトの名無しさん
08/10/18 20:01:20
と言うよりも、比較の際にハッシュ作成の時間をカウントしないで済むかどうかが肝なんだろうね。
つまりハッシュ値を事前に用意できるかどうか。

>>216の場合はハッシュによるふるいわけが適用可能な例に思える。

227:デフォルトの名無しさん
08/10/18 20:39:44
どう考えてもハッシュを使う意味がない。
こういう場合にハッシュを使う意味がある可能性があるのは、かなりサイズが大きい場合。
つまり全文をディスクから読む負荷がかなり大きい場合。

2ちゃんレスレベルなど、ハッシュ計算の自体の方がはるかに負荷が大きい。
ディスクからの全文読み込み負荷と、ハッシュのみ読み込み負荷の差が、
ハッシュ計算自体の負荷よりもずっと大きいなら効率化できるかもしれない。
ハッシュ計算結果を全部メモリにキャッシュしとけば別だが、

2ちゃんレスレベルならいっそ文字列全部キャッシュしてもいいくらい(件数によるが数千件レベルなら)。

そこまで性能にシビアでないなら何も考えず全文比較でいい。

228:デフォルトの名無しさん
08/10/18 20:49:05
初心者がいきなりそんなどっちが早いとか考えなくていいです
希望する動作を実現するのに最も簡単な方法を教えてあげてください

229:205
08/10/18 20:56:10
>>227
> 2ちゃんレスレベルならいっそ文字列全部キャッシュしてもいいくらい(件数によるが数千件レベルなら)。

どうもです。
スタックに

string[] A = {"文字列", "文字列", "文字列", "文字列",・・・,"文字列"};

みたいな感じで格納して計算してもいいと思いますか?

230:デフォルトの名無しさん
08/10/18 20:56:30
>>227
分かってるような感じでいい加減なことを言わんように

231:デフォルトの名無しさん
08/10/18 21:06:03
>>211
あちこちで言われてる事ではあるけど
String.Equalsの方が早いと言っても微々たる差でしかないし
とくに初心者はString.Equals(String)ではなく、誤ってString.Equals(Object)を使ってしまう危険性が高い。

その場合、stringとintの比較のように型が異なっていてもエラーが出ずコンパイルが通ってしまい、バグの発見が遅れる可能性が出てくる。(実行時に例外発生)

問題点を教えずに使わせるのは良くないと思うんだ。

232:デフォルトの名無しさん
08/10/18 21:06:28
このスレにはC#の未来が掛っています
初心者潰しをするか初心者を受けれるかはあなた次第

233:デフォルトの名無しさん
08/10/18 21:12:20
どの部分がいい加減なのかをきっちり指摘すればいいと思うんだよね。


234:デフォルトの名無しさん
08/10/18 21:13:29
おっと
>どの部分がいい加減なのかをきっちり指摘すればいいと思うんだよね。
>>230宛てね。


235:デフォルトの名無しさん
08/10/18 21:14:03
a.Equals(b)って対称じゃなくて嫌い

236:デフォルトの名無しさん
08/10/18 21:15:50
String.Equalsでのパフォーマンスの差なんて、文字列がよっぽど短くなけりゃ完全無視できるレベル。


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にメンバ関数書けるんだが。


399:デフォルトの名無しさん
08/10/22 02:26:02
C++の場合はデフォルトのアクセス制限がpublicかprivateかの違いしかない。
他は全部classとstructは一緒。

>>396はC#におけるクラスと構造体の違いを知りたいの?

400:デフォルトの名無しさん
08/10/22 03:17:06
C#では構造体とクラスはこれだけ近い存在にされてるのになぜあえて分けているのかが分からないんです。

401:デフォルトの名無しさん
08/10/22 05:02:37
話し聞いてないな。
C++においての違いはほぼ無い。
C#においての違いはそれよりある。


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