トップページ⇒tech
1002コメント345KB

ふらっと C#,C♯,C#(初心者用) Part118 [転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/11/23(月) 00:54:33.10ID:d/p1Vajd
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。

他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。

内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。

なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part117 [転載禁止](c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1443786608/

■関連スレ
C#, C♯, C#相談室 Part89 [転載禁止](c)2ch.net
http://peace.2ch.net/test/read.cgi/tech/1443271409/

■コードを貼る場合は↓を使いましょう。
http://ideone.com/
0002デフォルトの名無しさん2015/11/23(月) 12:09:09.65ID:blqHyLLr
>>1乙
0003デフォルトの名無しさん2015/11/23(月) 12:15:55.82ID:/RGpvc/8
>>1
乙です

今@ITでADO.NET Entity Framework入門っていう記事読んでるけど、むずかしいぜ。
前スレでちょっと出てきたDB関連の話でまったく知らなかったから参考に読んでるだけど
これ仕事ででてきたら果たして使えるようになるのか心配だ・・・今すぐ使うわけじゃないのが救い。
0004デフォルトの名無しさん2015/11/25(水) 03:47:30.32ID:VpIXdAyb
C#で簡単にVSYNC待つ方法ないですか?
今Windows FormでVSYNC待つだけのためにDxLibを使っています
CPUパワーを食わずに、コードもあまり書かずに簡単にVSYNCだけ待てれば
DxLibに頼らずに済むのですが
2010Expressを使っています
0005デフォルトの名無しさん2015/11/25(水) 03:52:32.72ID:A+DiyrlM
Windowsで使ったソフトの順序を取得する命令ってありますか?
Alt+Tabを押すと使った順に並んだ小窓が出るのでどこかに記録されているのではないかと思っているのですが
探し方が悪いようで見つからないです。
0006デフォルトの名無しさん2015/11/25(水) 22:40:12.84ID:ZWYoQ/Cr
教えてください。

【やりたいこと】
既存のクラスのメソッドの一部の機能を拡張したい。
具体的にはクラス(インターフェイス)AをクラスBのメソッドCに引数として渡す。
メソッドCはインターフェイスAのメソッドからデータを受け取り、データがなくなるまで処理を続ける。

このクラスAとクラスBは既成の物で、オブジェクトファイルの形式で提供されていて、ソースコードレベルでの改造は出来ない。
具体的にはデータ量が多い場合に備えて、メソッドCを実行中に外部からキャンセルを受け付けるように改造したい。

【対策案1】
メソッドCに準じたメソッドDを自作する。
→メソッドC内ではクラスBの private なメンバ変数等を使用しているため、外部に機能拡張版のメソッドを用意するのは容易でない。

【対策案2】
インターフェイス(クラス)Aを包含するクラスA’を用意して、これをメソッドCに渡す。
具体的にはインターフェイスAを継承したクラスA’を用意し、コンストラクタ等でクラスAのインスタンスを渡す。
クラスA’ではインターフェイスAで定義された全てのメソッドやプロパティにクラスAのインスタンスの同じメソッドやプロパティを呼び出すように実装する。
→インターフェイスAに定義されているメソッド等が多いのでとても面倒。と言うか、後のメンテナンス性が悪すぎる気がする。

【対策案3】
クラスBに相当するクラスを自作する。
→技術的にはやってやれないことはないが、時間的には無理。

【質問】
こういうときに有効な対策を教えてください。
0007デフォルトの名無しさん2015/11/25(水) 22:53:14.22ID:5wB+dJF6
上長に聞きたまえ
0008デフォルトの名無しさん2015/11/25(水) 23:16:59.10ID:jVhYVUAo
自分で作り直すのが無理なら
クラスBを作った人に修正をお願いするしかないんじゃない
0009デフォルトの名無しさん2015/11/26(木) 10:56:36.07ID:uhVdTG0g
Has AなクラスA'を作ってインターフェイス(A?)を実装
各メンバーではAに委譲する
Bがデータを要求するところだけキャンセルならデータ供給を止めるみたいな
0010デフォルトの名無しさん2015/11/26(木) 12:39:25.48ID:wLo/SUaP
細部は違うけど要するに案2だろ
面倒くさいから嫌だってw
0011デフォルトの名無しさん2015/11/26(木) 20:04:37.19ID:cJiE/pnV
ある集合の中から条件に一致するものだけ、値を変更して、
その集合を返すみたいな処理ってLINQでどう書けばいいんだろ?

1〜5の数字のうち偶数は!をつけて出力みたいな

1 2! 3 4! 5

whereしてからselectすると偶数だけのリストになっちゃうし、selectの中でwhere??
0012デフォルトの名無しさん2015/11/26(木) 20:39:44.72ID:QqGRNt0R
>>11
http://ideone.com/PD7B5Z

こんな風に馬鹿正直に書いたら駄目なん?
0013デフォルトの名無しさん2015/11/26(木) 20:50:40.56ID:XPm6ny2d
>>12
自分もそういう書き方しか思いつかなかったんですが、もう少しスマートに書けないかなと。

↑であげたのは簡略化した内容ですが、実際には

class Item{
bool Checked;
string KeyWord;
}

このクラスのリスト List<Item> に対して
あるキーワード文字列に一致する場合は、Checkedをtrueにして
そのリスト全体を返す。みたいなことがやりたいんだよね。
0014デフォルトの名無しさん2015/11/26(木) 20:56:13.07ID:QqGRNt0R
んならそういう働きをする拡張メソッドを書くしかないな
条件はFuncで与えるとして

Where()は条件に一致する集合しか返さない
そうではなく結果を{source, bool}みたいな感じでFuncに当てはまるか匿名型で返すような
0015デフォルトの名無しさん2015/11/26(木) 21:03:24.02ID:sUIZ4Kkh
>>12 見にくいので転載ボランティア

int[] sample = new int[] { 1, 2, 3, 4, 5 };
var res = sample.Select(i => {
return i.ToString() + ((i % 2 == 0) ? "!" : "");
});
foreach (var v in res)
Console.Write(v + " ");
0016デフォルトの名無しさん2015/11/26(木) 21:08:46.61ID:wLo/SUaP
手段と目的の逆転
0017デフォルトの名無しさん2015/11/26(木) 21:15:13.31ID:XPm6ny2d
>>14
やっぱ拡張メソッド定義するしかないんですね。

こういうパターンって結構ありそうな気もするんですが...
0018デフォルトの名無しさん2015/11/26(木) 21:20:59.72ID:96CZ8S8K
LINQは副作用に否定的だから
0019デフォルトの名無しさん2015/11/26(木) 21:23:12.42ID:zfiVTGcd
>>1
.Select((item) => new Item
{
 KeyWord = item.KeyWord,
IsChecked = (item.KeyWord == "a")
});
0020デフォルトの名無しさん2015/11/26(木) 21:27:28.22ID:KfvI2hmZ
副作用が出るのはIxのForEach使えばいい
0021デフォルトの名無しさん2015/11/26(木) 21:28:06.60ID:nO6kdv8X
すげぇ変なことしてんな
普通にSelectでやればいいかと思うのだが
0022デフォルトの名無しさん2015/11/26(木) 21:29:56.77ID:Vv+caMcJ
>>17
気持ちがわからないんだよな。
>>11と>>13の要望まとめるとこんな感じ?
http://ideone.com/TWOSN4
最後に元の集合返すLINQがこんな感じに作れるけど

http://ideone.com/gYYg48
これでいいじゃんってなる。
0023デフォルトの名無しさん2015/11/26(木) 21:33:39.93ID:Vv+caMcJ
ああ元の集合から作った新しい集合がほしいのか。
>>22は無しね!
でもそうだとしても>>21でいいじゃんね!
0024デフォルトの名無しさん2015/11/26(木) 21:41:44.00ID:QqGRNt0R
あ、やっぱり拡張メソッドを使うと変だね
無理にメソッドチェーンをする必要ない気がする
0025デフォルトの名無しさん2015/11/26(木) 22:40:51.15ID:sUIZ4Kkh
>>11 >>13
static void Main()
{
int[] source = new int[] { 1, 2, 3, 4, 5 };
var result = source.Join(new bool[]{true, false}, o=>true, i=>true, (o, i) => new Item(o, i))
.Where(p => { var r = p.Value % 2; return r == 0 && p.Checked || r == 1 && !p.Checked; });
result.ToList().ForEach(i => Console.Write("{0}{1} ", i.Value, i.Checked ? "!" : ""));
// => 1 2! 3 4! 5
}
class Item {
public readonly bool Checked; public readonly int Value;
public Item(int value, bool _checked) { Value = value; Checked = _checked; }
}
SQLっぽい雰囲気
0026252015/11/26(木) 22:52:39.19ID:sUIZ4Kkh
>>11
int[] source = new int[] { 1, 2, 3, 4, 5 };
var result = source.Join(new bool[]{true, false}, o=>true, i=>true, (v, c) => new {Value = v, Checked = c})
.Where(p => { var r = p.Value % 2; return r == 0 && p.Checked || r == 1 && !p.Checked; });
result.ToList().ForEach(i => Console.Write("{0}{1} ", i.Value, i.Checked ? "!" : ""));
// => 1 2! 3 4! 5

匿名型なんてのがあるのか
002762015/11/27(金) 00:00:23.02ID:V/UxGV6O
>>8-10
ありがとう。
やっぱり 案2 というか has a しかないかな。

でもよく考えたら特定用途にしか使わないことが明確ならインターフェイスの全メソッドを
真面目書く必要もないかも知れないと気がついた。
いやインターフェイスに定義されてるメソッド等の実装はしなきゃならないのは変わらないんだけども。
0028デフォルトの名無しさん2015/11/27(金) 01:58:20.80ID:iofAV5op
>>6
Interface IV
Cancel();

Interface IA:IV
V v=objectA;
0029デフォルトの名無しさん2015/11/28(土) 14:48:27.88ID:dnKF4fhx
データベースの内容を画面に表示、編集する方法で悩んでいます

・具体的にはデータベースの内容をDataGridViewに表示して
編集した内容をデータベースに反映したい
・テキストボックスに検索文字を入力してデータの絞込をしたい

調べたらこういう記事がありました
新グリッド・コントロールの豊富な機能と高い表現力 − @IT
http://www.atmarkit.co.jp/fdotnet/special/win20review02/win20review02_02.html
実際やってみたら、編集可にしているのにセルの値の編集が全く出来ない
(このやり方は表示するだけ?)
それに10年前の記事でとても古い
今だとどういう方法で実現すればいいでしょうか?
0030デフォルトの名無しさん2015/11/28(土) 16:34:28.63ID:N2qWmI2+
>>29
SQLiteなら
http://dangoya.jp/?p=116

こんなのとかたくさんあるみたい
0031デフォルトの名無しさん2015/11/28(土) 17:03:27.66ID:X+9lGRnl
>>30
それGUIの設計というより、DBからデータを取得する方法じゃないですか
しかも結果はデバッグ出力だし
全く参考にならない
0032デフォルトの名無しさん2015/11/28(土) 17:09:40.67ID:N2qWmI2+
http://park.geocities.jp/gdfsm000/cs/cs603.html

こんなのだったらいいのか
それにGUIなら

http://c-loft.com/blog/?p=1844

こういう奴とか?いくらでもあるんだが
0033デフォルトの名無しさん2015/11/28(土) 17:15:59.89ID:CPGEE3Eu
このバカが
コピペで要求満たせるサンプル持って来いってんだよ
すべて説明しないと察せないのか?
ガキか素人か?
0034デフォルトの名無しさん2015/11/28(土) 17:24:52.80ID:N2qWmI2+
お前教えてクレクレ君の癖に随分横柄な態度だな
自分で探せやアホ
0035デフォルトの名無しさん2015/11/28(土) 17:26:09.88ID:CPGEE3Eu
代弁してあげただけですよ〜
0036デフォルトの名無しさん2015/11/28(土) 21:57:42.37ID:QbwUMUmL
まあ>>29レベルの質問は
>教えてクレクレ君と言われてもしかないだろうな

初学者としても勉強不足だし
ググレカス以外のの返答は期待できない
0037デフォルトの名無しさん2015/11/28(土) 23:18:13.48ID:ExUydw0X
gridviewよりlistviewのがいいんだっけ?

てかこういうコントロール系って
サーバ側で取得するとき
全行ループしてFindControllでコントロール取得するんだよね?

MVC勉強してると、こういうの面倒くさいなと思う
0038デフォルトの名無しさん2015/11/28(土) 23:42:17.02ID:dnKF4fhx
SQLite→EF(or dapper)
まではようやく出来たのですが、いざDataGridViewに表示しようとすると
ソートができない、値の変更ができないなどがあって躓いてしまいました
調べると、データテーブルを使えばコードレスで表示する方法を見つけたのですが
DataGridViewでの変更をデータベースに反映する方法までは乗っておらず
一体どの方法でするのが一番いいのかわからなくなって質問しました

�@SQLite→EF(or dapper)→BindingListView→DataGridView
この方法だとLINQも使えて、値の変更も反映されるようですが
ソートやジェネリックに対応しようとするとBindingListViewや
BindingNavigatorの実装を自前で書かないといけなくて難しい
でもこれが完成するとほとんどFormにコードを書かなくて済むみたい

�ASQLite→TableAdapter→DataTable→データソース→DataGridView
表示するまでは簡単だけど、変更をデータベースに反映するのが大変?
EFやdapperを勉強したのは無駄だった?

比較的簡単なのはこの2つなのかなと思ったのですが
どのやり方が一般的というか簡単というか、そこのところが知りたいです
今後WEBシステムや業務用の顧客管理システムを作る予定は全くありません
ちょっとした自分用の動画や音楽のデータベースを作りたいだけです
0039デフォルトの名無しさん2015/11/28(土) 23:47:13.87ID:3Q3OpRos
>>38
EFなんか使わないのがベスト
(EFがターゲットとする)業務システムってとんでもなく複雑なんだぜ
それに比べりゃたかが動画や音楽のDBごときにEFなんか要らん
0040デフォルトの名無しさん2015/11/28(土) 23:49:15.85ID:kPVc8Ylo
>>38
ネットの情報見ながらなら�Aが楽かと
0041デフォルトの名無しさん2015/11/29(日) 00:05:54.22ID:aZc4OEnQ
LINQ勉強したならEFは使わないで、dapperとDBテーブルに対応するクラス作ってマッピングさせたほうがいい。

検索と更新、ソートが画面上からできればいいんでしょ?
0042デフォルトの名無しさん2015/11/29(日) 00:32:17.14ID:9octMKBL
>>39
EFを使わない方がいい理由は
三輪車にV6エンジン搭載するような感じですか?
ダメな理由があまり見つからないもので
重いからかな?確かにdapperと比べると遅いですけど

>>40
�Aの場合、DataGridViewの変更がDataTableに反映されて
それをTableAdapterでデータベースにUpdateという感じでよろしいですか?

>>41
マッピングまではやってみました
それをDataGridViewで検索、更新、ソートできるようにする方法が
調べた感じだとBindingSourceの自作しかなさそうだったのですが
他に方法はあるのでしょうか?

レスありがとうございます。それと質問ばかりですみません
一つのことを実現するのに方法が無数にありすぎて混乱してます
0043デフォルトの名無しさん2015/11/29(日) 10:31:35.90ID:BA+ijUMq
IEnumerableがいまいちぴんとこなくて初心者から抜け出せない・・・

List<>とDictionary<>にデータ保持とかの自作のクラスを入れてしまうと
だいたいやりたいことができているんだけど
あえて自分でIEnumerableを扱う利点ってどんなものなの?
0044デフォルトの名無しさん2015/11/29(日) 10:40:55.72ID:ejXKaOWL
引数や戻り値を介した受け渡しに使うんだよ
なんでもいいから複数の値を引数で受けたいとか返したいとかよくあるだろ?
そういうとき具体的なコレクションの型を指定してしまうと不要な厳しい制限を設けることになってしまう
0045デフォルトの名無しさん2015/11/29(日) 10:53:25.06ID:7SVdQgBN
インターフェースを引数にすれば抽象度が上がって重複コードが減るよってだけ
System.Linq.Enumerableの実装見るのが手っ取り早い
0046デフォルトの名無しさん2015/11/29(日) 12:28:51.61ID:j4qD5yiX
あとは遅延リストや無限リストが欲しいときにも使えるね
0047デフォルトの名無しさん2015/11/29(日) 12:32:01.69ID:ejXKaOWL
遅延リストや無限リストが欲しいだけなら別にIEnumerableを使う必要はないけどね
遅延リストや無限リストのようなものもList<T>も配列も同じ「要素のシーケンス」として
共通のインターフェースで扱えることに意味がある
0048デフォルトの名無しさん2015/11/29(日) 12:41:33.12ID:MHU1lz94
C#でTaskにて別スレッドを実行中にXマークでデバックを落とすと
破棄されたオブジェクトにアクセスできませんとエラーが出るんです
出ないようにするにはどうすればいいでしょうか?
0049デフォルトの名無しさん2015/11/29(日) 16:15:06.84ID:vuzu98VN
>>48
cancelとwait
0050デフォルトの名無しさん2015/11/29(日) 16:32:17.55ID:yHrLnXF5
>>49
ありがとうございます。
無事に出来ました!!
0051デフォルトの名無しさん2015/11/29(日) 17:02:57.67ID:sqPcAEkv
たぶんコイツがキチガイ回答者 >>33
ここまでほとんど自演なんだろうな
0052デフォルトの名無しさん2015/11/29(日) 18:29:07.30ID:djg7Qs12
みんな既に理解してるから、
くだらないことでドヤらないで。
0053デフォルトの名無しさん2015/11/29(日) 21:49:18.21ID:y4EB3thr
>>48
>>49
個人的にはこれがすごいと思う
エスパー的な意味で
0054デフォルトの名無しさん2015/11/29(日) 23:42:04.32ID:X6CLD+vb
17分後に完了できたのは凄技だとは思うw
0055デフォルトの名無しさん2015/11/30(月) 17:10:07.41ID:wM8ePfaT
ブラゲーの画面をぴったり画像保存するようなプログラム作りたいんですけど
ブラウザの中のフラッシュやHTML5の画面の左上座標ってどうすればとれますか?
画像認識で強引に認識するしかないでしょうか?
0056デフォルトの名無しさん2015/11/30(月) 17:37:19.12ID:NvF8UIfD
OSによるのでは?
0057デフォルトの名無しさん2015/11/30(月) 17:42:27.07ID:pbgvhCW9
ブラウザコントロール使う話ではなくて?
0058デフォルトの名無しさん2015/11/30(月) 19:54:38.66ID:wM8ePfaT
>>56
Windows 7 です

>>57
よくわからなかったので軽く調べてみましたけど
自作のUIがジェットの中にブラウザ表示させるみたいな感じなんでしょうか

そうではなくて chrome や firefox なんかに表示されてる
フラッシュの画面部分だけぴったりスクリーンキャプチャするようなプログラム作りたいんですけど
無理ですかね…
0059デフォルトの名無しさん2015/11/30(月) 20:07:34.72ID:4TtrR1iM
ブラウザの枠含めて大きめにキャプって、後で画像処理ソフトで切り出せばいいだけじゃないの?
自分で作らなくても、両方とも既にあると思うけど。
0060デフォルトの名無しさん2015/11/30(月) 20:17:18.03ID:NvF8UIfD
>>59に1票。
0061デフォルトの名無しさん2015/11/30(月) 23:07:13.04ID:wM8ePfaT
いままでそうしてたんですけど
1日何枚もとってブログにはったりするので
それを自動できれいにやるようにしたかっただけです

まあ内側のフラッシュのプロセスつかんで
その表示位置取得したりできるかなと思ったんですけど無理なんでしょうか…

あきらめます
回答していただいた方ありがとうございました
0062デフォルトの名無しさん2015/12/01(火) 02:01:07.71ID:XoX/fDF5
ブラウザのサイズを固定(キャプを取るときは全画面にするとか)したらあとはそれに合わせて切り抜く範囲を決めるだけじゃん
0063デフォルトの名無しさん2015/12/01(火) 02:10:57.73ID:fBpqlrz3
艦これの専ブラとかそれやってるから、ソース見るといい
0064デフォルトの名無しさん2015/12/01(火) 20:17:01.67ID:sAwax9ox
>>53
>>48です。
closingイベントでcancel要求を出して
それが受けつるまで待機するという意味での
waitだと思いました。
0065デフォルトの名無しさん2015/12/03(木) 00:33:41.52ID:lhYNgz5S
質問です
変数aとbがあるとします
aの内容をbから参照する事は出来るでしょうか?

a=1;
//bに対してaを参照できる何らかの処理
print(b);//1
a=5;
print(b);//5
という結果を出したいのですが
0066デフォルトの名無しさん2015/12/03(木) 01:12:22.92ID:lfpcI0/L
ここはC#のスレです。
0067デフォルトの名無しさん2015/12/03(木) 02:09:53.61ID:F5OD5ya2
a=bにすりゃいいんじゃないの?
レベル高すぎてやりたいことがわかんない
0068デフォルトの名無しさん2015/12/03(木) 03:29:17.07ID:KH3XuQZQ
参照だろ。
同じオブジェクトIDを持つ、同一オブジェクト

でも、intのようなprimitive型では、
値(参照ではなく内容)がコピーされるため、
参照のようなことは出来ないかも

(C#にも、Javaのようなprimitive型があればの話だが)
0069デフォルトの名無しさん2015/12/03(木) 10:58:04.62ID:lhYNgz5S
>>68
やっぱり無理なんですか
ありがとうございました
これができないと余分なコードを書かないといけない状況に陥ってたんですが
仕方ありません
0070デフォルトの名無しさん2015/12/03(木) 12:10:31.86ID:r4QYskO6
>>69
そんな状況ありえんと思うけどねw
何か思いっきり勘違いしてそう思い込んでるだけだと思う。

あと一応値型でもunsafeでポインタは取れるよ。
0071デフォルトの名無しさん2015/12/03(木) 12:52:27.54ID:zCQ/Nhg2
>>69
何をしたいのかよくわからんけど、やりたいことを関数に切り出して、int 変数を参照渡しにすればいいんじゃね?
0072デフォルトの名無しさん2015/12/03(木) 13:04:34.35ID:IgpEN7lw
そういうことをしたくなっちゃダメよ
0073デフォルトの名無しさん2015/12/03(木) 13:11:21.98ID:zCQ/Nhg2
>>69
もしくは1要素の配列にするとか

var a = new int[1];
a[0] = 1;
var b = a;
print(b[0]); //1
a[0] = 5;
print(b[0]); //5
0074デフォルトの名無しさん2015/12/03(木) 13:18:55.92ID:jUS2N3R7
intなプロパティもつクラス定義すれば良いだけだと思うんだが
0075デフォルトの名無しさん2015/12/03(木) 14:10:48.22ID:lhYNgz5S
お騒がせしました〜
delegateを使ってなんとか実現できました〜
回答ありがとうございます
0076デフォルトの名無しさん2015/12/03(木) 20:17:12.68ID:zCQ/Nhg2
>>74
配列を提案した俺が言うのもなんだが、クラスはなんか負けた気がする…
0077デフォルトの名無しさん2015/12/03(木) 20:43:19.72ID:/6SEhgDG
valueプロパティだけのインターフェースって便利だよね
極限まで行っちゃうとなんらかの値オブジェクトをどこかから取得する事となんらかの値オブジェクトをどこかに転送する事
この2つの連鎖でほぼ全てのシステムが組める
つまりinterface IValue<T> { T Value { get; set; } }はプログラムの全てを抽象化すると言ってよい
0078デフォルトの名無しさん2015/12/03(木) 20:46:05.45ID:IgpEN7lw
何の値か分からんし誰もそんなことやらん
0079デフォルトの名無しさん2015/12/04(金) 05:49:43.54ID:CuO9UgGb
>>75
どう書いたのかコードみせて!
0080デフォルトの名無しさん2015/12/04(金) 08:23:18.98ID:UQYmj2IV
SQL Builderのようなライブラリ使ってる?
EF使えないと、SQL自前で組み立て、Dapperでアクセスでやってるんだけど
SQL作る部分を綺麗に書きたい
0081デフォルトの名無しさん2015/12/04(金) 08:30:25.10ID:N8pVjmap
DapperならDapper.Rainbowっていう簡易クエリビルダが付いてる
0082デフォルトの名無しさん2015/12/04(金) 12:05:23.03ID:ciEp6cCK
>>79
まず俺のやりたい事というのはアドベンチャーゲームのようなものを作っててこういう風にセリフを持ってます
Serihu[] serihu=new Serihu[]{
new Serihu("こんにちは"),
new Serihu("ご機嫌どうですか"),
new Serihu("さようなら"),
};
ここで問題になったのはこのテキストの中に変数を入れたい時どうするかというものでした
例えば「僕は○○をつかった」とか「僕は○○のダメージを受けた」などです
そこで
new Serihu("僕は",○○,"を使った")と○○に参照を入れる事を考えあれこれ試行錯誤しました
で、解決法として○○にdelegateの関数ポインタを入れてやってみたら上手く行きました
Serihuクラスの中で
public delegate string Watasi();
public Watasi watasi;と宣言して
コンストラクタを
public Serihu(string m1,Watasi w,string m2){
moji1=m1;
watasi=w;
moji2=m2;
}
と書きます
それでserihu配列の保持クラスに
public string GetItemumei(){
return itemmei.Tostring();//itemmeiには使いたい変数を何でも使えます
}
と書いて
最初の配列に
new Serihu("僕は",GetItemumei,"を使った")
と入れると変数をそのまま使えるというわけです
0083デフォルトの名無しさん2015/12/04(金) 12:28:30.63ID:4FwXmqLX
こんな回りくどいコード初めて見た
0084デフォルトの名無しさん2015/12/04(金) 12:36:37.37ID:ciEp6cCK
>>83
やっぱり他人から見ればそう見えるのかw
自分でもそうなんじゃないかなぁとw
まぁ何度も書いてくうちに効率的な書き方わかるようになるでしょ
0085デフォルトの名無しさん2015/12/04(金) 12:37:39.48ID:NrPmzULQ
ただのString.Format案件に見えるのだが
0086デフォルトの名無しさん2015/12/04(金) 12:38:19.14ID:uOiBxvHU
何がしたいんだろう。
全然理解できない。
0087デフォルトの名無しさん2015/12/04(金) 12:54:34.09ID:ciEp6cCK
>>86
平たく言うと
まず最初にセリフを配列で持ちたい
そしてそのセリフの中に動的に変数を入れたいということです
0088デフォルトの名無しさん2015/12/04(金) 12:55:52.79ID:6PuXTYFV
やっぱりstring.Fopmatだろ
0089デフォルトの名無しさん2015/12/04(金) 13:12:02.93ID:ciEp6cCK
>>85
>>88
ちょっと俺無知ゆえになにか凄い勘違いをしてたのかもしれません
ちょっとそれ調べて試してみます
上手く行ったら報告します
0090デフォルトの名無しさん2015/12/04(金) 13:42:05.60ID:uOiBxvHU
いやいやメッセージの内容の一部を委譲で決めたいって話はよく分かるし、
だとしたら勘違いしてるのは>>85の方。

そこはいいけど、疑問なのは本当に委譲が必用なのそれってところ。
0091デフォルトの名無しさん2015/12/04(金) 13:44:54.36ID:/QKGOPGQ
>>89
何も勘違いしてないよ
知識が根本的に足りてないだけ
0092デフォルトの名無しさん2015/12/04(金) 13:46:59.55ID:ciEp6cCK
試してみましたが上手く行きませんでした
string.Formatメソッドというのはstringを作るメソッドなのでセリフを表示する
時に使わないといけないと思います
で、俺のプログラムでは最初にserihu配列を作る時にどの変数を参照するかも決定されるので
配列を作った時とセリフを表示されるまで間があります
その間string.Formatで使う変数の参照を結局は持っておかないといけません
0093デフォルトの名無しさん2015/12/04(金) 14:00:21.98ID:ciEp6cCK
>>90
確かにデリゲートを使うのは俺も疑問でした
何しろ変数一個につき余計な関数が一つ増えますし明らかに冗長です
でも他に思い付かなかったんですよ
なんかあるんですかね
0094デフォルトの名無しさん2015/12/04(金) 14:09:54.37ID:FKEfoH7y
>>92
>その間string.Formatで使う変数の参照を結局は持っておかないといけません
持ってればいいだろアホか
>>82でpublic Watasi watasi;なんて余計な参照持ってるくせにobjectの参照持つのは気に喰わないのかよ
0095デフォルトの名無しさん2015/12/04(金) 14:19:31.55ID:ciEp6cCK
>>94
それでC#における参照とはなんなのかなぁと思って>>65の質問になったわけです
条件としてはある変数aをある変数bでも利用できるようにしたいというものなんですけど
0096デフォルトの名無しさん2015/12/04(金) 14:22:04.36ID:FKEfoH7y
ダメージを決定するんだったらダメージ変数を持ってるクラスがあるんだろ?
それの参照渡せばいいだけだろ
0097デフォルトの名無しさん2015/12/04(金) 14:29:10.18ID:ciEp6cCK
>>96
それだとserihuクラス配列に渡す変数はすべてクラスで包まなければならないと
言う事になりませんか?
実はまだどの変数をセリフに渡すかとかは決めてないんです
恐らくゲームを作っていくうちに増えていくと思います
それで変数をクラスで包むという手法には抵抗がありまして
0098デフォルトの名無しさん2015/12/04(金) 14:35:53.45ID:FKEfoH7y
わかった
C#使うのやめろ
0099デフォルトの名無しさん2015/12/04(金) 14:42:25.47ID:ciEp6cCK
なんか怒らせちゃったみたいでこの辺にしておきます
みなさん薄々気付いてるかもしれませんが前スレラストでちょっと荒れ気味になった件の
あの者です
俺が来たらどこもああなります
何か人を苛つかせる能力でもあるのでしょうかw
すいません
この件は上手く行ったのでこれはこれでいいです
ありがとうございました
0100デフォルトの名無しさん2015/12/04(金) 15:13:45.01ID:+NxYXL3O
スタンド能力でも持ってんのか
0101デフォルトの名無しさん2015/12/04(金) 15:31:48.75ID:L/LPhIAT
Regex等でセリフ中の特定文字列を置き換える
自前string.Formatみたいなの作った方がいいんじゃねえの
と思ったり。

例えば、"僕は%damage%のダメージを受けた"という文字列を渡すと
"僕は69のダメージを受けた"みたいにするようなの。
■ このスレッドは過去ログ倉庫に格納されています