[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 08/03 14:11 / Filesize : 215 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C#, C♯, C#相談室 Part58



1 名前:デフォルトの名無しさん mailto:sage [2010/03/22(月) 21:35:10 ]
(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。

前スレ 
C#, C♯, C#相談室 Part55 (実質56)
pc12.2ch.net/test/read.cgi/tech/1260111240/

Visual C# 2008 Express Edition 日本語版
www.microsoft.com/japan/msdn/vstudio/express/vcsharp/

その他テンプレ>>1-5くらい

910 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 12:28:57 ]
>>909
あれから開発は進んだ?

911 名前:デフォルトの名無しさん [2010/05/12(水) 12:30:02 ]
>>910
誰と勘違いしてるのか知らないけどradiko関連は最初に作った以上はやらないよw

912 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 13:43:14 ]
普段から64bitOSで作業してるからこれにすぐ引っかかる
コーディングしてデバッグ開始して外部DLLの初期の時にもう落ちるからねえ

913 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 18:38:59 ]
>>845
亀だが、係争に発展した挙句SUNが負けたような

914 名前:デフォルトの名無しさん [2010/05/12(水) 18:40:53 ]
>>912
.netとかいっても内部はネイティブDLLなんかの単なるラッパーだったりするからねえ

915 名前:デフォルトの名無しさん [2010/05/12(水) 19:52:30 ]
よろしくお願いします。

VSC#2008です。

int.Parseに続くカッコ内に2バイト文字の数字を入れると、挙動がおかしいのですが
デバッグ付実行でエラーでず、素通りしてしまいます。
2バイト文字の数字をint型にするには、どういった方法がよいでしょうか。


916 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:08:30 ]
2バイト文字をint型に入れようって考えるのがそもそもおかしいと思うが…
Parseする前にワンクッション、全角数字を半角数字に置換するようにすればいい。

917 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:11:08 ]
いったん半角にすればいいじゃん。

918 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:11:38 ]
むしろReplaceで充分。



919 名前:デフォルトの名無しさん mailto:sage [2010/05/12(水) 20:19:12 ]
その前に
>デバッグ付実行でエラーでず、素通りしてしまいます。 
の部分が変だな。どんなコードかいてるの?

920 名前:915 [2010/05/13(木) 12:34:06 ]
Microsoft.VisualBasic.Strings.strConvでNarrowにするのって、
半濁音のピは、ヒと゜に分解されるんですね・・・2文字になるのか・・・orz..

921 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 12:40:22 ]
濁点付き文字を別に用意したら文字数が増えすぎて文字コードの隙間に入りきらないだろ
視認性も確保できない
*作られた当時の話

922 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 12:40:42 ]
復活のじゅもんだって半濁音は2文字だろうが!

923 名前:915 [2010/05/13(木) 12:48:42 ]
そうでしたね、ありがとうございます・・・。
ファイル名から数字をChar.IsDigitを駆使して抜き出してから
strConvしたらうまくいきました・・。

便乗質問ですが、
int.Parseで変換しようとしている文字列が表現する数字の桁数が相当多くて、
intに入りきらない場合ってあるじゃないですか。
でね、そんなケースを実験してみたら、

return int.Parse(Microsoft.VisualBasic.Strings.StrConv(str.Substring(startindex, finalindex - startindex + 1), Microsoft.VisualBasic.VbStrConv.Narrow, 0));

デバッグ付実行なのに、何らエラー(バグったり凍ったりダイアログが勝手に出たり)でずに
素通りして、何食わぬ顔でシステムアイドル状態に戻るんですよね。

うーん。うまくいってんのかいってないのかわかんねーと悩んでいます。

924 名前:915 [2010/05/13(木) 12:51:02 ]
なるほど、
これを
OverflowException
s が MinValue 未満の数値か、MaxValue より大きい数値を表しています。
というんですね・・・。
try catch finallyで囲って強制的に例外を吸い上げる(何もしないとスルーしやがるので)しか
ないのでしょうかね・・・ORZ

msdn.microsoft.com/ja-jp/library/b3h1hf19%28VS.80%29.aspx

925 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 12:53:09 ]
COM系のイベント内でやってないか?

926 名前:915 [2010/05/13(木) 12:53:53 ]
>>919さん

わかった!INT.PARSEって明示的に例外処理を用意してやんないと
スルーするんですね?ってことであってますでしょうか。

で、厄介なのはスルー後、何事もなかったかのようにシステムアイドルに
戻るっていうこと。
何食わぬ顔で実行中のFOREACHから抜けだすし、それが記述されてるメソッドからも
抜け出す・・・。

927 名前:915 [2010/05/13(木) 12:54:42 ]
>>925
private void MainForm_DragDrop(object sender, DragEventArgs e)

内でやっています。
(MAINFORMはFORM1のことです)

928 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 13:02:35 ]
DragDropイベントもCOM系だな
.NETの例外はHRESULTに変換されてCOMの呼び出し元に返値として渡されるので
例外は外部に通知されない



929 名前:デフォルトの名無しさん [2010/05/13(木) 13:35:36 ]
>>928さん

まじでつか・・・ORZ
どうすりゃいいの変になりそう(byビース、ZEROより)

930 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 13:51:48 ]
いきなりParseせずチェック入れた後に変換すればいいのでは?
多倍長ライブラリでInt範囲にあるかチェック→変換
もしくは
文字数カウント→Decimal変換→Int範囲にあるかチェック→変換

931 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 14:02:07 ]
イベント内で例外処理すれば良いだけじゃん?

932 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 14:03:35 ]
>>915MSDNくらい読め、くそが。
TryParse

933 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 14:06:39 ]
TryParse()使えば

934 名前:915 [2010/05/13(木) 14:20:13 ]
>>932、933さん

ですね・・・クビ吊ってきます・・・ORZ

935 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 14:32:32 ]
お前は既に釣っている

936 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 15:29:06 ]
だれうま

937 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 15:31:15 ]
ついでに、intで範囲外ならlongを使えばいいじゃない
幾ら何でもlongを超えるような桁数扱う訳じゃないだろ
あ、先に言っとくがlong.TryParse()だからな?
intからキャストするとかマヌケなことはナシだぜ

938 名前:915 [2010/05/13(木) 16:06:38 ]
ファイル名に日付が入っている場合は、
例えば20100513で8桁。
更に時刻も入っていれば、
201005131606で12桁。

ファイル名から数字を抽出する作業でインチージャを使うのは
その時点ですでに無謀ですね・・・おrz



939 名前:デフォルトの名無しさん [2010/05/13(木) 16:09:11 ]
>>938
結局何がしたいの?
無理して数値型を最初の器にするからはまるんじゃないの?

940 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 16:09:19 ]
計算に使うんじゃないのかよw

941 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 16:19:58 ]
もういいから正規表現使えよwwwwww

942 名前:915 [2010/05/13(木) 16:26:38 ]
そんなにいっぺんにいろいろ言わないで下さい・・・滝汗

加工したいファイルをアプリにDDする。
DDされたファイルのファイル名を解析する。
ファイル名は、どのような形式か予測できない。
ファイル名は、おそらく少なくとも1文字の0でない数字が入っているものと想像する。
ファイル名の文字列のうち、頭から探っていって最初に0でない数字と出くわしたら、
そこから、数字の連続が途切れるまでシークし、
少なくとも1文字以上の数字列を抜き出す。

ということをしているんです。
抜き出した数字列をとりあえずイントにしていた、というだったんです。

シクシク・・・

943 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 16:46:58 ]
だったらなおさら正規表現使え
見た目難解とかの言い訳は聞かん

944 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 16:47:39 ]
(ノД`)シクシク

945 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 16:49:39 ]
おれもそれやるなら正規表現でやるわ。

946 名前:デフォルトの名無しさん [2010/05/13(木) 16:49:57 ]
>>943
難解かね?
最悪わからなければ正規表現スレで書いてもらえばいいだけだし
,netの正規表現はperl5互換だったのでその旨だけ書いておけば
人がいれば書いてくれるよ

947 名前:915 [2010/05/13(木) 16:53:47 ]
kwsk(ノД`)シクシク

948 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 16:56:10 ]
>>946
だな
とにかく>>942みたいなことをやりたいなら正規表現一択
そっから数値型に落としたいならVBのStrConv()をC#で使えばいい



949 名前:915 [2010/05/13(木) 16:57:59 ]
www.2shared.com/document/4s_FwtR1/915.html
(ノД`)シクシク

950 名前:デフォルトの名無しさん [2010/05/13(木) 16:58:18 ]
ところでたとえば>>938をどういう風に加工するの?
>例えば20100513で8桁。
>更に時刻も入っていれば、
>201005131606で12桁。
これをどうintの範囲に収めるか

ルールがないとねえ・・・

951 名前:デフォルトの名無しさん [2010/05/13(木) 17:00:30 ]
intの最大がこれか
2147483647

952 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 17:07:23 ]
>>950
いや日時って事前に解ってればDateTime型にするだろJK
例え日時と連番が混在してたとしても、正規表現で一工夫すればある程度分離可能

953 名前:デフォルトの名無しさん [2010/05/13(木) 17:09:32 ]
>>952
いやいや
事前にわかってない物をルール決めて
intの範囲に落とし込むんでしょ?

そのルールというか仕様を決めないとどうしようもないって話・・・

954 名前:915 [2010/05/13(木) 17:17:34 ]
とにかく949でアップしたおソースをゲットして、
諸先輩方からの辛口批判を希望します。

955 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 17:21:28 ]
この意図不明なソース見てどうしろと?
意味じゃなくて意図が不明
まず仕様をはっきりさせるのが先だ

956 名前:デフォルトの名無しさん [2010/05/13(木) 17:21:55 ]
>>954
本人だったのか
使い方わからんし、いろいろポップアップするしでスルーしてたわw
できれば>>4>>7のコード貼るサイト使ってくれ

957 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 17:22:52 ]
949は怖くてダウンロード出来ません

958 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 19:25:45 ]
>>942-943
new Regex("(\D*?(\d*?)\D*?)", RegexOptions.IgnoreCase)
要するにこうか?
未検証だからこのまま動くかどうかは知らん



959 名前:958 mailto:sage [2010/05/13(木) 19:27:11 ]
おっと最後の繰り返しが抜けてた
new Regex("(\D*?(\d*?)\D*?)*", RegexOptions.IgnoreCase)
こうだな

960 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 21:33:49 ]
なんのこっちゃさっぱり分からん。
915が説明すらまともに出来ないクズなのか、俺の頭が悪いのか

961 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 23:05:51 ]
さっぱり分かるけど、21億、または42億を超えるような数字が取れてしまった場合どうするのかと、
数字が含まれていない可能性もあると書いているのに、1文字以上の数字列を返すところ

後者は"0"返せばいいのかな。

962 名前:デフォルトの名無しさん mailto:sage [2010/05/13(木) 23:07:27 ]
そもそも数値が欲しいのか数字列が欲しいのかすら分からんわけで

963 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 01:45:28 ]
おまんこが欲しいです…

964 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 03:13:16 ]
だったらこんな板にいないで歌舞伎町にでも飛び出せ
早くしろ

965 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 08:40:37 ]
要するに文字列から「連続した数字文字列」を抽出したいといことなんだろう。
何に使用するかは知らないけど。

966 名前:915 [2010/05/14(金) 09:27:23 ]
>>965
そのとおりでつ!
ただし、数字文字列の先頭は0であってはならない。
抽出した数字文字列は1バイト文字に変換しなければならない。

でっつ!

967 名前:デフォルトの名無しさん [2010/05/14(金) 09:54:03 ]
あ、いや、むりして数字にしなくても、数字文字から成る文字列stringのままでもいいかも・・・。
でも、その代わり全角か半角か混在している場合はどちらかに統一するような処理をしたいけれどもでつ。

968 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 10:09:35 ]
ジョニー・デッツ



969 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 12:26:36 ]
でっつ奉公

970 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 13:28:59 ]
>>966
>>959

971 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 14:35:15 ]
>>966
間違っています。
以上。
はい次の方。

972 名前:967 [2010/05/14(金) 15:16:49 ]
915です、とりあえず戻り値をintじゃなくstringのままにしたら、全く問題ありませんでした。
諸先輩方、ありがとうございました。

973 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 15:31:59 ]
ゆとりらしい解決だったな

974 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 17:45:06 ]
結局設計意図がわからなかった

975 名前:デフォルトの名無しさん mailto:sage [2010/05/14(金) 19:43:33 ]
ぽかーん

976 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 13:54:24 ]
f

977 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 20:23:26 ]
機械制御プログラムとかで、コマンド送信時にタイムアウト値を指定する必要があります。
それぞれのコマンドに推奨の最低タイムアウト値が存在するのですが、
こういうのは enum で定義した方がいいんでしょうか?
それとも const int の方が良いのでしょうか?

それぞれのコマンド送信メソッドではタイムアウト値は int で受けつける仕様にする予定です。
(最低タイムアウト値 +- αの値を指定する必要があるため)


978 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 20:25:11 ]
readonly int



979 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 20:27:42 ]
static readonly intに訂正
constはできるだけ使わない(値そのものに意味があるenumも同じ)

980 名前:977 mailto:sage [2010/05/15(土) 21:25:43 ]
値そのものに意味がある enum は NG ですか。
enum → 意味のある数字への変換メソッド等用意するのが正道ということでしょうか?

機械制御のコマンドも数値で表現されているのですが、想定していない数字を受けつけないよう
enum で型を作ってメソッドにわたすようにしていたのですが、
これは適当なクラスを作って定数を持たせるようにする方がいいのかな?

例)
class ControlCode {
public int Value { get; private set }
private ControlCode(int value) { Value = value; }

public readonly ControlCode Reset = new ControlCode(101);
.....
}

... public void SendControlCode(ControlCode code, int timeout);


981 名前:デフォルトの名無しさん mailto:sage [2010/05/15(土) 22:08:30 ]
別にそのコマンドの数値自体には意味はないんだし
絶対にその値を変えることが無いと言い切れるならenumでもいいと思うけどな
値をラップする型を作る方法をとるのであればクラスじゃなくて構造体使うのが普通
==と!=とGetHashCodeは必ず実装すること
WPFなんかでは列挙体みたいな構造体は確かに多用されてる

982 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 09:07:14 ]
なるほど。

MSDN を再度見返してみましたが、後から変更がかかりそうな定数なんかは enum にするのは
よろしくないんであって、意味のある数字を持たせてはいけないってわけではなさそうですね。

今後の拡張や定数自体にプロパティを持たせる必要があるか等考えて再検討してみます。
ありがとうございました。

983 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 09:51:40 ]
enumにご執心のようだが、同じ数値セットできないことは認識してるのかな。
異なるコマンドでタイムアウト値が同じ状況は十分ありえそうだが。

984 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 11:53:12 ]
>>983
できるよ。

985 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 14:09:28 ]
んな馬鹿なと思ってためしてみたら本当に出来たでござる

986 名前:デフォルトの名無しさん [2010/05/16(日) 14:13:00 ]
enumって手抜き用みたいなもんでしょ

987 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 14:17:44 ]
>>984
んな馬鹿なとおもったけど>>985のレスでできるのだなぁと思い、そういやC#のenumはかなり変更されたんだったなと思い出した

988 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 14:25:01 ]
>>985
感謝しろ



989 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 14:36:10 ]
これが出来るって事?


public enum eSwich {
VALUE1 = 1,
VALUE2 = 1
}

990 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 14:37:13 ]
昔からできたでしょ

991 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 15:02:47 ]
これとかよくあるパターンだろ

enum Hoge { A, B, Default = A }

ついでに、別環境(Compactなど)で値が異なるとか

enum Hoge { A, B, Default = B }

>>982
・要素を追加/削除しない
・要素の値を変更しない
・利用者が値を意識する必要が無い

を守れないならenumは不適切

992 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 17:32:26 ]
>>991
ふーん

993 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 20:21:10 ]
列挙体といえば.NET4で今更Enum.HasFlagが追加されたわけだけどこんなの使う?
ものすごい遅そうなんだけど

994 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 20:45:44 ]
これから新しく書くものには使う。

995 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 20:51:43 ]
[Flags]が付いた列挙体に対してはコンパイラが
その型専用に最適化されたバージョンのHasFlagを生成するとかできなかったのかな
ボックス化+リフレクションだからビット演算に比べると途方もなく巨大なコストだよな

996 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 20:58:11 ]
using とか lock みたいな構文糖衣でもよかったよね。

997 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:10:16 ]
unko

998 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:18:05 ]
static bool HasFlag<T>(T value, T flag) {
return ((dynamic)value & flag) == flag;
}
こうしてみたらEnum.HasFlagの1/10くらいの処理時間になった
それでもビットマスクの数百倍だけどdynamic結構速いね



999 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:18:23 ]
o

1000 名前:デフォルトの名無しさん mailto:sage [2010/05/16(日) 21:19:43 ]
C#最強

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<215KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef