C#, C♯, C#相談室 Part42at TECH
C#, C♯, C#相談室 Part42 - 暇つぶし2ch491:デフォルトの名無しさん
07/09/08 14:09:10
自作の構造体なら、わざわざDictionaryなんかに頼らなくても
自分とペアになるオブジェクトをプロパティで持たせた方が簡単で早いじゃん。


・・・・・・と俺は思っちゃうんだが、これってやっぱり単細胞過ぎる発想かな。

492:デフォルトの名無しさん
07/09/08 14:10:11
>>491
肝心のハッシュテーブルはどうするんだw

493:492
07/09/08 14:12:39
ああ、ごめん無視して
俺のほうが単細胞だったようだorz

494:デフォルトの名無しさん
07/09/08 18:57:52
>>488
ValueType.Equalsを使うならボクシングが発生するよね
それならプリミティブ型のみでもやっぱり自分で比較した方が速いのかな

495:デフォルトの名無しさん
07/09/08 23:48:32
comboboxにあるクラスのインスタンスを設定したいのですがどうすればいい?




496:デフォルトの名無しさん
07/09/08 23:51:32
ComboBox.Tag を使いなはれ

497:デフォルトの名無しさん
07/09/08 23:51:33
ValueTypeにそのクラスを設定すればいいだけじゃん

その程度のこともしらない人がつくったアプリなんて使いたくも無いw

498:デフォルトの名無しさん
07/09/09 01:41:29
>>494
JITでボクシングの部分はたいてい取り除かれているらしい。
さらにインラインかもありえるらしい。
ただJITの結果は調べられないからほんとかどうかは知らない。

499:デフォルトの名無しさん
07/09/09 01:59:44
>>498
>ただJITの結果は調べられないからほんとかどうかは知らない。

ボクシングが起きてるかどうかはCLR Profilerで分かるんじゃない?
GCヒープにその値型が確保されてればどっかでボクシングは起きてるてことで。

500:デフォルトの名無しさん
07/09/09 02:10:22
デバッガでアタッチしたら見えるんじゃねーの。
ってか取り除かれるのはかなり限定された状況だけじゃない?


501:デフォルトの名無しさん
07/09/09 05:03:43
>>469
問題が起きたら直すでおk
世の中そんなもんだ。

502:デフォルトの名無しさん
07/09/09 11:42:40
文字列に記述したプログラムを解析して結果を返したいけどいい方法はない?
jscript.netのevalはNGです。
自分で書いた独自のメソッドを呼べないので。。
public string myMethod(string s)
{
return "hoge";
}
文字列に
if(myMethod("hoge")=="hoge") "あ","い")
としておき
結果の
"あ"
を返す方法
文字列中にmyMethodがいつ来るかはわからないです。


503:デフォルトの名無しさん
07/09/09 12:23:16
まあやっぱりJScript.NETのevalだな
myMethodは静的にすれば元アセンブリ参照で呼べるだろ

504:デフォルトの名無しさん
07/09/09 12:36:05
>>502
IronPython

505:デフォルトの名無しさん
07/09/09 12:37:51
教えてください。
ArrayList で foreach を使う事について
ループ内部でIndexof を使用してIndexを求める場合、
foreach を使用せずに最初からインデックスを指定して回すやり方が普通なのかどうか
常識的に考えると後者が普通だと思うのですが
foreach を使用したほうが、コードが若干短くなるし、
コード上では多少効率が割るそうですが、オプティマイズされたCLRが吐かれるような気もしますし


506:デフォルトの名無しさん
07/09/09 12:45:06
ArrayListの中身を変更したいんならindexで回す
参照オンリーならforeachでいいんじゃないのか

Array<T>やList<T>ならForEachメソッドなんてのもある

507:デフォルトの名無しさん
07/09/09 13:05:00
>>506
ありがとうございます
ところで、2003 にはList<T>は無いみたいです...

508:デフォルトの名無しさん
07/09/09 13:08:21
ペイント系のアプリを書こうと思ってとりあえずPaint.NETを
使ってみたが、とてもじゃないが金を取れるソフトではありませんね

やはり、商用だとC/C++がいいのですかね

509:デフォルトの名無しさん
07/09/09 13:18:51
そりゃ金とってないソフトだ品

510:デフォルトの名無しさん
07/09/09 13:35:56
>>508
おまいさんは金を取ることの意味を勘違いしてるな。
The Old New Thingsでも立ち読みしてこい。
URLリンク(www.amazon.co.jp)

511:デフォルトの名無しさん
07/09/09 13:57:37
>>508
みたソフトが悪い

あれはMITのヲタク学生が書いた駄作だよ


512:デフォルトの名無しさん
07/09/09 14:05:24
またまたArrayListについて教えてください
ArrayListにオブジェクトをセットして
セットするオブジェクト: int Key, string Name1, string Name2, ...
そのArrayListに対して、例えば、Key = 3 は何番目なのかを
メソッドだけで、処理できますか?
Contain と IndesOf と、比較用のメソッドをオーバーライド?すればできそうな気もしていますが
良くわかりません

513:デフォルトの名無しさん
07/09/09 14:26:55
なにを言っているんのかよく分からんが
IndexOfでとれるだろ。。unboxingされて値が同じなやつが返るだろうけど


514:512
07/09/09 14:29:21
>>513
比較の際に、同一オブジェクトではなく、プロパティのKeyのみで比較したいのです

515:デフォルトの名無しさん
07/09/09 14:33:23
>>512
EqualsとGetHashCodeをoverrideする。またはHashtableでも使え。
それがいやならC#2.0のList<T>にはFindメソッドとかあるぞ。

516:デフォルトの名無しさん
07/09/09 14:35:30
ますます何を言ってるのかわからん
intなら値で比較されるだろ

もしかして
key1, string1_1, string1_2,
key2, string2_1, string2_2,
...
みたいな構造をArrayListで作ろうとしてるの?

HashTable使えよ。。。

517:デフォルトの名無しさん
07/09/09 14:42:57
>>512
こういうことがしたいの?

public class Item
{
 public int Key;
 public string Name1;
 public string Name2;
 public string Name3;
}

ArrayList al = new ArrayList();

// 入力

int index = 0;
foreach (Item item in al)
{
  if( item.Key == 3 ) break;
  ++index;
}

if (index == al.Count)
  Console.WriteLine("みつかりませんでした");
else
  Console.WriteLine("{0}番目", index);

518:デフォルトの名無しさん
07/09/09 14:44:43
孔子は言った。
考えるだけで学ぶことをしようとしない人間は間違いを犯しやすい。

519:512
07/09/09 14:58:56
ちょっとだけ違います。

ArrayList al = new ArrayList(); // 入力

Item addOrReplaeceItem = new Item(); // 追加または、更新しようとする要素(オブジェクト)
addOrReplaceItem.Key = 2;
addOrReplaceItem.Name1 = "new name1";

int index = 0;
foreach (Item item in al)
{
  if( item.Key == addOrReplaceItem.Key ) ;
{
((Item)al[index]).Name1 = addOrReplaceItem.Name1; // あれば、入れ替え
break;
}
  ++index;
}

if (index == al.Count)
{
  Console.WriteLine("みつかりませんでした");
al.Add (addOrReplaceItem); // 無ければ、追加
}
こんな感じです。
宜しくお願いします。

520:デフォルトの名無しさん
07/09/09 14:59:19
>>505
あほなこと言ってないで素直にインデックスで回すか、
自前でインデックスカウントしとけ。

同じ値とか複数あったらどうすんだ?
無いとしても効率悪くなるだけ。
そんな器用な最適化ができるわけなかろう。


521:デフォルトの名無しさん
07/09/09 15:01:13
いっそDataSet/DataTableを使ったらどうだ。

522:デフォルトの名無しさん
07/09/09 15:01:30
ふらっと逝け

523:デフォルトの名無しさん
07/09/09 15:22:45
>>519
「メソッドだけで」とか難しいこと考えずに
全部書くか自分でメソッド作ることをおすすめする。

どうせList<T>使えるようになったら組み直しなんだし。
難しいことやるのは慣れてからでいいよ。

524:512
07/09/09 16:11:52
ありがとうございます。

525:デフォルトの名無しさん
07/09/10 02:22:48
DataGridViewでコントロール+Cを押したときのクリップボードに
値を渡すのを防ぎたいんですがどうすればいいでしょう?


526:デフォルトの名無しさん
07/09/10 02:24:53
clipboardcopymode = Disable
でできました。。どうもです。

527:デフォルトの名無しさん
07/09/10 03:46:34
SDJEditorを使ってみた

やはり、.NETではこの程度が限界か?

528:デフォルトの名無しさん
07/09/10 06:36:45
>>503
すみません
この発言読み飛ばしてました。
静的にすればアセンブリ参照で呼べるというのを解釈すると
new をしないようなstaticなメソッドにしてDLLとして作成。
呼び出し元プログラム側で、参照の設定をしてあげるという
のでしょうか?
この静的にするということは、タイプセーフではないという
ことになりますか?今回ASP.NETで作成したいのですが。。

>>509
IronPaython
は動的言語ということで私も考えたのですが
具体的にどうすればよいのかが浮かびませんでした。
それにC#から呼び出したいのでオーバヘッドが発生する気がします。


529:デフォルトの名無しさん
07/09/10 08:55:33
組み込みスクリプト感覚で使うつもり?
それ危なくない?

530:デフォルトの名無しさん
07/09/10 12:46:34
> 静的にするということは、タイプセーフではないということになりますか?
なんで?

> C#から呼び出したいのでオーバヘッドが発生する気がします。
eval とか言ってるのにオーバーヘッドw

まあ全体に ASP.NET でやるには怖すぎる処理だわな

531:デフォルトの名無しさん
07/09/10 13:01:49
限定された構文でよかったら自分でインタープリタを作る手もあるし、
その手のライブラリもあるだろう。
evalと同等とかC#の関数で出来ることを全部やりたいなら、
CodeDOMやらそれなりに危険なことをしないと無理。

話はそれるがC#3.0のExpression<Func<>>の仕組みをつかって、
eval的なことが出来そうな気がする。
いまのところDLinq用だが、どう見てもLispのクォートを狙ってるとしか思えない。

532:デフォルトの名無しさん
07/09/10 18:43:40
>>531
本題とはずれるけど、C# 3.0 のラムダ式の話、
C# 3.0 は F# からいろいろ輸入したって話らしいから、
F# の(大元をたどればもちろん LISP の) quote 由来だろうね。

LISP だと、データとプログラムを区別しないってのを、
.NET Framework だと、ラムダ式を
デリゲートに代入したときはプログラムとして、
Expression 型に代入したときはデータとして扱う
というコンセプトみたい。

533:デフォルトの名無しさん
07/09/10 18:49:29
>>532
DLRも見てみると面白いよ。
ASTからILへの汎用変換エンジンになりつある。
CodeDOMは死相が出ちゃったけど
DLRはRubyとPythonという目標がある以上、
ある程度のところまで作り込むんじゃないかな。

ちなみにExpression Treeの裏話。
URLリンク(d.hatena.ne.jp)

ま た D o n B o x か !



534:デフォルトの名無しさん
07/09/10 23:55:38
すんません。
HTML中で16進形式(5桁:ex."&#x20B9F;")で指定されたサロゲートペア文字を
正しく変換する楽な方法ってないですか?

HttpUtility.HtmlDecodeだと、下位4桁までしか認識しないようで、困っております。

string s = HttpUtility.HtmlDecode("&#x20B9F;");
foreach (char c in s)
  Console.WriteLine(string.Format("{0:X4}",(int)c));

--出力(こんな値が入ってて欲しい)--
D842
DF9F
--出力(でもこうなっちゃってる orz)--
0B9F

535:デフォルトの名無しさん
07/09/11 00:07:19
正規表現使えば

536:デフォルトの名無しさん
07/09/11 00:19:54
ども。"&amp;"とかも"&"として取得したいんで、
できればメソッド一発でできたらなぁ、と思ったんですが、
やっぱそこだけ別に処理するしかないスかね。

537:デフォルトの名無しさん
07/09/11 00:29:04
数値文字参照だけ置換してあとはHttpUtilityに任せる
というのをひとつのメソッドにすればメソッド一発だよ

538:デフォルトの名無しさん
07/09/11 00:54:18
気になったのでざっと調べた感じ、HTML4.01の扱える文字集合はISO/IEC 10646-1らしい。
いわゆるUCS-4なんだが、-1はBMPしか扱わないそうな。-2がそれ以外の文字。

539:デフォルトの名無しさん
07/09/11 01:32:11
BitmapオブジェクトがDispose()されたことをBitmapオブジェクトの外部から知ることはできるでしょうか。
ローカルメモリオブジェクト内のDIBをもとに作成したBitmapオブジェクトが破棄されるまではローカルメモリオブジェクトを解放せずにおき、Bitmapオブジェクトが破棄された段階でローカルメモリオブジェクトを解放するようにしたいのです。
DIBをマネージメモリにコピーしてからImage.FromStream()でImageオブジェクトを生成し、すぐさまローカルメモリオブジェクトを解放する、という方法なら安全確実なのですが、いかんせん遅いのです。

540:デフォルトの名無しさん
07/09/11 05:44:01
>>503
>まあやっぱりJScript.NETのevalだな
>myMethodは静的にすれば元アセンブリ参照で呼べるだろ

やってみたけど無理でしたよ!
やっぱりできないのでは?

DLL側に
public class MultiplyClass
{
public static long Multiply(long x, long y)
{
return (x * y);
}
}

としてコンパイル、それを呼び出し側で参照の追加。

string exp = "MultiplyClass.Multiply(10, 5)";
Microsoft.JScript.Vsa.VsaEngine ve =
Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
long result =
(long)Microsoft.JScript.Eval.JScriptEvaluate(
exp, ve);

そうすると
変数 'MultiplyClass' が宣言されていません。
結局、作成したクラスはスコープの範囲外でした。


541:デフォルトの名無しさん
07/09/11 07:22:54
>>538
なるほど。HttpUtility.HtmlDecodeのバグというわけではないわけですね。
わざわざありがとうございます。


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