トップページ⇒tech
1001コメント324KB

C♯相談室 Part28

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん♯2005/12/14(水) 07:47:02

(#゚ー゚)つ < C#、.NETの話題はこちらでどうぞ。


過去スレは>>2-5あたり。


関連リンク
http://onigiri.s3.xrea.com:8080/csharp/index.php?%5B%5B%A5%EA%A5%F3%A5%AF%5D%5D
0002名無しさん♯2005/12/14(水) 07:47:35
過去スレ その1
Part27 http://pc8.2ch.net/test/read.cgi/tech/1131544541/
Part26 http://pc8.2ch.net/test/read.cgi/tech/1127063469/
Part25 http://pc8.2ch.net/test/read.cgi/tech/1122352650/
Part24 http://pc8.2ch.net/test/read.cgi/tech/1117631000/
Part23 http://pc8.2ch.net/test/read.cgi/tech/1112968209/
Part22 http://pc8.2ch.net/test/read.cgi/tech/1109630502/
Part21 http://pc5.2ch.net/test/read.cgi/tech/1106490240/
Part20 http://pc5.2ch.net/test/read.cgi/tech/1103005153/
Part19 http://pc5.2ch.net/test/read.cgi/tech/1100240847/
Part18 http://pc5.2ch.net/test/read.cgi/tech/1096112588/
Part17 http://pc5.2ch.net/test/read.cgi/tech/1091284402/
Part16 http://pc5.2ch.net/test/read.cgi/tech/1087297504/
Part15 http://pc5.2ch.net/test/read.cgi/tech/1083066815/
Part14 http://pc5.2ch.net/test/read.cgi/tech/1076933504/
0003名無しさん♯2005/12/14(水) 07:48:02
過去スレ その2
Part13 http://pc2.2ch.net/test/read.cgi/tech/1071663456/ (ログ行方不明)
Part12 http://pc5.2ch.net/tech/kako/1066/10660/1066038651.html
Part11 http://pc5.2ch.net/tech/kako/1061/10612/1061262958.html
Part10 http://pc5.2ch.net/tech/kako/1051/10518/1051842450.html
Part9 http://pc2.2ch.net/tech/kako/1039/10396/1039646808.html
Part8 http://pc3.2ch.net/tech/kako/1032/10324/1032488831.html
Part7 http://pc3.2ch.net/tech/kako/1027/10275/1027531796.html
Part6 http://pc3.2ch.net/tech/kako/1022/10222/1022257078.html
Part5 http://pc3.2ch.net/tech/kako/1019/10195/1019533942.html
Part4 http://pc.2ch.net/tech/kako/1016/10165/1016597767.html
Part3 http://pc.2ch.net/tech/kako/1009/10094/1009473982.html
Part2 http://pc.2ch.net/tech/kako/1002/10024/1002468050.html
Part1 http://pc.2ch.net/tech/kako/977/977112364.html
0004デフォルトの名無しさん2005/12/14(水) 08:40:31
4 catch
0005デフォルトの名無しさん2005/12/14(水) 12:10:05
乙です。
0006デフォルトの名無しさん2005/12/14(水) 22:18:57
いきなり初歩的な事項で申し訳ないですが…
explicit, implicit ユーザー定義変換についての質問です。

あるサイトに
「変換メソッドは、引数を受け取り、それを元に変換後の型を返します
ただし、受け取る型と変換後の型に継承関係があってはいけません
例えば、ユーザー定義変換は System.Object を受け取ることはできないのです」

との説明があったのですが、つまりはどういう事なのでしょうか?

string は System.String で、int は System.Int32
System.Object だけなんで駄目なんでしょう (゚゚)?
ある種継承関係にあるとか考えているのですが…頭がこんがらがってしまいます
0007デフォルトの名無しさん2005/12/14(水) 22:36:08
継承関係にあるのなら普通にキャストすればいいだけじゃん
0008デフォルトの名無しさん2005/12/14(水) 22:45:53
>>7
すみません。プログラムで書くとどういう事なんでしょうか?

CS0556 のエラーが英語でよくわからなかったけど、
どうやらユーザー定義変換では自クラスを含めなきゃいけないと言う事だそうです。

class Test {
int num;
public static implicit operator int (string str) {
num = int.Parse(str);
return num;
}
public int Pub {
get { return num; }
set { num = value; }
}
static void Main() {
Test a = "10";
System.Console.WriteLine(a.Pub);
}
}

うぅ…これのコンパイルが通らないのはなぜなの…orz
0009デフォルトの名無しさん2005/12/14(水) 22:47:26
>>8
operator int→operator Testか?
0010デフォルトの名無しさん2005/12/14(水) 22:51:18
>>9
accesser.cs(4,3): error CS0120: 静的でないフィールド、メソッド、またはプロパティ
'Test.num' で、オブジェクト参照が必要です。
accesser.cs(5,10): error CS0029: 型 'int' を型 'Test' に暗黙的に変換できません。

と出ました。この CS0120 のエラーはググってもMSDNのやつがひっかからず
訳わかめ状態っす ;;
0011デフォルトの名無しさん2005/12/14(水) 22:51:47
>>8
>   Test a = "10";
そりゃstringからTestへの型変換が定義されてないから……
0012デフォルトの名無しさん2005/12/14(水) 22:53:10
public static implicit operator Test (string str) {

ちなみに>>10は3行目をこう変えた場合のコンパイルエラーです
0013デフォルトの名無しさん2005/12/14(水) 22:53:56
>>10
Testにint型の値を1つ引数にとるコンストラクタをつけろ。
0014デフォルトの名無しさん2005/12/14(水) 22:54:27
その上でreturn new Test(num);
0015デフォルトの名無しさん2005/12/14(水) 22:59:35
OK、順番に行こう。
まずユーザ型変換は何かの型から自身の型に変換するか、自身の型から何かの型に変換するかしか定義できない。
つまりstringをintに変換するような型変換のオーバーロードは書けない。
なぜならstringもintもすでに定義済みで、「自身の型」にしようが無いから。
Test型の中での型変換はTestに変換するかTestから変換されるかしかない。

二番目に、演算子オーバーロードはstaticだ。
型変換は一般に新しいオブジェクトを作ってそれを返すって動作になる(或いはフィールドの値なんかをコピーする)。
オブジェクトが無いのに非staticメンバをいじるのは当然できない。
0016デフォルトの名無しさん2005/12/14(水) 23:06:49
おぉ!! >>8の一部、皆さんのご指摘どおり
static int num = 10;
public static implicit operator Test (string/*Test*/ str) {
num = int.Parse(str);
return new Test(num);
}
Test(int a) {
}
と変えたら、コンパイルが通り理想的な動作になりました。
>オブジェクトが無いのに非staticメンバをいじるのは当然できない。
は、特にすごくわかりやすかったです。

ついでの質問ですみません。面倒でしたらスルーしておいて下さい。
オブジェクト=インスタンス…で良いでしょうか?

なにはともあれ、ありがとうございました! 助かったです。
0017デフォルトの名無しさん2005/12/14(水) 23:27:44
>>16
15の文の中で出てくる「オブジェクト」はインスタンスの意味で使われている。
0018デフォルトの名無しさん2005/12/15(木) 00:31:50
axWebBrowserを利用してブラウザを作っているのですが、
Internet Explorerスクリプトエラー
ダイアログの表示を強制的にオフにする方法ってないでしょうか?
0019デフォルトの名無しさん2005/12/15(木) 00:36:05
>>18
ScriptErrorsSuppressed
0020デフォルトの名無しさん2005/12/15(木) 04:27:31
axWebBrowserならSilentをtrueに。
Managed WebBrowserなら>>19
0021デフォルトの名無しさん2005/12/15(木) 17:51:48
C#版のSourceNavigator見たいのあったらいる?
0022デフォルトの名無しさん2005/12/15(木) 19:03:28
Microsoft .NET Framework 1.0a SDK (フリーで手に入るやつ)では
コンパイルが通り、期待した通りの結果が返ってくるのですが、
統合環境の(?) .NET 2003 ではコンパイルがとおりません。以下のプログラムです。

class Output {
public static Output operator << (Output cout , System.Object obj) {
System.Console.WriteLine(obj.ToString());
return cout;
}
}

class Test {
static void Main() {
Output cout = new Output();
cout <<= "ほげ";
}
}

<<エラーメッセージ>>
オーバーロードされた shift 演算子では、最初のオペランドは
それを含む型で、二番目のオペランドの型は int でなければなりません。


なぜに、このような制約が生まれたのでしょうか?
同じ動作のプログラムを .NET 2003 では実現するのは不可能なのですか?
0023デフォルトの名無しさん2005/12/15(木) 19:14:39
>>22
そもそも<<はそうやって使うものじゃないと思うけど。
0024デフォルトの名無しさん2005/12/15(木) 19:22:30
うわ気持ち悪 なにそのC++脳に汚染されたコード
0025デフォルトの名無しさん2005/12/15(木) 20:12:21
>>23
なるほど。言われてみれば確かに… そちらの方が理にかなってますね。
ではこのような動作を実現するのは不可能なのでしょうか?

# 初心者スレを見つけたので今度からはそちらに行く事にします。
# http://pc8.2ch.net/test/read.cgi/tech/1122001458/l50
0026デフォルトの名無しさん2005/12/15(木) 21:48:26
どうみてもここだよな。
http://wisdom.sakura.ne.jp/programming/cs/cs44.html
0027デフォルトの名無しさん2005/12/15(木) 22:43:40
おれもそこを思い出した、お世話になったなぁ
0028デフォルトの名無しさん2005/12/15(木) 23:47:10
vs2005でXmlシリアライズ可能な自己定義オブジェクトを
Settingsクラス内で定義して保存することはできますか?

//XmlSerializable
public class MySettingObj{
private string name;
public string Name {get{return name;}set{name=value;}
}
こんなクラスをプロジェクトのプロパティ、設定タブでのエディッタでSettings.csに保存することは無理でしょうか?
このようなオブジェクトは別ファイルに保存するのが常套手段ですか?
0029デフォルトの名無しさん2005/12/16(金) 09:52:07
クラスの実行時定義のこと?

Microsoft.CSharp
System.CodeDom.Compiler

とか。自分で解放したい時は System.AppDomain を使う。
違ったらスマソ
0030デフォルトの名無しさん2005/12/17(土) 00:34:38
すいません、普通にローカルマシンにオブジェクトを保存する手段のことです。
ファイルパスとか考えるの面倒なのでデフォルトで用意されている機構である
アプリケーション設定(Settings)で保存できたらいいなぁ、と

あとResources.resxエディタで文字列を保存するときにセクション分けって無理なんですかね?
同一サテライトアセンブリ中で
文字列の保存をカテゴライズするにはKeyにPrefixをつけて、ずらーっと並べる位なのでしょうか?
0031デフォルトの名無しさん2005/12/17(土) 01:42:18
SELECT email FROM table

のSQLコマンドで呼び出されたemailのリストをArray, ArrayList,等の配列として得ることの出来るSystem.Data.SqlClient.SqlCommand関数(またはそれに代わる関数)は何かありますか? 
0032デフォルトの名無しさん2005/12/17(土) 02:08:55
DataReader型は自分でArrayにするので問題ないかと
0033デフォルトの名無しさん2005/12/17(土) 02:43:35
早速回答ありがとうございます。試してみます。
0034デフォルトの名無しさん2005/12/17(土) 09:51:15
今までデータベース非依存なDataSet(Read/WriteXml)で保持していたデータを
mdbに書き出したいのですが
DataSetからmdbファイルを作成することはできるのでしょうか?
(対象は素のWindows2000 Accessとかはインストールされていない)

mdbじゃなくてもお手軽DBならなんでもいいのですが、何かよいものってありますでしょうか?
0035デフォルトの名無しさん2005/12/17(土) 10:22:59
xml
0036デフォルトの名無しさん2005/12/17(土) 13:21:38
相談なんですが・・・

クラスに設定したい機能がいっぱいあるんですが、
一回設定したらもう二度と変更したくない機能ばっかりなんです

一回設定したらもう二度と変更したくない機能ってコンストラクタの引数で設定するべきだとは思うんですが
これやるとコンストラクタの引数が10個とか20個とかになってしまいます。
かといって、インスタンス生成後にプロパティで1つずつ設定するのも変・・・

これってそもそもクラスの設計が不味いんですかねえ
0037デフォルトの名無しさん2005/12/17(土) 13:29:01
不味いだろうな
0038デフォルトの名無しさん2005/12/17(土) 13:42:20
SQL Server 2005のXML対応って、
XmlファイルをXPathやらXmlWriter/Readerで操作するのと
同じイメージで使えるってことなのかな。
0039デフォルトの名無しさん2005/12/17(土) 13:46:13
>>36
引数に独自クラスを当てればすっきりするんじゃないの?構造体でもなんでもいいんだけど。
0040デフォルトの名無しさん2005/12/17(土) 13:53:11
>>36
ProcessStartInfoクラスとか参考にしてみれば?
0041デフォルトの名無しさん2005/12/17(土) 16:30:23
Object型の変数に値型を格納するとボクシングが起きて効率がよくないと
何かで見ました。効率など気にせず実際に利用されていますか?
また、列挙型ではボクシングは発生するのでしょうか?
0042デフォルトの名無しさん2005/12/17(土) 16:40:24
>>41
列挙型は値型なのでボクシングは起きる

実行効率が必要かいなかも不明な状態で
実行効率を気にするのは馬鹿のすること
0043デフォルトの名無しさん2005/12/17(土) 22:17:25
privateなコンストラクタをもつクラスHoge(既存でいじれない)は
Hoge hoge = new Hoge();
ってできないですよね?
ここで
Hogeを返すtool.hogeってメソッドがある場合、
Hoge hoge = tool.hoge();
は通りますよね?
なんとかして、Hogeを継承するクラスって作れないでしょうか?
toolはpublic classでどっからでも呼べます。

やりたいことはHogeにプロパティ、メソッドをいくつか増やしたいだけなのですが。
0044432005/12/17(土) 22:27:11
キャストまたはas演算子でHogeとみなせればどんな方法でもかまいません。

よろしくお願いします。
0045デフォルトの名無しさん2005/12/17(土) 22:44:18
Hogeのインスタンスをフィールドとしてもつクラスを作り
ユーザ定義のキャストで Hoge にキャストできるようにする
0046デフォルトの名無しさん2005/12/17(土) 22:46:22
あんたむちゃいうな。
0047デフォルトの名無しさん2005/12/17(土) 22:47:57
もうちょっと言っとくと、
ユーザ定義のキャストを実施した時点でMyHogeはHogeそのものに変えてしまうしかなく、
もはや追加のプロパティなどは存在できない。
0048デフォルトの名無しさん2005/12/17(土) 22:48:33
いや、ひょっとしてそれでいいのかな。
だったらすまん。
0049デフォルトの名無しさん2005/12/17(土) 22:57:47
プロパティやメソッドを追加するだけらしいから
オーバーライドがないってことでいいんじゃね
0050432005/12/17(土) 23:55:39
public static implicit operator
で試してみます。
ありがとうございました。
0051デフォルトの名無しさん2005/12/18(日) 05:02:51
Microsoft Visual C# 2005 Express Editionの制限ってどんなものがありますか?
0052デフォルトの名無しさん2005/12/18(日) 07:53:34
ttp://www.microsoft.com/japan/msdn/howtobuy/vs2005/editions/stdexp/
ttp://www.microsoft.com/japan/msdn/vstudio/productinfo/productline/
0053デフォルトの名無しさん2005/12/18(日) 11:10:32
ひょっとしてExpress EditionてUserControl作れない?
0054デフォルトの名無しさん2005/12/18(日) 11:13:30
Expressはβ2でしか弄くってないが作れた記憶があるぞ
0055デフォルトの名無しさん2005/12/18(日) 12:11:10
つくれないのはインストーラ
0056デフォルトの名無しさん2005/12/18(日) 12:49:52
話を総合すると、数Mbyte程度のWinアプリを作っている人なら
Express Editionで十分って事ですか。
Standard Edition買おうかと思っていたけどタダのExpress Editionと比べると
お金払ってまで必要なのか?と思ってしまいます。
0057デフォルトの名無しさん2005/12/18(日) 13:18:37
Standardとの大きな違いは、対応言語、CompactFrameworkでの開発の有無、クラスデザイナ、辺りかな。
詳しくはMSとかに。
//日本語のじゃ全製品の詳細比較が見つからないんだが……。
製品版はどうせ2月発売なんだから、それまではExpressEdition使って様子を見ればいい。
0058デフォルトの名無しさん2005/12/18(日) 13:26:11
Javaしか知らないんですがC#の案件をやることになりました。
文法はよく似てるんですが何か決定的な違いとかこれは気をつけろみたいなのありますか?
0059デフォルトの名無しさん2005/12/18(日) 13:49:07
>>57
確かに現状Express Editionしかないんだしね。
様子を見るしかありませんね。
0060デフォルトの名無しさん2005/12/18(日) 14:14:24
案件によるが、一番Javaの人が引っかかるのはやはりデリゲートかね?
0061デフォルトの名無しさん2005/12/18(日) 14:24:37
>>58
Main
0062デフォルトの名無しさん2005/12/18(日) 14:25:19
P/Invokeと構造体
0063デフォルトの名無しさん2005/12/18(日) 14:50:25
Express Edition には System.Runtime 空間がない。
→P/Invoke とか、Marshal が使えない。

1.1でクラスライブラリ作れってことかな。
0064デフォルトの名無しさん2005/12/18(日) 14:53:48
webページを取得するのにHttpWebRequestクラスとか
TcpClientクラスとかWebClientクラスがありますが
どれが一番早く処理できますか?
0065デフォルトの名無しさん2005/12/18(日) 14:54:05
なんと、Express EditionはSDKにも劣るのか。


馬鹿なこと言うな。大体標準ライブラリの名前空間が無いってどういう意味だ。
0066デフォルトの名無しさん2005/12/18(日) 14:54:57
>>64
コーディングの手間ならWebClientが一番小さいな
0067デフォルトの名無しさん2005/12/18(日) 14:57:32
>>63
ヘルプ?のリファレンスには無いけど、普通に使えた。
インテリセンスにも表示されたし。
0068デフォルトの名無しさん2005/12/18(日) 14:59:39
ん〜? 普通にあるぞ?
ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.ja/cpref11/html/N_System_Runtime_InteropServices.htm
0069デフォルトの名無しさん2005/12/18(日) 15:02:57
Expressだとリファクタリングの機能が大幅に少ない?
フィールドのカプセル化の機能は期待してたんだが、メニューにないorz
0070632005/12/18(日) 15:11:03
ありゃ、ほんとだ。

ヘルプの
Visual Studio 2005 Express Edition 対応 MSDN ライブラリ
 - NET Framewrok SDK ドキュメント
  - クラスライブラリ
の中に見つからないから誤解してた。
0071デフォルトの名無しさん2005/12/18(日) 15:35:44
結構ドキュメントにないの多いね。いちいちwebに探しに行ってうざい。
Microsoft.Win32.Registoryとかもない
0072デフォルトの名無しさん2005/12/18(日) 15:45:08
いやあるよ?
ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.ja/cpref1/html/T_Microsoft_Win32_Registry.htm

なんだ、私のドキュメントとほかの人のは別物なのか?
SDK入れた後でExpress入れたんだけど。
0073672005/12/18(日) 15:53:08
俺も見つからない… >>68>>72
0074デフォルトの名無しさん2005/12/18(日) 15:53:23
えーーー
第一cpref1.hxsがない
expressと同時にいれたやつだと少ないのかな?
とりあえず間違えて落としたSDK解凍して漁ってみる
0075デフォルトの名無しさん2005/12/18(日) 17:43:13
俺もないな。
何でだろ。

0076デフォルトの名無しさん2005/12/18(日) 18:09:09
ArrayListの中のPointをPoint[]としてとりだすにはどうしたらいいでしょうか?

(Point[])arrayPoints.ToArray();

は通りませんでした。
0077デフォルトの名無しさん2005/12/18(日) 18:13:04
もうひとつのオーバーロード
0078デフォルトの名無しさん2005/12/18(日) 18:14:47
(Point[])arrayPoints.ToArray(Type.GetType("Point[]"))
ってことですか?
無事いけたみたいです。

ありがとうございました。
#なんで気づかなかったんだろう…orz
0079デフォルトの名無しさん2005/12/18(日) 18:19:30
Typeを静的に取得するにはtypeof使えー。
0080デフォルトの名無しさん2005/12/18(日) 18:20:01
文字列で型情報を取り出さずに typeof を使えよ
0081782005/12/18(日) 18:28:34
(Point[])arrayPoints.ToArray(typeof(Point));
でいけました。
>>78でかいたのはコンパイル通ったもののエラーでした
×(Point[])arrayPoints.ToArray(Type.GetType("Point[]"))
×(Point[])arrayPoints.ToArray(Type.GetType("Point"))
○(Point[])arrayPoints.ToArray(typeof(Point));

レスありがとうございまいsた。
0082デフォルトの名無しさん2005/12/18(日) 19:24:30
>>66
ありがとうございます。
webページをゲットするスピードは
どれもあまり変わらないのでしょうか?
また他にアクセスできるクラスとかあったり
しますか?
0083752005/12/18(日) 19:40:49
>>67, >>70, >>71, >>74
見つけた。.NET Framework 2.0 SDKのドキュメントに含まれてた。
一旦MSDN Express Libraryをアンインストールして、
SDKを入れてからもう一回MSDNライブラリ入れたら見れるようになった。
普通にインストールするだけでもいけたのかもしれん。
0084デフォルトの名無しさん2005/12/18(日) 21:24:24
using (FileStream fs = File.OpenRead(@"70M位の実在するファイル.txt"))
using (StreamReader reader = new StreamReader(fs, Encoding.Default))
{
  do
  {
    line = reader.ReadLine();
    Console.WriteLine(line);//なぜかlineが nullなんですけど なぜでしょう
  } while (line != null);
}
0085デフォルトの名無しさん2005/12/18(日) 21:30:12
なんか変態。
streamreaderでファイル開いちゃだめなの?
0086デフォルトの名無しさん2005/12/18(日) 21:31:26
うん変だね
0087デフォルトの名無しさん2005/12/18(日) 21:37:30
 StreamとStreamReaderの関係とかProcessとThreadとか、.NETのクラスライブラリの中で野クラスの相互関係、のドキュメントどっかない?
 それあれば大雑把に仕様把握するのが早くなるのに。
0088デフォルトの名無しさん2005/12/18(日) 21:40:46
>>83
あとからSDKのドキュメント部分だけインストールでもいけた。
//SDKインストールだけじゃドキュメントに出てくれなかったんだよな……。
0089デフォルトの名無しさん2005/12/18(日) 21:49:04
class Vector{
  int key;
  int value;
}
というクラスがあって、その配列
Vector v = new Vector[n];
を作った後に、要素keyだけを配列として取り出すことは
できますでしょうか?

例えば、SortedListの、Keysプロパティのように、
とりだした配列なりコレクションなりを
foreach構文にかけることがしたいのですが・・・

よろしくお願いいたします。
0090デフォルトの名無しさん2005/12/18(日) 21:54:56
レスありがとうございます。

ファイルを開いて>一行ずつ読み込んで・・
と日本語をそのままコードにしていったときにそうなってしまったのですが。

StreamReaderをそのまま使うと問題ないです。
でも、なぜFileStreamを開いて、StreamReaderに渡して実行できないのかわからないのです。
(Streamを渡して〜〜するという処理をやる予定があるので勉強のため)

↓でも同じようなコードがあるのですが 知ってる人いませんか?
「C#で作るWindowsアプリ −ファイルを読み込む− 」
http://www.divakk.co.jp/aoyagi/csharp_winexe_04.html
// ファイルを読み込む
Stream stm = opendlg.OpenFile();
if (stm != null) {
StreamReader reader = new StreamReader(stm);
mTextBox.Text = reader.ReadToEnd();
stm.Close();
}
0091デフォルトの名無しさん2005/12/18(日) 21:55:36
一回り拾っていってArrayListに突っ込んでいく
0092デフォルトの名無しさん2005/12/18(日) 21:58:48
ないのでforeach(Vector v in vectors){ v.key....}とVectorでまわすべし
#elementの名前がVectorなのがちょっと引っかかるが。。
0093892005/12/18(日) 21:59:03
>>91
やっぱそれしかないのですかね・・・
今はそうしているのですが、
O(n)になっちゃうので、毎回参照されるとつらいですよね・・・

Vectorクラスか、外側のクラス(Vectorをコンポジションするクラス)
に細工をしてどうにかならないでしょうか?
0094デフォルトの名無しさん2005/12/18(日) 22:02:08
>>93
配列で何がしたいんだ?
たぶん、配列でまわすのもVectorのまままわすのも同じようにできると思うよ。
0095892005/12/18(日) 22:05:26
>>94
外側に
class Container{
  Vector[] data;

  public int[] Keys{
    get{
      :
      :
    }
  }
}
SortedListみたいなコンテナクラスを作っていまして、
として、Vector[] dataのkey要素だけを返すような
プロパティが作りたいのです。
Keysプロパティを参照されるたびに「・・・・」の部分で
コピーして返す、ってのはイヤですよね・・・?

0096デフォルトの名無しさん2005/12/18(日) 22:15:31
そもそもKeysを頻繁に使う必要あるの?
あるなら、内部データとして喪ってもいいかもしれないけど、ソートなどにあわして更新しなおすオーバーヘッドかかる。
0097892005/12/18(日) 22:20:30
>>96
内部のアルゴリズムで使われていたりします。
積極的な理由としては、将来、複数のコンテナクラスを、
interfaceをimplementしたクラスとしてまとめたときに、
統一性がはかれるように、というのが目的なのですが。

なお、Vector[] dataの要素数は10000ぐらいです。
おっしゃるとおり、別にkeys[]という参照の配列を持とうとも
考えたのですが、他のメソッドも書き直す必要があって、やめました。
10000ぐらいならコピーのオーバーヘッドを黙殺するというのも
手ではあるのですが・・・
0098デフォルトの名無しさん2005/12/18(日) 22:28:37
内部アルゴリズムはvector.keyでまわして、外部にはコピーしてまわすとかもありでは?そういう仕様だから使うときはKyes[2]と化するなといっておいて。
両方ともどれぐらいのパフォかによるけど。
0099デフォルトの名無しさん2005/12/18(日) 22:34:10
keys が vector じゃなくてもいいなら
IEnumeratorとインデクサを実装した KeyCollection とか定義してkeysで、
それを返せばいいんじゃない?
0100デフォルトの名無しさん2005/12/18(日) 22:34:47
内部でキーと値別々に持てば良いんじゃね
0101デフォルトの名無しさん2005/12/18(日) 22:34:50
こんなのもあり?

class VectorKeyEnumerator : IEnumerator{
    private Vector[] vectors;
    ・・・
}
class VectorKeys : IEnumerable{
    private Vector[] vectors;
    ・・・
}

class Container{
    Vector[] data;

    public IEnumerable Keys{
        get{return new VectorKeys(this.data);}
    }
}
■ このスレッドは過去ログ倉庫に格納されています