ふらっとC#,C♯,C#(初心者用) Part37at TECH
ふらっとC#,C♯,C#(初心者用) Part37 - 暇つぶし2ch773:763=766=769
09/02/21 22:27:41
皆さんありがとうごさいます。
拡張メソッドも、STLもC#2.0では使えないようなので、
今ある機能で間に合わせることにしました。
先頭要素の取得は↓のような感じで。

SortedDictionary<Key, Value>.Enumerator e = contaner.GetEnumerator();
e.MoveNext();
return e.Value;

でも、なんかもやもやする・・・

774:デフォルトの名無しさん
09/02/21 22:32:56
あ、SortedList.Enumeratorの実装次第では、System.Linq.Enumerableクラスが
拡張メソッドとして提供するFirstメソッドは高速(少なくともO(log N)、最初のノードを
内部で保持していればO(1))である可能性があるね。その代わりLastは内部で全部列挙
しやがるんだろうなあorz

775:デフォルトの名無しさん
09/02/21 22:35:03
>>773
大丈夫、拡張メソッドFirstの内部実装はそれだ。で、Lastの内部実装は>>774だ。
でも、そんなにSTLやアルゴリズムが好きなら、LINQ to Object(さんざん出ている
System.Linq.Enumerableクラスが提供する拡張メソッドのことね)は確実に
気に入ると思うよ。まだまだ足りない物は確かに多いんだけど。

776:デフォルトの名無しさん
09/02/21 22:52:57
LINQ to Objectは気にいりそうな気がしますが
VS2008からみたいなので諦めます。

でもListの末尾要素を順序探査して拾うってのは、
ちょっとひどいような(;'A`)

将来的には改善されるとは思うので、
LinqがあるVS買ったら書き換えるようにします。

777:デフォルトの名無しさん
09/02/21 23:09:02
>>773
ねえ、それで、「順序に関する」最初の要素ってちゃんと取得できてる?
気になってリフレクタでSortedDictionaryの実装を見てみたんだけど、
内部でTreeSet<T>っていうinternalクラスを使っているのね(赤黒平衡木っぽい)。
で、GetEnumeratorするとこのTreeSetのGetEnumeratorに丸投げされて、
ResetしてMoveNextしてCurrentを参照するとルートノードが返される実装になって
いるっぽいんだが。

このTreeSet<T>をpublicにしてくれれば>>773のもやもやも解消するだろうになあ。
これはモノホンの平衡二分木になっている。それで、
InOrderTreeWalk(TreeWalkAction<T> action)
ってメソッドがあって、どうやら、条件式によって[a,∞)の形の区間を指定してその区間
に含まれる最初のノードを探索してくれるみたい。ただし、結局逆順の探索は実装されて
ない。orz.

>>776
Express Editionは無料ですよ。確か2005と共存もできるし。とりあえず入れて見たら?
業務での開発?

778:777
09/02/21 23:11:09
あ、問題ないみたいだ。ごめん。左に左にと進みながらスタックにpushしている。

779:デフォルトの名無しさん
09/02/21 23:18:51
>777
趣味の開発なのですが、Expressエディションだと
クラスデザイナが使えないようなので手をだしてません。
リファクタ機能とクラスデザイナの使い心地試すのを
第一優先でC#に手をだしてるものでして・・・。


780:デフォルトの名無しさん
09/02/21 23:42:46
Expressにリファクタ機能ないんだ!!

781:デフォルトの名無しさん
09/02/21 23:49:43
あるよ

782:デフォルトの名無しさん
09/02/22 01:18:03
手元のC#2008EEだと、
リファクタ(R) → 名前の変更, メソッドの抽出
しかないな。
インテリセンスはちゃんと効くけど

783:デフォルトの名無しさん
09/02/22 01:27:48
Enumerableの実装がどうこうとか言っている暇があったら、
自分で(拡張メソッドを)オーバーロードすればいいのに

まあ、これくらい標準で用意してくれという意見なら賛成するが

public static ListEx {
  public static T First<T>(this IList<T> list) { return list[0]; }
  public static T Last<T>(this IList<T> list) { return list[list.Count - 1]; }
  public static IEnumerable<T> Reverse<T>(this IList<T> list) {
    for(int i = list.Count - 1; i >= 0; i--) yield return list[i];
  }
}

784:デフォルトの名無しさん
09/02/22 01:32:56
拡張メソッド使えるなら、全部あるよ。
URLリンク(msdn.microsoft.com)(VS.95).aspx

785:デフォルトの名無しさん
09/02/22 01:43:57
>>782
それだけあれば十分じゃね?
つか、それしか使ったことない気がする

786:デフォルトの名無しさん
09/02/22 01:51:09
>>784
そうじゃなくて、IEnumerable<T>を想定した(汎用的で効率の悪い)実装ではなく、
IList<T>、etc. 専用に効率の良い(かもしれない)実装**も**用意してくれという話

てか、最初の単語くらいは見てくれよw

787:デフォルトの名無しさん
09/02/22 06:25:47
>>783
もちろんそれで良いんだけど、まさに、「標準で用意してくれ」って意見なんだよね。
それと、SortedDictionaryだと>>773みたいに列挙の必要はないのにEnumerator
をとることになって格好悪い。

具体的には、IEnumealeは順序を保証しない列挙に特化(Reverse, First, Lastなし, その代わり
foreachの並列実行サポート)して、IOrderedEnumerableみたいなインタフェースを追加する。

こいつには順序に従った区間(-∞,a]と等価なbool値デリゲートおよび探索開始ノードを取るLast,
順序に従った区間[a,+∞)に等価なbool値デリゲートおよび探索開始ノードを取るFirst, 及び順序に
従って前方、後方に移動できるIOrderedEnumeratorを与えるGetOrderedEnumeratorメソッドが
あって、順序があって先頭・末尾があるコレクションはこいつで表現される。そんでもって標準で
拡張メソッドで``アルゴリズム''を提供する。これが一番みんなが幸せになれるんじゃないかな。
LINQに慣れると、標準での汎用的なインタフェースへの拡張メソッドの提供という事の便利さが
身に染みる。

>>771も気になるけれど、IEnumerable<T>, IList<T>, ICollection<T>インタフェースへの
拡張メソッドによる実装なので、ツリー状の構造を活かしたバイナリサーtはなくって、IList<T>
のインデックスベースのバイナイサーチしかないみたい。それはそもそもList, SortedListにはある
以上魅力に乏しいよなあ。


788:デフォルトの名無しさん
09/02/22 06:48:47
ああ、IOrderedEnumeratorなんて作らなくても、ノードを与えて、前方、後方のノードを取得する
forward, BackメソッドをIOrderedEnumerableに含めれば良いのか。ますますSTLっぽくなってきた。

インタフェースの設計って難しいなあ。だから標準で(略)

789:デフォルトの名無しさん
09/02/22 11:15:26
実際FirstとかElementAtとかToArrayなんかはIList<T>の場合は特別扱いされるから
余計な心配はいらないよ
ソース読めばわかる

790:デフォルトの名無しさん
09/02/22 11:25:41
各要素の値を見る必要のないメソッドはすべてIList<T>に対して特別に最適化されてるみたい

791:787
09/02/22 12:52:08
どうにかして欲しいのはSortedDictionaryやLinkedListなんだ~~~。
と叫んでみる。順序と特別な探索の方法を持つデータ構造を活かす汎用的な
(C++の``アルゴリズム''的な)方法がないんだよ。
 
IList, IList<T>だったらそりゃ特別扱いもされているし、>>783のコードでも、
>>771のライブラリでも良い。
 
ただ、>>773のFirst()のコードは>>778によって、ルートからの探索でO(logN)で先頭ノードに
辿り着くので二分木の構造は結局活かされるみたいね。これはLINQの実装そのものだからLINQ
でも同じ。

792:デフォルトの名無しさん
09/02/22 13:32:49
いまcsvを読んでDataGridViewに表示しています。
さらに、csvのある項目から文字列を複数個生成し、それをArrayListに入れています。
そのArrayListをさらにFormのメンバ変数のArrayListに入れています。

「DataGridViewの1行のデータ」を使用するときは、表示されている情報のほかに、
上記のArrayListの文字列も使いたいのです。
今は選択された行のindexから、メンバ変数のArrayListからその行のArrayListを取り出して使っています。

これで動いているのでいいんですが、
たとえばDataGridViewの1行に直接不可視のカラムでArrayListを追加できれば、メンバ変数で別途管理しなくてもすむと思うんですが、
DataTableのColumnのAdd()で指定するDataTypeにはArrayListがありません。

こんなように、DataGridViewには非表示で、1レコードに紐付けて管理したいListやCollection等があった場合、
みなさんどう管理しますか?

793:デフォルトの名無しさん
09/02/22 16:19:20
Tag

794:デフォルトの名無しさん
09/02/22 16:54:16
PropertyGridと同じように普通にBrowsableAttributeが使えると思うんだけど、
そういうことじゃないのかね。

ほとんどDataGridView使ったことないもんで勘違いだったらすまんが。。

795:デフォルトの名無しさん
09/02/22 19:00:45
Visual C# Expressをインストールしました。
MS-DOSで.csファイルをコンパイルしようとしたけど出来ませんでした。
Pathが通っていないからだと思い、csc.exeを探したのですが見当たりませんでした。

796:デフォルトの名無しさん
09/02/22 19:03:37
それなら多分 .NET Framework を入れるだけでよかったのかも
PATH は \WINDOWS\Microsoft.NET\Framework\v2.0.50727

797:デフォルトの名無しさん
09/02/22 19:06:42
Visual Studio Toolsのコマンドプロンプトからやってみて

798:デフォルトの名無しさん
09/02/22 19:08:50
>>795
%frameworkdir%\%frameworkversion%にある
そんな環境変数見当たらなければ、%windir%\Microsoft.NET\Framework\v2.0.50727

799:デフォルトの名無しさん
09/02/22 20:26:57
XMLで出力されるドキュメントコメントをHTML形式とかで見るいいツール知らないでしょうか。
ndocとかいうのがぐぐるとひっかかったのですが、 2008では使えないみたいで。


800:デフォルトの名無しさん
09/02/22 20:32:56
Sandcastleとか

801:デフォルトの名無しさん
09/02/22 20:32:59
オナこいてる方も、女とやってる方も教えてくんろ

他アプリケーションのコントロールのハンドルを取得して、
そいつにPostMessageなんぞ使って、
要するにそのアプリをコントロールしたいんだわ

ところが、
SunAwtFrame
ってウインドウクラスのコントロール達の
ハンドルが取得できないどころか探せすらできない。
Spy++で見ても親ウインドウしか見つからない・・・。
これってJavaのクラス?
なんか良い方法はないでしょうか?

802:デフォルトの名無しさん
09/02/22 20:34:40
ほぼsandcastle一択。
素のままで使うのは大変なのでsandcastle help file builderをフロントエンドとして使うのが良い。

803:デフォルトの名無しさん
09/02/22 20:37:03
javaのコントロールってウィンドウハンドル持ってないんだっけ?
それならウインドウの中身を一枚の絵として描いてるだけなんだからどうしようもない

804:デフォルトの名無しさん
09/02/22 20:39:30
同じようなもので、IE のウィンドウがある。あれも一枚絵。

だけど、IE のウィンドウについては IHtmlDocument インターフェイスが用意されてる。
Java(Awt) に同じようなものがあるかは知らん。

805:デフォルトの名無しさん
09/02/22 21:23:46
>>798
というか今いれてという話なら 2008 じゃないかって気がするから
v3.5 の下だと思う > csc.exe

806:797
09/02/22 21:25:33
無視すんなコラ

807:デフォルトの名無しさん
09/02/22 21:25:46
よくわかってない人が来ました。

808:デフォルトの名無しさん
09/02/22 21:30:55
>>806
たしかVC++以外のエクスプレスには無かったはず。

809:デフォルトの名無しさん
09/02/22 21:34:33
>>803,804

おまえらありがと
ちょっくら違う手を考えてみる

810:デフォルトの名無しさん
09/02/22 22:14:59
>>802
質問者じゃないけど、これ知らなかった
今インストールして試してみたが、便利だな
利用させてもらうよ

811:デフォルトの名無しさん
09/02/22 22:25:01
>>810
コンソール版も同梱されているので、VisualStudioの外部ツールに
タイトル:Sandcastle Help File Builder
コマンド:C:\Program Files\EWSoftware\Sandcastle Help File Builder\SandcastleBuilderConsole.exe
引数:$(ProjectDir)$(TargetName).shfb
"出力ウィンドウを使用"にチェック
"起動時に引数を入力"にチェック
って感じで登録しておくと便利。

812:デフォルトの名無しさん
09/02/22 22:27:43
すげえええええええ

813:799
09/02/22 22:54:53
>>800, >>802
sandcastle使ってみました。
感動した。

ありがとうございます。


814:デフォルトの名無しさん
09/02/22 22:59:13
SandCastle使うと自分が適当に作ったライブラリが標準のライブラリと対等に見える不思議。
PresentationStyleはvs2005にするとMSDNと似たフォーマットになるよ。


815:デフォルトの名無しさん
09/02/23 00:22:45
C#2.0で質問です
親 ClassA→ClassB→ClassC 子
とクラスを継承していて、ClassCはインスタンスも生成でき、ClassCからの継承も可させたいけど、
ClassBやAから継承したクラスを作らせたくないようにしたり、直接、ClassBやAのインスタンスを
生成させたくない場合はどうすればいいですか?

クラスライブラリとして公開したいので、ClassCは自由に利用してもらいたいのですが、
ClassBとClassAは非公開にしておきたいのですが、どうすればいいでしょうか。



816:デフォルトの名無しさん
09/02/23 00:27:14
AとBをinternalにして、C をpublicにすればいいんじゃね?

817:デフォルトの名無しさん
09/02/23 00:29:31
そう思ったんだけど、
アクセシビリティに一貫性がありません。基本クラス 'ClassA' のアクセシビリティはクラス 'ClassB' よりも低く設定されています。
ってエラーで弾かれるのです(´;ω;`)ブワッ



818:デフォルトの名無しさん
09/02/23 00:32:03
AやB自体のアクセスレベルはpublicのままで
コンストラクタをinternalにする
.NET Frameworkのクラスでは多用されてるやり方

819:デフォルトの名無しさん
09/02/23 00:51:58
なるほど、そんなやり方があったんですね
ただ、それだとインスタンスが生成できないというだけで、
継承はできるので、継承元クラスのProtectedのメソッドが見えてしまったり、
インテリセンス(?)にIDE上ででてきてしまったりしますよね。
なるべく余計な情報を出したくないんですが、無理なら仕方ないのかな。

820:デフォルトの名無しさん
09/02/23 01:05:20
>>819
そもそも、それならClassAもClassBも必要ないはずだと思うんだけど。
全部ClassCに書けばいいじゃん。
派生できないベースクラスなど何の意味があるの?

ClassCという型の存在を隠したまま、そのインスタンスをClassAとして使わせたい、
ってのならよくわかるし方法もあると思うんだけど。

821:デフォルトの名無しさん
09/02/23 01:10:17
共通して利用する処理を基底クラスに書いておくってのは普通にないか?
クラスライブラリごとに開発チームが違うような場合
最も表面的なところしか見せたくない場合もあると思うんだが

822:デフォルトの名無しさん
09/02/23 01:19:29
うんだから派生クラスを隠したいというのなら話はわかるけど……、
と言ってるんですが。

823:デフォルトの名無しさん
09/02/23 01:30:17
継承を使わないで、委譲させればいいんじゃないかな?

824:デフォルトの名無しさん
09/02/23 01:36:23
いや基底クラスの関数群はそのチームでしか必要ないクラスだから
派生クラスだけ公開したいという場合もあるんじゃないか?

825:デフォルトの名無しさん
09/02/23 04:08:32
ドスプロントでコンパイルしようと思って、Path通そうとしたら、
C:\Program Filesの中にcsc.exeが見当たらなくて焦った。
C:\WINDOWSの中にあったのね。

826:デフォルトの名無しさん
09/02/23 07:51:09
ドスプロントとかいつの時代だよ

827:デフォルトの名無しさん
09/02/23 07:52:34
Win7にも絶賛登載中ですが

828:デフォルトの名無しさん
09/02/23 07:53:08
>>821
そういう場合、お作法としては、移譲、
要するに、ちょっと面倒だけどメンバーとして持って、
ClassA a;
void Foo() { a.Foo(); }
とする方がいいということになってる。


829:デフォルトの名無しさん
09/02/23 07:55:26
>>826
PowerShell が .NET に依存してて、
.NET が GUI 機能に依存してるから外すに外せないらしいね。
.NET Framework の GUI 外したバージョンも作って欲しいんだけどなぁ。

830:デフォルトの名無しさん
09/02/23 08:12:22
コマンドプロンプト仕えよ

831:デフォルトの名無しさん
09/02/23 08:17:41
このスレ的にMonoってどうなの

832:デフォルトの名無しさん
09/02/23 08:22:54
スレちがい

833:デフォルトの名無しさん
09/02/23 09:47:12
.NET Framework単体での質問スレが見つからなかったのでこちらに質問させて下さい。

.NET Framework Version 3.5 の新機能
URLリンク(msdn.microsoft.com)

にある

> Socket 名前空間に対する機能強化の一環として、一連のクラスが新たに追加されました。

とは具体的にどのクラスを差すのでしょうか?

834:デフォルトの名無しさん
09/02/23 13:37:43
C#でWiiリモコンの制御ってどうやるんですか?
参考になるサイトなどお教えください


835:デフォルトの名無しさん
09/02/23 17:30:24
>>834
まずはリモコンの素材について学んで来い
そしたら教えてやる

836:デフォルトの名無しさん
09/02/23 22:38:58
新しいものに対する拒否反応以上ではないような気がするな。
一度XAMLなしで簡単なプログラムを書いてみるといいよ。
やってる途中でバカバカしくなるから。

837:デフォルトの名無しさん
09/02/23 22:39:45
>>836
すまん、誤爆

838:デフォルトの名無しさん
09/02/23 22:49:42
気にするな
理解した
向こうにレスする必要なし

839:デフォルトの名無しさん
09/02/23 23:31:13
>>834
Managed Library for Nintendo's Wiimote でぐぐれ。

840:デフォルトの名無しさん
09/02/23 23:38:38
DataGridViewにて困っております。
バインドしたDatatableのデータを更新すると、
グリッドの方にも反映されますよね?
その時のセルを取得したいのですが、
CellValueChangedイベントで拾えませんでした。
何か方法よいありますでしょうか?

841:デフォルトの名無しさん
09/02/23 23:44:39
>>839
ジョークだと思ったら本当にあるのなw

842:デフォルトの名無しさん
09/02/23 23:59:13
>>840
rowdataboundイベントでe.rows.cellsとかで取得できないの?

843:デフォルトの名無しさん
09/02/24 00:09:52
>>841
日本だとMS製品と水と油な感じの派閥でも、
海外では.NETに前向きな雰囲気。
Wiimote以外にも、iPhoneで.NET(Mono)使うとか普通にやられてる。


844:デフォルトの名無しさん
09/02/24 00:11:24
>>842
DataGridViewには該当するイベントはないですね。
似たイベントを探しましたが、見あたりませんでしたorz

845:デフォルトの名無しさん
09/02/24 00:14:15
BindingSource_EndEdit()

CurrentCell

この辺

846:デフォルトの名無しさん
09/02/24 00:19:20
>>845
確認してみます。

847:デフォルトの名無しさん
09/02/24 00:22:15
> 834
このページにのってる
URLリンク(www.kosaka-lab.com)

質問する前にググれよ


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