ふらっと C#,C♯,C#(初心者用) Part135
レス数が1000を超えています。これ以上書き込みはできません。
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part134
http://mevius.5ch.net/test/read.cgi/tech/1511951038/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >他のスレッドでは書き込めないような低レベルな質問、
public class cdata
{
public double Ampea ;
public double Volt ;
public double Temp ;
public double Activity ;
public double Flow ;
}
cdata cdt;
double[] ddt;
cdt.Temp をddt[2]としても扱いたいのだが、どういうように定義したらいい? >>5
それは知ってるけど、結局定着してないでしょ
インデクサって表記されることが多かったような気がしたけど、記憶違いか 知ってたら>>3みたいなこと言わないと思うが...
まあ定着とか言ってるぐらいだからちゃんと理解してないんだろうな >>2
cdataをstructに変えた上で、
cdata cdt;
double* ddt = &cdt;
ddt[2] = 100;
もしくは、FieldOffset(0)で fixed double[5] をcdtのフィールドに定義する まあ、でも、言語がそういう仕様になってないのにそんな書き方するな
ってのは一言言っておきたいね >>7
しょうもないことで絡む奴。アホか
君がべき論と現実の区別がつかないだけ。
例えば政府の勧告に従えば破綻は「破たん」と書かなければならないが、
現実には新聞とTVの字幕以外のほとんどのメディアでは相変わらず破綻と表記される。
>>5も同じこと これはたぶん政府じゃなくて日経あたりが震源地だろうけど、
「ファストフード」表記のごり押しも結局定着しなかったね >>10
>>5のリンク先読んでないのか?
それとも理解できないのか?
MSの社内ルールの話だから世間で定着してるかどうかとは関係なくMSの公式ドキュメントでは伸ばすって話な >>13
アホだねえ
だからそのMSのルールは政府の勧告に従ったもの。
Vistaが出る時にそういう触れ込みだったでしょ だいたい、インデクサなんて一般的じゃない用語がどう発音されるかなんて
その業界次第だ しかし、人を無知だと思い込まないと死ぬ病の奴、
いちいち他人に絡まないと死ぬ病の奴って何なの
こっちが>>5みたいな動きがあったことを意地でも知らなかったと思いたいらしいけど、
むしろ知ってるから>>3みたいな疑問が出てくるんであって、
知らなきゃよくあるカタカナ用語の表記の揺れかなで終わり。 >>14-16
政府からの圧力があったのか世間の動向を見たのかは知らんがMSが社内ルールを改訂したと言う事実は変わらない
その事実を知ってて>>3みたいな疑問を持つとかどんだけ理解力がないんだよ w 一時活字関係の業界で、文字を沢山詰め込むためにーで終わるカタカナ語の最後を切るのが流行ったのさ
その名残で伸ばさない人の勢力が弱まったのかね? 俺はお前らのためにランダムで「ー」を
付けたり付けなかったりするよ
たまに「-」だったり「―」だったり
「一」だったりもしてみるよ 活字業界?
単にJISでそう決まってただけやで... まあ>>18の言う通りキチガイに触った奴が負けって言われりゃ返す言葉はないけど... w DirectXや他のフレームワークを使わずに
VSYNCを待つ方法があったら教えてください >>26
無いと思うけど
IDXGIOutput::WaitForVBlankが嫌な理由は? enum enDispNum { min = 2, max = 5 };
int[] dispno = new int[] {(int)enDispNum.min , (int)enDispNum.max }; //エラー
int[] dispno = new int[] {2,5}; //OK
int aa = (int)enDispNum.max; //OK
enumの挙動がわからん。なんで? enum enDispNum {dumy, min = 2, max = 5 };
ダミーいれたら動いた。w 笑かす。 enum enDispNum:int {dumy, min = 2, max = 5 };
宣言で int 明示してもcastしないとエラーする。 Dumyがないとエラーするし
キャストしないと駄目だし、なんか使いにくいな。 >30
エラー 1 型 'elRemoteControl.enDispNum' を 'int' に暗黙的に変換できません。
明示的な変換が存在します。(cast が不足していないかどうかを確認してください) >30
同じように2,5で数値していをしてごらん。きっと笑えると思う。
dumyがなくても min=0なら動作するんだろう。おそらく。
例文みたらどれもこれも、数値していがないか、0は一つある。この場合は
dumy=0が暗黙定義されると見た。 >>32
これはどうでしょう?
int[] dispno = new int[] {(int)(enDispNum.min) , (int)(enDispNum.max) }; VS2010でもVS2013でもVS2017でも再現しない
https://ideone.com/glor7T
ideoneでも再現しない そうか。再現する物もあれば、しないものもある。()でくくるといけるものもある。
しかしenumを使う時は
1. dummyを入れる。
2.宣言でキャストしても 個別に必ずキャストすること。
というのを守った方がいいかも。 なんでそうなるw
確実の君が何か変な勘違いしてるだけだってww 「dummy を入れたらコンパイルエラーが止まる。正常にコンパイルされて
動作も正常に動作する。」
この理由を説明してごらんよ。
dummyを入れる以外にはなにも変更していない。 やっぱ想像したとおりだ。min=0にしたら
enum enDispNum:int {min = 0, max = 5 };
これなら
int[] dispno = new int[] {(int)enDispNum.min , (int)enDispNum.max }; //OK
これでもOKだ。コンパイルエラーしない。 まあ特殊なコンパイラ使っててそれがバグってるんだろう
とりあえず.NET Framework向けのMS製csc.exeは
> エラー 1 型 'elRemoteControl.enDispNum' を 'int' に暗黙的に変換できません。
このエラーが出た場合「エラー 1」じゃなくて「error CS0266」って出すし VS2013(Pro)だよ。Update5 .NETは4.7
因みにエラー1は一覧の番号だろ。一覧をコピペしただけだから。最初のエラーって意味だ。
2番目のエラーはない。 どういう意味、VSで別のコンパイラーを動かすってこと? そんな高度なこと知りません。
標準のWindowsFormアプリケーションだよ。 List<List<Label>> ccValueSetLabel = new List<List<Label>>();
private void DataRefresh(List<List<double>> datasc)
{
int colcount = 0;
foreach (var dev in ccValueSetLabel)
{
var datas = datasc[colcount++];
List<string> strdt = new List<string> ();
int count=0;
par.GetInstance().ElDataList.ForEach(x => strdt.Add(string_format(x.format, datas[count++])));
count = 0; dev.ForEach(x => x.Text = strdt[count++]);
}
}
こういう場合に折角foreachを使っているのに、countを使うのはなんだかなーと思う。foreachを2重かするとか
addみたいにドンドンgetできる方法ってないの? もうEnumはいいよ。原因はわかったし、そんなものだろ。 エラー 1 型 'elRemoteControl.enDispNum' を 'int' に暗黙的に変換できません。
明示的な変換が存在します。(cast が不足していないかどうかを確認してください)
これだよ。だから41が言ってたerror番号だよ。エラー一覧をコピペしたけど
出力一覧の方にはエラー番号がでてた。 こちらでは再現しないので、そのエラーが本当に出ると信じられない
本当なら今後のために原因をきちんと把握しておきたいので、とりあえず件のコードとエラーのスクリーンショットを提示してほしい 一寸聞きたいんだがキャストをかませないとエラーする件もそちらでは、出てないの?
キャストなしでも動く? とすると俺のpCがおかしいな。
でもキャストがいるとかDumyがいるとかだとやっぱり笑ってこらえる不具合含みでしょ。
俺のPCはDELLのディスクトップだからそこそこ早いやつだよ。(ゲーム用じゃないけど) 意地悪だなあw
こんなの確認するまでもないでしょ
まず間違いなく、この質問者さんは、問題に遭遇したのとは
別のコードをここに書いてる。
要するに、彼の問題の原因は彼が思い込んでいるのとは別のところにある。
こんなところに書き込んでる時間があるなら
その間に彼の仮設を検証する最小限のコードを書いて確認すりゃいいのにと思うんだけど、
なぜかそれをしないんだよねこういうあわてんぼうさんは。 列挙型を数値型に代入するには明示的なキャストが必要なのは言語仕様
int[]の初期化子で全部intへ明示的にキャストしてるのにエラーが出るのはおかしい
まあそんなgdgdはいいからスクリーンショットはよ 別な何かを int にキャストしようとしてるんでないの? enum enDispNum { min = 2, max = 5 };
int[] dispno = new int[] {(int)enDispNum.min , (int)enDispNum.max }; //エラー
int[] dispno = new int[] {(int)(enDispNum.min) , (int)(enDispNum.max) }; //OK
int[] dispno = new int[] {(enDispNum.min) , (enDispNum.max) }; //エラー
int[] dispno = new int[] {enDispNum.min , enDispNum.max }; //エラー
int[] dispno = new int[] {2,5}; //OK
int aa = (int)enDispNum.max; //OK
enum enDispNum { min = 0, max = 5 };
int[] dispno = new int[] {(int)enDispNum.min , (int)enDispNum.max }; //OK
int[] dispno = new int[] {(int)(enDispNum.min) , (int)(enDispNum.max) }; //OK
int[] dispno = new int[] {(enDispNum.min) , (enDispNum.max) }; //エラー
int[] dispno = new int[] {enDispNum.min , enDispNum.max }; //エラー
enum enDispNum { dummy, min = 2, max = 5 }; これもmin=0にするのと同じ
(int)キャストなしは全部エラー 上の状況は明示的に enum xxx:int{} やっても同じ。
enumで午前中潰してウンザリ。 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/enum
この列挙型では、要素の並びは 1 からではなく、 0から開始します。 ただし、列挙型には
値が 0 となる定数を含めておくことをお勧めします。 詳細については、列挙型を参照してください。 idやワッチョイ隠す人は相手にしない方がいい
>>56
上のEnumの場合enDispNumのメンバーが数値だと推論できないんだろうな
理由は多分自分で貼った>>58
enDispNum.minなどのくくりにすると数値が定義済みだからキャストできる
キャストする対象をきちんとかっこで括らないとだめ >>45
ソース汚すぎて何がしたいのか意味がわからん
道具に文句言う前にまずはリーダブルコードでも読んで自分のセンスを何とかしたらどうだ >>62
全然理由になってないw
っていうか、質問者が言ってる現象が本当に再現できるか、自分で試してみました?w
あと、キャスト演算子の優先順位はドット演算子より高いはずなので、
キャスト演算子の後を()で括るかどうかで式の値は変わらないはず。
要するに、>>56はデタラメw あれ、逆書いてるw
× キャスト演算子の優先順位はドット演算子より高いはずなので、
○ ドット演算子の優先順位はキャスト演算子より高いはずなので、 その前にvs2013で.net 4.7ってサポートしてるのか? >>67
Developer pack入れたらおーけー 今のところ質問者以外の環境では誰も再現してないのは
環境が違うからか? こんな変な挙動になる環境って言うのも考えにくいので、質問者が壮大に勘違いしてるか単なるネタの疑念が拭いきれない
ソースとエラーになってる画面のスクショがででくるまでは傍観するわ 色々想像できる名前が入ってるからスクリーンショットはだめだな。それにスクリーンショットみても
何も変わらんよ。エラーが一行でてるだけだから。
そもそもEnumて数値を設定して使わないから気が付かないだけだろ。それにもう
今月一杯で2013はやめて2017に変更するし。 List<string> strdt = new List<string> ();
〜
count = 0; dev.ForEach(x => x.Text = strdt[count++]);
この部分は
dev.Zip(strdt,(x,y) => x.Text = y);
これで動くと思ったが動作しないがなぜ? Zipに与えられたラムダ式は遅延実行されるから。
ZipしてからForEachしようぜ devとstrdtをマージしたものにForEach 正規表現を使って文字列から、○○月を除くコードを教えてください。
○には、1から12までが入ります。 using System.Text.RegularExpressions;
var text = "dejdo8月dksk12月diwk";
text = Regex.Replace(text, @"\d+月", ""); using System.Text.RegularExpressions;
var monthPattern = new Regex(@"(\d+)月([^火水木金土日])");
var monthRemover = new MatchEvaluator(mc => Enumerable.Range(1, 12).Contains(int.Parse(mc.Groups[1].Value)) ? mc.Groups[2].Value : mc.Value);
var inputText = "kok3月rq12月12461123456789月火水木金土";
var monthRemovedText = monthRegex.Replace(inputText, monthRemover); 普通に正規表現使えばいいのに…
[1-9]とか|とか1[0-2]とか >>85
細かいけど、リーディングゼロとか、ゼロ以外の数が前にくっついてた場合
どう処理すべきかはっきりした方がいいかも >>78-87
アドバイスありがとうございます。
やってみます。 var list_hoge = new List<Data_hoge>() {
new Data_hoge(){Key="1",Value=22 ,Flag=true},
new Data_hoge(){Key="2",Value=23 ,Flag=true},
new Data_hoge(){Key="3",Value=24 ,Flag=false},
new Data_hoge(){Key="4",Value=23 ,Flag=true},
};
この様なデータがあったときKeyに相当する引数(int=1〜4)を入れると
Flagがtrueのものの中でvalueが最大値を取るならtrueを返すメソッドを作りたいのですが
どうすればいいでしょうか?
LINQだと嬉しいです public bool saidaichidesu(int x)
{
var list_hoge = new List<Data_hoge>() {
new Data_hoge(){Key="1",Value=22 ,Flag=true},
new Data_hoge(){Key="2",Value=23 ,Flag=true},
new Data_hoge(){Key="3",Value=24 ,Flag=false},
new Data_hoge(){Key="4",Value=23 ,Flag=true},
};
var flaggedList_hoge = list_hoge.Where(data => data.Flag);
if (flaggedList_hoge.Count() > 0)
{
var maxValue = flaggedList_hoge.Max(data => data.Value);
この先どう書けばいいかわからない
}
return false;
} 最大値を持つ要素の中でKeyがxと一致するものを返したいということ? 最大値をもっているもののkey(複数あり)がxと一致するかどうかを確認して、一致するならtrueを返したいです
keyがstringになっていますがこれをintにしても構いません 寧ろ多くの人は解らんと思うが、、、先ずは質問の意味が正確に解るかどうかだな。
それが最大の問題だ。
「質問はすでにその中に解を含んでいる」、質問者が質問を正確に組み立てられないのは質問者の
責任として放置される性質のものではなくて、回答者の技量によって正確な質問に
組み立て直す。これは頭のいい回答者の責任になる。
でその役割りが君というわけだ。 saidaichidesu(1) −−> False
saidaichidesu(2) −−> true
saidaichidesu(3) −−> false
saidaichidesu(4) −−> true
saidaichidesu(その他) −−> false
上の例ではこういうリターンを期待してる? もしこうであれば簡単だよ。 class Data_hoge{
public string Key;
public int Value;
public bool Flag;
}
public bool saidaichidesu(int x)
{
List<Data_hoge> list_hoge = new List<Data_hoge>() {
new Data_hoge(){Key="1",Value=22 ,Flag=true},
new Data_hoge(){Key="2",Value=23 ,Flag=true},
new Data_hoge(){Key="3",Value=24 ,Flag=false},
new Data_hoge(){Key="4",Value=23 ,Flag=true}
};
var maxv = list_hoge.Where(dt => dt.Flag).ToList().Max(dt => dt.Value );
var res = list_hoge.Where(dt => dt.Value == maxv).ToList();
foreach (var dt in res)
{
if (x == int.Parse(dt.Key))
return true;
}
return false;
} 苦戦した。w 一行では難しいな。もっといい方法があると思う。 たびたびお世話になります。
ラムダ式で作ったスレッドの優先度を変えるにはどのようにしたらよいのでしょうか。
Task sendTask = Task.Factory.StartNew(() => や
ThreadStart action = () =>
で作成したスレッドです。 ThreadはいいとしてThreadPoolに優先度って設定出来たかしら? すみません、101ですが
Threadだけでも良いです。
Taskは優先度の概念?がなさそうですね。 いつから初心者の質問に初心者が答えるスレになったんだ
厳しいことを言うようだけどコードレベルも一般に全然届いてない
それは参考にならない >>104
手元に確認するための環境無いから試せないんだけど、作成したThreadStartデリゲートをThreadクラスに食わせてPriority プロパティを設定してスタートで行けるはず。
Thread.Priority プロパティは以下のリンクで
https://msdn.microsoft.com/ja-jp/library/system.threading.thread.priority(v=vs.110).aspx >>90
なんかよー分からんけど、
public bool IsMax(string key)
{
var hogeList = new List<Data_hoge>()
{
new Data_hoge(){Key="1",Value=22 ,Flag=true},
new Data_hoge(){Key="2",Value=23 ,Flag=true},
new Data_hoge(){Key="3",Value=24 ,Flag=false},
new Data_hoge(){Key="4",Value=23 ,Flag=true},
};
var max = hogeList.Max(x => x.Flag ? Value :Int32.MinValue);
return hogeList.Any(x => x.Fkag && x.Key == key && x.Value == max);
}
試してないけどこんな感じでいける気が
しかし、>>89の日本語は酷すぎる
何を言ってるのかさっぱり分からない >>106
ありがとうございます。
確認してみます。 hogeList.Where(_hoge => _hoge.Flag).GroupBy(_hoge => _hoge.Value)
.OrderByDescending(_group => _group.Key).First()
.Any(_hoge => _hoge.Key == key) // 指定したキーのデータが最大値を持つか
public bool hasMax(list<Data_hoge> list, int key)
{
// フラグが立っているデータの抽出
var flaggedList = list.Where(data => data.Flag == true);
// リストの最大値
var maxValue = flaggedList.Max(data => data.Value);
// 最大値を持つデータの抽出
var maxDataList = flaggedList.Where(data => data.Value == maxValue);
// 指定されたキーのデータが存在するか
var hasMaxValue = maxDataList.Any(data => data.Key == key);
return hasMaxValue;
}
これは悪いソースですか?それとも普通ですか? 素晴らしい。よくわかる。良いソースリストの鏡。★★★★。
インデントがついていたらもひとつおまけした。 ★★★★
var max = hogeList.Max(x => x.Flag ? Value :Int32.MinValue);
return hogeList.Any(x => x.Fkag && x.Key == key && x.Value == max);
評:素晴らしい。1行目のMinValueの使い方がおもしろい。工夫があってなお且つ分かりやすくシンプル。 ★★★★
return list_hoge.Where(_hoge => _hoge.Flag).GroupBy(_hoge => _hoge.Value)
.OrderByDescending(_group => _group.Key).First()
.Any(_hoge => _hoge.Key == xKey.ToString ());
評:Keyでオーダーしたら絶対に動かないだろ。w と思ったが念のため試してみたら動いた。
_group.KeyのKeyは実はValueをKeyにしてグループ分けしているのでKeyはHohgeのKeyではなくて
HogeのValueと同じになる。初心者には難解過ぎるので★一つ減らす。 レーティングスレになってるしw
>>111
ネタの人っぽいけど、それは普通にいろいろ悪いw
一番の害悪はコメント。 //0〜9までの配列
var array = Enumerable.Range(0, 10).ToArray();
これと同じようにラベルのリストをつくりたいのだが、うまく行かない。どうしたらいい?
こんな感じだとおもうんだが。
List<Label> lblList = Enumerable .Range (0,10).Select (d => new Label (){ Text = d.ToString ()}); >>116
お前は一年間Linqを使わないで普通にコード書け
Linq使うと上達から遠ざかる 馬鹿な初心者の例
エラー内容を読まない
質問するときも上手くいかないなどあいまいな言葉しか使わない みなさんありがとうございます
全部参考にさせて頂きます
anyの使い方を知りませんでした
初心者的には>>111が一番わかりやすかったです
私の書いたコードを流用してくれているからだと思いますが
他の例の様にエレガントなコードを書けるように精進します private void test3()
{
List<Label> dev=Enumerable.Range(0, 10).Select(d=>new Label() { Name="Label" + d.ToString() }).ToList();
List<string> strdt=Enumerable.Range(0, 10).Select(d=>"--" + d.ToString() + "--" ).ToList();
dev.Zip(strdt, (x, y)=> x.Text=y);
Debug.Print("--------------------------------");
foreach (var a in dev)
{
Debug.Print(a.Name + ":" + a.Text);
}
}
これが動かない。同じ単純なアレイどおしなら問題なく動くと思うが、この場合は
色々やってみたがわからない。ZIPの後にForeachをかけるという
意見があったが、どうやって? マージした後にForeachかけるにはベクトルのコレクションを
返す必要がある。その方法が分からない。 以下のコードを実行すると
array[index]へのアクセスで
out of range exceptionがでます
何故index==numItemsという状態が起こるのでしょうか?
for (var i = 0; i < numItems; i++)
{
task[i] = new Task(() =>
{
var index = i;
foreach ()
{
array[index]にアクセス
}
});
task[i].Start();
while((int)task[i].Status < (int)TaskStatus.Running)
{
Console.WriteLine(i+"\t"+task[i].Status);
}
Console.WriteLine(i + "\t" + task[i].Status);
} >>121
何がしたいの?
動かないって言われてもエスパーじゃないんで... っていうか、
>dev.Zip(strdt, (x, y)=> x.Text=y);
ここのラムダ式の戻り値はyになるんだけど、これは意図してるのか勘違いなのか... >動かないって言われてもエスパーじゃないんで...
int count = 0;
dev.ForEach(x => x.Text = strdt[count++]);
やりたいのはこれと同じこと。これは動作する。 >>dev.Zip(strdt, (x, y)=> x.Text=y);
>ここのラムダ式の戻り値はyになるんだけど、これは意図してるのか勘違いなのか...
ここの意図はdevがLabelのコレクションだからxはそのラベルの一個を取り出す。
yはsrtdtがstringコレクションだからyはその一つの要素
x.Text=y
はラベルのテキストにストリングyを代入すること。
ラムダ式の戻り値はyになるんか? でもラベルにyをセットするのが目的だから戻り値は関係ないはず。
var retval = dev.Zip(strdt, (x, y) => x.Text = y);
Debug.Print("--------------------------------" + retval);
foreach (var a in dev)
{
Debug.Print(a.Name + ":" + a.Text);
}
戻り値をretvalに入れてプリントしたらこんなになってる。
--------------------------------System.Linq.Enumerable+<ZipIterator>d__61`3[System.Windows.Forms.Label,System.String,System.String]
Label0:
Label1:
Label2:
Label3:
Label4:
Label5:
Label6:
Label7:
Label8:
Label9: --------------------------------
Label0:--0--
Label1:--1--
Label2:--2--
Label3:--3--
Label4:--4--
Label5:--5--
Label6:--6--
Label7:--7--
Label8:--8--
Label9:--9--
これが期待値 >>125
だったら最初からこれでいいのでは?知らんけど
List<Label> dev=Enumerable.Range(0, 10).Select(d=>new Label() {Name="Label" + d,Text = String.Format("--{0}--", d)}).ToList();
質問する前にもうちょっと自分で頭使って考えた方がいい気がするw なぜか専用ブラウザから書き込めなかったのでChromeから書き込んだけど、
これだけでワッチョイって変わるんだね知らんかった ここ数日の流れでわかったと思うけど
自前のアプリが完成するまでずっとこの人は何かコード書くたびに質問してくると思うけど
それでいいのかな? 質問じゃなく承認欲求のための報告
連続してどうでもいいことまで書き込んだり質問する
今までも割といたタイプ >>128
今は補完文字列が使えるんだったね...
最近コード書いてないからもう忘れてた >>115
ネタじゃないです(>_<)
ダメな点を教えてください(>_<) >>131
ウザいよね
目的の処理自体は作成できるくせに
聞いてくるなんてキチガイだよね >>134
横からだけど
いくつか気になるところがあるけど
とりあえず最後の二つの操作をよ〜く見て動作を考えてみたらいいのでは?
var maxDataList = flaggedList.Where(data => data.Value == maxValue);
var hasMaxValue = maxDataList.Any(data => data.Key == key); >>121
自分が言ったのはこういうことです(>_<)
匿名クラスを使ってます
var marged = dev.Zip(strdt, (x, y) => {Label=x, Text=y});
marged.ForEach(item => item.Label.Text = item.Text); >>136
理解が目的なら挙動をテストするコード書けばいい
どこかの記事をコピーして実行
そして徐々に変えていって仕組みを理解したらいい >>137
意図した動作にならないという意味でしょうか、それともひとまとめにできるという意味でしょうか(>_<)
後者の場合は、一行づつで簡単な意味しか持たないほうが良いと思いすべて分離したのですがまとめまくったほうが良いのでしょうか(>_<) >>134
ネタにしか思えんけどw
コメントも余分な一時変数も可読性に寄与しないどころか悪くしかしてないと思う。
好みの問題じゃないと思うけどな
こっちの方が読みやすいでしょ
public bool hasMax(list<Data_hoge> list, int key)
{
var flaggedList = list.Where(data => data.Flag);
var maxValue = flaggedList.Max(data => data.Value);
return flaggedList.Any(x => x.Key == key && x.Value == maxValue);
} >>141
ありがとうございます(>_<)
今後の基準にします(>_<) >>136
その割にZIPの本来の使い方してないじゃんw
意味が分からないよ もともと条件がふわっとしてるからまあ適当でいいよ
条件をつめて(keyがユニークなのかなど…)行くと普通こういうコードは書かないと思う >>141
元ネタからそうだけど、メソッドはパスカル記法(先頭大文字)で。 >>144
一行づつで一つの意味しか持たないレベルに分解するのはやりすぎということでしょうか(>_<)
ありがとうございました。 >>145
確かにそうするべきでした(>_<)
ありがとうございます。 >>136
ああついでに言っとくと、あなたはたぶん
(1) 列挙を行うオブジェクトを返すこと
(2) 列挙を行うこと
この二つを混同してるんだろうね。
LINQは前者であって後者じゃないのよ。 匿名関数なんてパインソのリスト内包表記とかでイメージつかまないとムズいよ?
それになぜそんなにリンクにこだわるのか
いまの時代にカッコつけてスーツに肩パッドいれてる人みたい
要するにカッコつけかたミスってるよ >>146
深入りしなくてもいいけど
そのコードともとの2行のコードは結果は同じだけど
ロジックによる動きを追っていくと違いが判ると思う >>138
いい線行きました。!!!
var marged = dev.Zip(strdt, (x, y) => new {lbl = x, txt = y} );
foreach (var aa in marged ){
aa.lbl.Text = aa.txt;
}
これで動作してますが、Foreachはmargedにメソッドがでてこない。 >>149
LINQは手続き型(?)よりも簡単で良いと思っていたのですが勘違いだったのですね(>_<)
参考にします(>_<)
>>150
元の2行のコードというものが分からないです(>_<)
すみません。
>>151
列挙型にForEachがないみたいですね(>_<)
ごめんなさい(>_<) >この二つを混同してるんだろうね。
>LINQは前者であって後者じゃないのよ。
折角のアドバイスにきつい言い方と思うかもしれないが、抽象的な説明よりも具体的に説明をすると
初心者には分かりやすい。あなたにも初心者の部下が沢山いるとおもうがそういうことを心掛けた方がいいと思う。
一番具体的なのは正しいコードで示すこと。
二番目はキーとなる概念が入った間違ったコード。(実際には正しいコードを空で書くのは、ベテランでも難しいからね)
3,4,がなくて5が説教。w >それになぜそんなにリンクにこだわるのか
リンクに拘ってるのはもちろん初心者に最も理解しやすいからで、Zipにとくに拘ったのは
二つのシーケンスを同時に回せないと、一方でForeachを使いながら、同時にカウンターを
回すという不細工なことになるから。 偉そうだな
わからないのが偉いのかな?
わからないのは自分の責任だと思うが
小学生の頃も学校の先生に文句言ってたんだろ 回答者に対して具体的にコードを書かないといけないと言い出す初心者
モンスター質問者
自分で手を動かして試して考えられないならコードを書く意味なんてない
永遠に誰かに書いてもらえよ
ここでいくらコードを聞いても無駄だな ごちゃごちゃ言わずにスルースキルを鍛えろよ
最近はLINQコード書いたレスは全部NGブチ込んでる
こいつの質問超つまんないし
だいたい自分で作成できる処理について他人に質問するなんて気持ち悪いよ >>122 ですが自己解決しました。
Parallel.Forにしたら問題なく動きました。 >>167
.net4止まりの環境か?
なぜasync/await使わないんだ? >>168
asyncとParallelは役割が違う
Parallelはデータ並列の同期処理 >>170
TaskやめてParallel.Forにするなら意図通りに動作するし別におかしな処理ではないだろ
awaitしたら逐次処理になっちゃうぞ 難を付けるとしたら、arrayの各要素に対する処理を並列化したいんだったらParallel.ForEachの方がいいな SVGを使いたくてNuGetからSVG2.3というのをインストールしたんですが
これってマニュアルみたいなものはないんですか?
とりあえずググってみて簡単な長方形とテキストは表示できたんですが
どうやって覚えたらいいんでしょうか SVGが使いたいなら普通にSVGを勉強したらいいんじゃないの?
ここでHTMLの書き方について質問されてるのと変わりない 一般論として使い方のわからないライブラリがあるならNuGetに書いてあるオフィシャルサイトに
飛んでそこから調べる
最終更新が3年前とかだったら捨てる Visual Studio Community 2017 を使って
特定のフォルダ「c:\hoge」以下のサブフォルダを列挙する
UWPアプリを作ろうとしています。
IEnumerable<string> subFolders = Directory.EnumerateDirectories(@"c:\hoge", "*", SearchOption.AllDirectories);
foreach (string subFolder in subFolders) {
MessageDialog md = new MessageDialog("");
md.Content = subFolder;
md.ShowAsync();
}
とすると
System.UnauthorizedAccessException:
'Access to the path 'c:\hoge' is denied.'
とのエラーとなります。
しかし、対象フォルダをデバッグビルドされるフォルダ
「C:\foo\bin\x64\Debug\AppX」にすると思った挙動となります。
デバッグビルドされる以外のフォルダにアクセスできるようにするには
どうすればいいでしょうか?
ちなみに Visual Studio を管理者権限で実行しても変わりませんでした。
以上、お知恵をお貸しください。よろしくお願いします。 >>176
UWPはそういうもん
セキュリティ上ユーザーに許可されない場所は基本的にアクセスできない 忘れたけどユーザーにフォルダピッカーで選ばせないとアクセスできない
アクセスしたらその情報を保存する方法があって次回からそこは普通にアクセスできるようになる
めんどくさいからUWPやPCLは触りたくない 初心者はUWPを避けたほうがいいと思う
UWjP自体使われていないからこんな質問が出てくる
これ以外にもめんどくさい仕様がてんこ盛り
ある程度勉強が終わった後改めてUWPやったほうがいいよ 初心者が上手にアプリの状態を保存したりしつつ画面遷移できるとは思えない >>177,178,180,181
レスありがとうございます!
素直にフォームアプリで挑戦します。 >>172
後出しですいませんが
並列化したかった箇所は外部の特殊な装置へのアクセスで並列化した数だけドライバのインスタンス持ってます。
arrayとしましたが、最終的にはconcurrentDictonaryを使い装置からのデータをまとめています。
async await使ったことないのですが、
また調べてみます。 ところでそもそもの質問ですが、
>>122のコードでtask内からループカウンタを参照した時にnumItems以上になるのでしょうか? >>174
スレチだったんですね
ありがとうございました UWPの件をひっくり返してみてみると
その他のプラットフォームのアプリは好きなところを読出し放題なんだよ >>183
whileのタスクの終了待ち?が機能してない
だからタスクより先にi++が行われる可能性があるのでエラーの現象がでてる
IsCompleteってプロパティがあるからそれを使うといいよ そもそも>>122は別スレッドで実行しているだけで非同期実行になってないね
実行するとこんな感じ
https://i.imgur.com/mxuCicn.jpg 既存のXMLを編集したい
編集したタグ以外の要素はテキスト表現を変えたくない
どうしたらいいかな?
コンペア取った時に編集した箇所以外も差分に含まれてしまい困ってる
1回DOMを経由してる以上仕方がないのかもしれないけどなんとかしたい >>188
検証ありがとうございます。
各taskがパラレルに実行されてるから期待どおりです。
IsCompleteにすると当然Serialに実行されるのでやりたい事じゃないです
whileは終了まちではなくdebug用途で足しました。 それは簡単だよ。編集した箇所いがいは差分にでないコンペアをすればいいだけだ。 >>191
そうなのか
それならインデックスの宣言をタスクの外に持ってくだけで希望通りの動作になったのに
パラレルforだと、forのあと重たい処理やってからwaitみたいなことできないから気を付けてな >>193
あ、確かにtaskの外に置くべきでした。
元はindex = iもなしで直接iを参照してたのでってよく考えると危ないことしてました いきなり質問失礼します
スクレイピングで取得した要素を
while (true)
{
var B = driver.FindElementByid(''id1").Text;
var S = driver.FindElementByid(''id2").Text;
Console.WritLine("要素Bは{0} 要素Sは{1}", B, S);
}
でコンソールに表示しています
BとSには常時変化する小数点のある数字が入ります。
この後、
if (B > S)
を実行したいのですが、BもSも文字列として認識されている為出来ません。
数字として認識させる為にはどうすればいいですか? >>197
変換出来ませんと出て行き詰まってます
>>198
単にどちらが大きいか見て
コンソールに大きい方を表示させたいだけです MessageBox.Show("変換できません"); >>196
というか、こんなコードでスクレイピングとかdos攻撃を疑うレベル。
まじて迷惑だからやめて if ((true == double.TryParse(B, out double valueB)) &&
(true == double.TryParse(S, out double valueS)))
{
// valueB と valueSを比較
} >>203
ワイはお前の知性を疑っとるで
余計な事言うとすぐばれんねんバカって >>200
それをする事でどうなりますか?
>>203
始めて1週間なので、
そう思われる理由が分からないので教えてください
>>204
ありがとうございます
試してみます! >>206
どういうコードを書いたせいで動かないのかが分かるんだろ
そうでなければお前は何を解決したくて質問したの? 無駄なメモリの確保を防ぎつつ、フィールドのスコープを限定する方法を教えてください
現在、このようなメソッドを用意して秒間300回程度と頻繁に呼び出しています
void A(){
byte[] data = new byte[1024];
//dataに書き込む処理省略
}
しかし、私の行う用途にでは、呼び出しのたびにdataの配列分確保するのは無駄で、前回の使い回しで十分なんです
dataをメソッドの外で宣言しメモリの確保もすればいいのかもしれませんが、スコープが広がってしまいます(すでに書いてしまったコードがdataという名前のフィールドだらけで収拾がつかなくなっています)
何か手軽に無駄なメモリ確保を防ぐ方法は無いのでしょうか?
よろしくお願いします >>208
VBにはインスタンスと同じ寿命でスコープだけメソッドの変数があるけどC#にはありまへん。
意味があると思えんけど、ラムダ式のキャプチャを利用して、byte[]ではなくFunc(byte[]>のフィールドを持つとか。
まあ、そういう馬鹿馬鹿しいこだわりを捨てて、素直にbyte[]のフィールドを持つのが一番でしょう。 >>196
常時更新ってC#のコードでDOM操作するってこと? >>208
どうせ初心者のうちに書いたコードなんて後で全部捨てて書き直すことになるんだから余計なこと気にしなくてよろしい この間のwin10のアップデートでwebbrowserの挙動に何か変化有りませんでしたか? >>207
変換出来ませんと表示させるコードを書けば、解決策が見つかると言う意味で解釈したらいいですか?
変換出来ませんと表示させるコードを書く理由が分からないので教えてもらえると助かります。 >>211
これがDOM操作と言うのか私には分かりませんが、
ウェブサイトに表示されている、リアルタイムで変化している数字を読み取って比較して表示するという操作がしたいって事です >>208
そのままでもいいなでは?
一応解決法
外で適当な名前でフィールドを確保
static byte[] buffer= new byte[1024];
中でそれを参照
byte[] data=buffer; >>216
そもそも何を使ってスクレイピングしてるかすら書いてないから
みな困惑している
seleniumなんだろうけど >>218
申し訳ない
seleniumでphantomjs driverです 仮にの話だけど
自分でリフレッシュ(再送信要求)してないのに値が変わってるなら
サイトがjavascriptで値を書き換えてるんだろうからDoS攻撃にはなってない >>217
外じゃないと駄目だっけ?
中でよくね? >>205
どう客観的に判断してもおまえの方が頭おかしいだろ >>216
サイバーテロだから基本をマスターするまで止めろ >>204
ちょっとそれるが
> if ((true == double.TryParse(B, out double valueB))
って書く人がたまにいるけどなんで不要な true == をいちいち書くんだろう? >>204
これでいけました
ありがとうございます >>226
英語に不慣れだからかな…
if(cat.IsAnimal==true)
if(true==cat.IsAnimal)
俺は気持ち悪いのでそういう使い方はしない
がnull許容型だと強制されるので非常に不快 日本語で見るとbe動詞が不格好だな
は動物プロパティ
if(猫.は動物)
if(田中誠.は動物) >>228
図書館事件よく読んどけ
逮捕されたくなかったらな。 >>226
本当は分かってるんでしょ?w
人が悪いよ
たぶんデリゲートやラムダ式に拒否反応を示す人の思考回路と同じ。
値って考え方が呑み込めてないんだと思う。 >>233
This is a pen.
これはペンである。
うん、間違ってないな w >>226
設計者が悪い
〜が真の場合〜する
これをコードにするとブーリアンとの比較になる
〜の場合
ならブーリアンとの比較にならない >>226
trueとfalseを=で書く、falseだけ=で書く、falseだけ!で書く
どれでもいいけど!を使いたくないって話はよく聞くな
falseを=で書くならtrueも同じ様に書いた方が見やすいかもね VS2013からVS2017で、
C#のWinForm的には何か大きく変わりましたか?
WPFやUWPやXamarinは使わないです if(a==true) if(a==false) ははっきり言ってダメなやり方
たとえば b!=’1’の結果としてaがあった場合
aには充分な論理的結果が入っているのに
それを比較してる
つまり
if(b != '1')
bが'1'でないならを
if((b !=' 1') == true)
bが’1'でないが真なら としてる
無駄に条件比較の次元が増えてる ってことよ。
言語仕様で保証されてるから
ってもうええやろ >>240
はるか昔に開発終わってるから何も変わってないよ
今のVSでアグレッシブに開発進んでるのってプラットフォームでいえばWeb関係でCoreとかAzure、
VS自体の機能でいえばチームコラボレーション系がメイン
もはや昔ながらのクライアントアプリ開発者には何の恩恵もない代物 あと、日々のマイナーアップデートで平気でC#の言語のバージョンが上がるという、昔のMSからするとありえないことをやってる
プロダクトを自己責任で軽いノリでリリースできるような事業形態の組織なら、
ある日突然新しい構文が使えるようになったりして楽しいからVS2017に移行する価値はあるよw >>237
それも違うというか、まさにそういう考え方をする人が>>226みたいな書き方をするんだと思うw
ifを○○なら××する、みたいな条件判断だと考えると、○○の箇所に比較演算子を書きたくなっちゃう。
(だからBASIC上がりの人はこういうコードを書きたがる)
逆にifなんて実態は機械語のJZ(Jump if Zero)で、要するに単に値を評価して分岐するだけ、
って考えると>>226みたいな書き方見るとなんじゃこりゃって思っちゃう 最近コードの自動生成をよくする
falseのときは書いて
trueのときは書かないとかやってねぇからtrue==は出る
同じノリだろ >>243-244
なるほど、ただのクライアントアプリだけなら関係ないのですね
新しい構文を勝手に使うとたまに怒られるので、止めておきますw bool?使うとtrue==は書かざるをえないんだよね。使いみちは限られるがUWPのx:Bindでbool?使わざるを得なかったりする >>248
bool? は if (x ?? false) の方がスマート >>245
プログラマは考えてはいけない
どんなにおかしなプログラムになっても設計書の通りに書くことが大切
製品の品質より方法論や会社のルールを優先しよう
それがサラリーマンのあるべき姿だよ 戦うサンデープログラマーっていうポッドキャストがあってだな 単純にa==trueって書くときa=trueっていうミスしたときに発見難しいけど
true==aって書くようにしてたらtrue=aってミスしてもコンパイル通らないから見つけやすいよねってだけじゃないの?
昔客先常駐でIT土方してた先輩はそう言ってた >>254
今のIDE使っている人達にしてみたら何を言ってるのかわからん言葉だなw List<int> idata =new List<int> (){1,2,3,4,5,6};
foreach (var dt in idata)
{
dt = 0;
}
dt=0が代入できない。 idata[0]=0;は代入できる。これはどう考えたらいいんだ? >>259
foreachで取ってきた要素はIEnumerator.Currentなので読み取り専用になる できたとしてもそもそもdtは値のコピーなのでセットできてもListの値は書き変わらない List<Label> lbl = new List<Label>() { new Label(), new Label ()};
lbl.Add (new Label() );
foreach(var l in lbl) {
l.Text = "aaaa";
}
これはできるけど。 List<clsint> idata = new List<clsint>();
foreach (var i in idata)
{
i.val = 123;
} class clsint{ public int val;}
これもできるけど。 dtが値型でも参照型でもコピー
参照型はアドレスがコピーされてるので
参照先のオブジェクトの書き換えが有効
値型は値自身がコピーされているので元の値に影響しない これは初心者が勉強したら理解できる内容なので
勉強しなさい 初心者脱出がレベル20だとしたら今のforeachの件はレベル5ぐらい ちゃんとした入門書をちゃんと読んで学習したらレベル10ぐらいは行く 残念だね
ちゃんと本でも読んでコードを書いてたらレベル10に到達するのに
勉強してるつもりになってふらふらしてるからレベル5 >foreachで取ってきた要素はIEnumerator.Currentなので読み取り専用になる
参照型もIenumerator.Currentなのか?
なぜ読み取り専用でもライトできるのか? ここでクダ巻いてないで勉強したらいいのに
自分より出来る人に突っかかってもいいことないのに わかった
ぐちぐちはやめよう
>>263
>>264
この2つともListの中身は変わっていないと言うことはわかるかな? 読み取り専用の参照型の変数は参照は書き換えられないが、その参照を得ればそれが指し示す実体を読み書きできる Listは中に追加された値を保存してる
intとかの値型はその値自身を持ってる
クラスとかの参照型は対象になるクラスへの参照が入ってる
そのListの中にある参照先自体は変わってない
>>273
残念だけどその内容になるほどというとドツボにはまる
classじゃなくてstructにするとフィールドまで書き換えできないと気づく
フィールドに波及しないと言うのは誤った理解 こんなところで怪しい回答に頼るより
しっかりした実績のある入門書に頼ったほうがいいよ
マジで
誰だってその時々で間違うし
本の時代は終わったなんていう奴がいるけど
webだけじゃ網羅的に勉強しづらい いいじゃん誤った理解で
馬鹿は痛い目みないと治らないから
ぜひ痛い目みて貰おうぜ foreach (var dt in idata)
{
dt = dt < min ? min : max < dt ? max : dt;
}
みたいなことができない。これはよくあるケースなので不便。 >しっかりした実績のある入門書に頼ったほうがいいよ
最近2冊ほど読んだけど、細かいところはやってみないとわからないよ。読んだだけでは無理。
なれが必要だ。で慣れるためにコードを書く。しかしサッパリ動かない。w //パラメータをシングルトンで持たせたいのだが、Jsonで格納しようとするとstaticにできない。なので
referenceを返したいのだが、何かいい方法はない?
class Singleton
{
private Singleton(){}
public static Singleton getInstace() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
public static Singleton INSTANCE = new Singleton();
}
}
たとえば教科書にあるシングルトン。これに
class clsGrovalParam
{
public int value1;
public int value2;
public int value3;
}
public clsGrovalParam Param;
とやってParamを追加していたが、なんか動作がおかしい。W
と思ったらPublicにしていたので直接Paramを生成していてシングルトンになってなかった。
.Param
こいつをStaticにできればいいのだが、Jsonで格納するときにスタティックにすると格納できない。 また伝わらない書き方だなあ
Jsonとはなんなのか?stringなのか?typeだとしてどのJsonなのか? >>283
そのレベルのことは一通り基礎を終えれば分かるから、今はソースに直にstaticで書いとけ
言っちゃ悪いけど、まだ設定の外部化なんか考えるようなレベルじゃない
シングルトンも忘れていい 参照型と値型を区別できないと普通に困るよ
そのたびにここで質問するの?
俺はc#の仕様が面白かったので入門書みたいのを10回以上読んだ
delegateとかeventとか他にはなかったから刺激的だった >シングルトンも忘れていい
グローバル変数を散らばらせるとなかなか大変になるので、ここは最初に抑えること。
別にシングルトンでなくてもいいが、、スタチックはJson.netに保存できないので仕方なしに
調べていたらシングルトン。ほんまにトンだよな。たったこれだけのことに頭を
悩ませないといかんとは。 >>287
君は5かける3はと言われて
1から順に数字を答えてる状態にしか見えないんだけど >参照型と値型を区別できないと普通に困るよ そのたびにここで質問するの?
いままさにこれに困っている。そこでプロパティにしたらどうなの?って実験してみようと思っている。
private clsGrovalParam _Param = new clsGrovalParam() {value1 = 1};
public clsGrovalParam Param
{
get { return _Param; }
set { Param =_Param ;}
} >>290
違うよ
九九の5X3を覚える
君にはそれがない 5を3回足すとか3を5回たすとか考えたり
5X3を覚えるとかがない
1から数え上げていって9当たりで疲れて質問に来る >>287
>グローバル変数を散らばらせるとなかなか大変になるので、ここは最初に抑えること
それはそもそもグローバル変数が多いこと自体が問題。
まともな設計が身に着けば自然に減る。
シングルトンは基本的にアンチパターンであり、初心者が積極的に使うものではない。 >291
だめだよ。そういう覚え方は。最初は足と手の指を使って15までカウントする。 初心者には紛らわしい物言いだったので補足
シングルトンはメンバも含めて実質すべてグローバル変数な 休みの昼間っから真っ赤にしてる奴にろくなのはいない やりたいことと実力のレベルに差があって
ちぐはぐしてるのは間違いない
例え15まで数えて正解しても次にはつながらないので
仕組みを理解してからのほうが良いのでは? 仕組みが理解できない場合いくら手を動かしても得られるものはないんでは? 初心者はなんでも場当たり的に解決しようとするが、これは意識しないと気が付かない悪い癖 仕組みを理解するために手を動かすのは正しい
仕組みを理解せずその場の答えを出すためにやみくもに手を動かすのは正しくない >295
細部はあまり関係ないと思う。
ベテランはそういう細部をきにするが、要するにシングルトンで何をしたいのか?
どう機能するものなのか?
それが大事なポイントじゃあるまいか。 名前の問題とか実装方法の問題じゃない。
別にシングルトンでなくてもいい。
ポイントはつまりアンチスパゲッティ。w
変数1,2、−−−100位は直ぐに散らばる。
これをまとめて一つにしておけば分かりやすい。まあ名前をまとめたところで参照は100か所に
なるから、どうしたって散らばるが、変更箇所は1か所にすることができる。それに括りの名前を付けて
おけばGrepできる。そういうメリットがある。ただそれだけのことだ。でもこれが大きい。 要するにインスタンスを一個しか持たないクラスにまとめたグローバル変数。
その割に実現がややこしい。w 設定データをシングルトンでって時点で何かがおかしい class Singleton
{
private Singleton(){}
public static Singleton getInstace() {
return SingletonHolder.INSTANCE;
}
private static class SingletonHolder {
public static Singleton INSTANCE = new Singleton();
}
private clsGrovalParam _Param = new clsGrovalParam() {value1 = 1};
public clsGrovalParam Param
{
get { return _Param; }
set { Param =_Param ;}
}
}
class clsGrovalParam
{
public int value1;
public int value2;
public int value3;
}
このシングルトンは駄目だな。Getinstanceするたびに_Paramがnewされる。_Paramがシングルトンにならんだろ。w
ParamをStaticにしないでシングルトンを作るにはどうしたらいいんだ? >設定データをシングルトンでって時点で何かがおかしい
アプリで共通に使うパラメータはシングルトンにする。
のがいいと思うのですが、、、、w >>309
単体テストが困難になるから避ける
大元のインスタンスはstaticでグローバルに共有してもいいけど、
そのグローバル変数に直接アクセスするのは最小限にしてコンストラクタなどで必要なものだけ受け取るようにするのが基本だよ >>282
しっかりした入門書なら決して「読んだだけ」になることはない >>309
スレの流れを把握してないのでひょっとしたら話が噛み合ってないかもしれないけど、
そういうのは、例えばVSが吐き出すプロジェクトのスケルトンで言ったらProgramみたいな
クラスのstataicメンバーとして持てばいいだけの話で、むしろシングルトンで実装する必然性が分からない Staticで持つとJson.Netが保存を拒否する。 string json = JsonConvert.SerializeObject(Param);
こんなの。 Staticでもってコピーすりゃいいだけか? そうだよな。w あれっ、保存できた。しかしスタディックにしても値が初期化されてしまう。
なんか別のインスタンスを作ってる。 なんかstaticメンバーとstaticクラスの区別が付いてない予感... 原因が分かった。
InitializeCompornent();がLoacalエリアをクリアしてる。
そんな馬鹿な。
Local変数でParamを宣言したときに
clsParam Param = clsParam.GetInstance ().Param ;
で値を代入してるのに。
コンストラクタのInitializeCompornent();がこのLoacalエリアをクリアしてる。そういうものか? でもやっぱり違う。ローカルを宣言して同時にGetInstanceで設定したら、その値が
入っている。 OK
次にInitializeCompornent();を実行する。
その次にもう一度このローカル変数にGetInstance()で代入したらクリアされてる。
おかしい。w このスレは勉強のために見ているけどID:agf4hW9w0は初心者に害悪でしかないな あ、この人数日前からしょうもない質問したり逆ギレしたりしてるお人かなw
正義(笑)をかさに着て人を追い出すようなことを言うのは好きじゃないけど、
それでも実況みたいなレスは自分で専用スレ立ててやった方がいいんじゃないの? Gofとか興味ないの? デザインパターンの大先生だよ。それが全然動かない。w
たいそうな本出してる割には、、、、、とちょっと不信感が沸いてる。 思うにカッコつけた本でも具体例が提示できないとだめだな。
抽象的な説明はカッコいいが、具体的なサンプルで動かないとカッコばかりで駄目だな。 お前掛け算知らないの?と変わらないレスを書いて平気なんだな
いくら初心者の発言だとしてもしらける >>312
>クラスのstataicメンバーとして持てばいいだけの話で、むしろシングルトンで実装する必然性が分からない
Programの中に
static ublic int Aaaa;
って入れると このFieldにAaaaは割り当てられません。つにに規定値0を使用します。ってでるんだが、 シングルトンやっと動いた。w
Programの中に書くってのもOKだな。Fieldワーニングがでるが。 イベントとデリゲートの違いがわかりません
イベントを使わなくてもデリゲートでproperty changedが実装できました
両者の違いを教えて下さい デリゲートは特定のかたちの関数をいれれる変数
イベントはデリゲートを利用して登録した関数を実行できる仕組み >>332
イベントはメンバの一種、デリゲートは型の一種。
C#ではメソッドはオブジェクトではない。それを値として受け渡しするために、メソッドをオブジェクトとして包むための型がデリゲート。
イベントは、イベントに対してデリゲートを登録&削除するという一般的なパターンを簡単にかつ利用者に分かりやすく実装するための特殊なメンバ。
プロパティに相当する。実際、イベントの登録削除はプロパティのように独自に実装することもできる。
興味があるならイベントアクセサでググってみるといいよ。イベントを自分で実装してみれば完全に理解できるはず。 メソッドの引数に1000以上の要素を持ったリストを渡す場合、メモリの消費等考慮するとやはり参照渡しが良いでしょうか? リスト自体が参照なので、リストのアドレスをコピーするコストしか発生しないのでは?
自信はないので詳しい人教えてくだちい。 面倒くさいから解説しないが
List<T>をそのまま渡そうがrefで渡そうがほとんど何も変わらん >>336
配列やリストは渡した先でインスタンスを書き換えない(nullにしたりしない)場合はref付けずにそのまま渡せ
コピーして渡すわけじゃないから >>336
これ言葉遊びになりがちなんだよな
「値型の値渡し」、「値型の参照渡し」、「参照型の値渡し」、「参照型の参照渡し」をまとめて値渡しと参照渡しと呼ぶのが元凶なんだろうけどさ
http://ufcpp.net/study/csharp/sp_ref.html >>334
adderとremoverというのがあって、+=で繋いだときはadderが呼ばれ、-=で削除したときはremoverが呼ばれるんですね
ここが単なるデリゲートのマルチキャストとと違うところだと思いました
どうもありがとうございました >>342
っていうか、コールバックを実現したいからと単純にデリゲート変数をそのまま公開すると、
(1) 外部からnullを代入できてしまう
(2) 外部からInvokeできてしまう
こういった問題がある。
だからデリゲート変数とは別のイベントに存在意義があるんでしょう C# WPF
xaml上にキャンバス配置、その子にImageがあって、
このImageをタイマーで左に動かしたいのですが、Imageの座標の動かし方が分からないです。
Canvas.Letfや、Image.Leftと打っても「現在のコンテキストが存在しない」とエラーが返ってきます。 Blendでプロジェクト開いてストーリーボード追加して
ドラッグして終わり
という方法は一般的でないけど楽 ストーリーボードは使わず、タイマー+csのコードで出来る方法をお願いします。
image.Width ←OK
image.Height ←OK
image.Left ← 出来ない
image.Top ← 出来ない
canvasの子としてimageがあるから出来ないのかなとは思うのですが、
canvas.Left ←出来ない
canvas.Top ←出来ない
も出来ないからお手上げです。時間経過ごとに少しづつ画像を動かしたいだけなんですが・・・ 実際のimageにはLeftとかは存在しないので
別の場所で辞書のようなもので保存してる
それが添付プロパティ setleftも試してて何でだろうと思ったら、usingでsystem.windows.controlを設定していませんでした。
ありがとうございます。
添付プロパティというのも初耳なので勉強します。 大学のプログラミングの課題を家でもできるようにしたいです
大学ではemacsでcファイルを作りコンパイラー(名称不明)にかけてgnuplot上でプログラムを実行してます
↑をできるような環境を自分のノートPCに作るために何をインストールすれば足りるでしょうか?
使用PCは富士通LIFEBOOK、OSはwindows10です >>351
ここはc#のスレであってcのスレじゃない
スレチ
まあ一番簡単なのはUSB起動のlinux使うか
virtualboxにlinuix入れることかな すみません、どうやらC言語とC♯、C++の区別もついてないみたいです… 向こうに行ってcygwinやMinGWやMSYSやBOW入れろとか言われてたら笑う EmacsとGCCやGnuplot入れる前提でわざわざ変な環境使う意味がわからない >テンプレが読めない回答者、議論をしたいだけの人は邪魔
>C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください どう見てもこのシチュエーションでecmasは重要じゃないということが分からないおまえに笑う 学校の環境がemacsなんだろ
マクロ使ってたら他じゃ実行できないじゃん コマンドでやればいいだけだろ(笑)
わざわざlinux入れる労力 w Linux側で仕事してるヤツ、羽振りはいいけどいつもイライラしてるね Emacs使いたがるやつは医者に診てもらえっていってたのはStackOverflowの中の人だっけ 誰だって今だったらemacs何か使うなよって思うわ
vscodeとか使ったほうがいい
でもそれが条件なんだから仕方がない
winsowsにcygwinやMinGWやMSYS入れるのは環境が汚れるだけ
git for winとバッティングするし >>371
path を適当に走査するだけで、なんとでもなるのでは? >>370
この人、twitterでもMicrosoftの中の人たちにしょっちゅう議論ふっかけてておもろいよ 1) StudentName student1 = new StudentName("Craig", "Playstead");
2) StudentName student2 = new StudentName
{
FirstName = "Craig",
LastName = "Playstead",
};
1)、2)初期化方法だけど、これってどっちもインスタンスを二つ作ってるよな。
上の方はstudent1というインスタンスを作ってさらにnewでインスタンスを作ってコピーしてる。
C#って初期化するのにインスタンスをわざわざ余分に作らないと初期化できないわけ?
無駄って感じがするが、、 >>374
まずは入門書を一通り終えよう
話はそれからだ class Program
{
static void Main(string[] args)
{
Person p1, p2;
p1 = new Person(); // 引数なしのコンストラクタ
p2 = new Person("太田隆", 29); // 引数ありのコンストラクタ
p1.Name = "斉藤花子";
p1.Age = 18;
p1.showDatas();
p2.showDatas();
}
}
こういう例でもさ、p1,p2って最初は空っぽでNew Person()で初めて実のあるものを作って渡すのかと思っていたら
P1、P1を宣言したときから実がはいってる。つまり実体ができている。それでnewでまた実を再度作って、代入してるんだね。
だとするとこのプログラムは酷い例だよな。p1.Name = "斉藤花子";をするためには p1 = new Person();これは意味がない。
Person p1;で既にコンストラクタは実行されてるんだろ。なんでp1=new Person();なんてやるんだよw >まずは入門書を一通り終えよう 話はそれからだ
間違いだらけの入門書。w
376をみてみなよ。 >>376
変数とnewで両方という意味ならインスタンスは片方でしか作っていない
参照型(クラス)の変数は実質ポインタなのでnewで作られた実体への参照が入る
値型(構造体)は変数を実体として(アドレスが参照され)newでコンストラクタを呼び出す
変数宣言だけでは参照型はnullだし、値型は領域確保だけでコンストラクタは呼び出されていない そんなことはないよ。
クラスPersonにpublic static int id =0;をいれて
Person(){ ++id;} のようにコンストラクタでインスタンス生成ごとにidをインクリメント
してみたら見事に2つインクリントしてる。だから君も勘ちがいしてる。 それとも入門書には書いてあるけど読めてないだけか? なんだ今日もバカの日記帳か?
変数宣言の時点で中身があるなら値型である
しかし値型なら引数無しコンストラクタは定義できない
そもそも日記帳の中身が破綻しとるw >>378
public class Person
{
public static int id = 0;
public string name;
public int age;
public Person() { ++id; name = "non"; age = 100; Debug.Print("PersonIdcount =" + id.ToString()); }
}
Person aaa;
Person bbb = new Person ();
Person ccc = new Person {name = "bbb",age = 25};
めんごーー、いま確認してみたらインスタンスはこれで2つしかできてない。先生がただしい。入門書はまあ正しかった。w >>387
お前は入門書を映像として見てはいるけど
内容は理解してないんだよ
だから毎日トンチンカンな内容なレスをしてる
何度でも読み返して理解してから来いよ ん? 387のどこが頓珍漢なのだ? 君の説明よりもかなり説得力があると思うが、、、
というのもインスタンスが生成され、その個数をカウントして実際に確認できている。
そういう厳然とした証拠が添付されている。
しかも実際に実行できるコードが添付されている。w >>389
その前にお前は何歳なんだ?
昭和の香りのする口ぶりや全角数字句読点からしたら55〜65歳ぐらいだな
でも言ってることは小学生レベル まあ普通の人はデフォルト動作など信頼せずに組むのがお薦めだね
勘違いでエライ目に逢う c#8.0になったら超大型破壊的変更がくるけどどうすんのかね
影響はこれまでのほぼ全てのソースに及ぶ >>395
null非許容参照型のことを言ってるんなら、それは的外れ C#っていうのはC言語に何らかの拡張を加えた言語って認識であってる? >>396
これまでのソースに手作業で!をつけまくらないといけないんだけど 実際に実行環境をいれたのか?
俺は入れたぞ?
わからないからと言ってググれでごまかすのはどうかと Null非許容型を前提としたものかどうかAssembly単位でも設定できる
てかそこまでしてなぜ気づかない… 普通は逆にするけどね
新しい機能は囲い込んで既存のものはそのままでも問題ないようにする
ところが普及しきった段階で破壊的変更を入れてくる >>401
大方どっかのチュートリアル通りの手順を踏んだだけで、現在のproposalなんか確認してないんだろうな
そんなん猿でもできるわ 素朴な疑問だがnull非許容参照型はGC送りはどうやるんだ?
変換構文などがあってnull代入できるのか? >>409
GC送り?オレオレ用語は定義と併せて書いてくれ null非許容参照型の参照を外してガベコレの対象にするにはどうするんだ?
従来だと a=null;などで解放してたものだが 値型はとられる領域違うでしょ
なんのための参照型なのかわかってる?
null代入ってnullを指すだけでオブジェクトは残るよね?
GCが参照されなくなったオブジェクトと判断して回収するかはGCのアルゴリズムしだいだけど、基本は使わなくなった参照を指定して解放するよね? 値型の代入でもコピーしない場合もあるみたいだね。コピー元が直ちに不要になる場合は
その参照をわたしてそのエリアをそのまま利用する。その方が合理的だから。
まあ単に想像だけど。
そして直ちに不要なのをおもいだして、値を渡したのを忘れて解放してしまう。どうもそういう
バグが偶に出るケースがある。特に初心者があれこれ考えられないような変なことを
やった後とかにそういう現象がでたりする。 >>415
> なんのための参照型なのかわかってる?
わかってないのはお前だろ w
別にnull代入するためだけにあるわけじゃないし
普通に参照してる変数が無くなったら解放対象になる Enumがdummyを入れないと誤動作するとか、Staticインスタンスの中身が新しいForm2をNewしてForm_Loadの直後に
突如消えるとかそういう現象はまあビギナーズラックみたいなもので普通はそういう現象に出会えない。
コンパイルエラーがでないし正常に動作するのででPropetyの書き方を全部間違っていたのだが、それでも正常に動作していて
あとで書き方の間違いに気が付いて修正する。そういうことで段々と普通のプログラムになってくるとそういうエラーもいつ
の間にか再現しなくなる。 どこにリファレンスカウントと書いてあるんですかね
ソースは?
マークスイープとは出てきたけど 自作のソフトをビルドしてexeを実行したとたんノートンで弾かれる
出力コードのパターンで引っかかってるらしいけどどうしろというの >>423
それはノートンのスレで聞くべきかと
プロジェクトのフォルダを監視対象から外すとかできるはず 開発レベルなら監視対象から外す
頒布レベルならノートンに検体差し出すとかすればいいんじゃなかったっけ? 初心者です。
MainWindow.xamlのtextbox name=“A” “B”を
MainWindow.xaml.csにて、配列に格納する場合
どう書けばいいですか? Textbox[] textboxArray = new Textbox[2]{A, B};
こういうこと? >>428
>MainWindow.xamlのtextbox name=“A” “B”を
これの意味がよく分からない
TextBoxを2つ配置してそれぞれの名前をAとBにしたってこと? queue使わずにListでも似たことが実装可能だと思いますが、queueのメリットってありますか? キューのデータ構造を直感的に操作できることに意味があるのでは?
速度的な話は知らんにゃ。 わざわざ「似たことを実装」せんですむ
List使わなくても配列で似たことを実装できるよね? >>431
真面目に聞いてるなら、たぶんQueueかListのどちらかまたは両方を理解してないだけだと思う
理解してたらそんなアホな質問はしないと思うなあ >>431
一般的なキューの作業に限るならパフォーマンスがいい
検索みたいな作業をさせると落ちるけど >>431
特化していることに意味がある。
・キュー動作(先入れ先出し)以外が出来ない。(途中に入れたり取り出したり出来ない)
・キューに最適化した構造なのでパフォーマンスが良い。 パフォーマンスより、それがキュー(FIFOバッファ)であることが明らかなのがメリットなんじゃね メモリリークや速度に問題がでたときはコードの美しさよりもカリカリに動く方が優先されるかな
どっちのがなんて気にしないでどっちもメリットって考える方が建設的だよ 今時は速度に問題が出たらマウスでポチポチしてちょっと高いインスタンスに変えたら解決
無駄な開発とメンテのコストをかけるよりずっと安上がり FIFO構造のqueueの機能がいかせる場面って、最近は局所的な場面だけだわな。
通信ぐらいか? くそコードを綺麗にリファクタリングしてくれるサービスないですかね C#始めようと思ったら他と比べて教材あんま出てないし、中古も出回ってなくて高いなあ >>445
キュウは意外と使われていないな。しかし本来連続処理をする場合はキューが必要になる。
例えばフィルターとか、通信処理ではなくてもメッセージの改行ごとの切り出しとか。キューを使うべきなのだが
つかってる例がない。
そもそもこのQueueの仕様がだめなんだよな。まるでハードFIFOのまんまじゃないか。笑える。
折角オブジェクト指向で柔軟に作り込みできるのに、何の機能もついてない。ライトするときの型とリードするときの型を
変えられないと意味ないだろ。W
というわけで、
配列でライトして、バイトリードできる利口なキューReQueを作りたいんだが、どう定義したらいいんだ? BCLのQueueは使いづらいのは確か
昔byte[]でもANSIのstringでもpush/popできるQueueを自作したよ ReQue<int[], byte > qq;
とか
ReQue <strigng, LineString>pp;
とか
1.は array をライトしてByteでリード
2.はStringでライトして、CRLFの区切りで切り出し
こんなのはできないか? 適当に言ってみただけだが、わりと簡単に作れそうだな。
C#って無茶苦茶強力だな。何でもできる。 >>435
な?これだけの議論になる。基礎から勉強し直してこい 実戦で役立つ C#プログラミングのイディオム/定石&パターン
独習c#(この前でたもの)が良いと思う WPFってほとんど使われてないって本当ですか?
windows formの方がいまでも需要あるんですかね?WPFしかやったことないから知らなかった。 慣れればWPFの方が楽チン。
WPF用のスレあるから、そっちで https://qiita.com/nskydiving/items/3af8bab5a0a63ccb9893
>Windows Formsの高DPI
VS2017の新機能に高DPIってあるけども、
別にVS2010とかでも、高DPIは使用出来ますよね?
ただちょっとフォントがボケるくらいで、表示不可能とか位置がズレることは無いって認識で合ってますか? Winformsは中途半端なHiDPIサポートが元々入っているせいで
注意深く組まないとネイティブアプリよりもむしろレイアウト崩れやすいレベルだぞ
4.7で追加されたHiDPIサポートとやらもWin10のCUからでないと有効にならない Win10もアップデート次第でレイアウトが異なることがあるのですね・・・。
ありがとうございます。 テキスト編集ソフトを作ってるんですが、ユーザーが開いたテキストファイルの一覧を、
外部ファイルを使用せずにアプリ自身に保存するにはどうしたらいいでしょうか? GetManifestResourceStream ゲームのカートリッジみたいに読み書き可能な領域がexe内にあると思ってんじゃないのか ネタ質問だと思うけど無理なことは無理と言ってあげた方が C++で似たようなことをやったときは
exe起動→exeのコピーを作成して起動。オリジナルは終了→
メイン処理→オリジナルのexeを書き換えてPEのチェッサムを再計算
とやった これだとexeが増えてしまうが
exeをコピーして起動でなく、CreateRemoteThreadで他のプロセスに寄生してしまえばexeを増やさなくてすむ
いかにもウイルス的だけど javaかじってこっちに流れてちょっと学び始めたけど驚くほどjavaとそっくりなんだね そりゃJava使いならJavaと対応してるものに目が行くから似てるように感じるのは当然だろう
今のC#は拡張に拡張を重ねてC++に匹敵するくらい複雑怪奇な言語だよ >>481
確かに複雑になっては来てるけど、C++に匹敵ってのは大げさだろ。
C++はC++11/14/17と着実に先を進んでるからな。 c#は最近は後発気味
毎回追加される仕様は他の言語から引っ張って来てるものばかり
typescriptの仕様とかそろそろ入れてくるんじゃないかと思ってる タイプスクリプトにあってC#にない機能しないなんてある? TypeScriptの肝とも言える structual type と type guard はC#にはないんじゃないかな。 型関連は TypeScript の方が高度で精密
型消去されるので CLI の仕様に縛られない TypeScriptの型システムは完全なstructual subtypingで、そもそも型に対する考え方が大きく違う
「同名のメンバを一つでも持っていれば、共通する部分については同じ型と見做す」という、
高度で精密という表現からはかけ離れた大雑把な型システムだよ
インターフェイスの明示的実装なんかは原理的に不可能だし 既存の型との相互運用は限定されるだろうけど、一つの言語に両者を混在させるところまでは可能だろうな。
ようは型ヒント付きのVariant。 >>483が言ってるのって構造的型と型ガードのことなの?
他にはないの? uniontypeとか入れたい人がいるようだけど
void aaa(string | int | double a )
{
こんな感じで複数の型を受け入れられる c#始めて少しだけど、最初にデータバインドでつまづいて
今は非同期処理を使いこなせなくて辛い
linqもまだまだだし、1人前になるには少なくとも1年はかかるだろうか >>494
言語に振り回されてる
大事なことはプログラムを完成させることだし
処理を実現すること >>495
その通りなんだけど、そもそもやりたいことを実現するために機能が必要なことが多い
xamlに値を直接書きたくない→データバインド
webリクエストを投げてかえってきた結果をスクレイピングして使いたい→非同期処理
コレクションの処理を簡潔に記述したい→linq
全部使わなくても出来るとは思うけど、
どうせあとで書き換えることになるだろうし、
ちゃんと学んでおいた方が後の手戻りが少なくなると思う 動いてるものを書き換えることは少ないよ
特にlinqへ書き換えは趣味の世界 継続的に開発して変化に対応しやすいようにするならlinqは短いコードだけ
ちょっと複雑なのは普通にforやforeachがいい場合がある
linqは結局一つの列挙しか返さないから要素数が違ったりするものを組み合わせられない >>500
たぶん設計が狂ってるんだろうな
複雑なループってトランザクションスクリプト的な汚いシステム特有の現象だよ
要素数が違うってことは異なるエンティティってことだからそれらを同時に列挙してる時点でなにかがズレてるんじゃないの >>502
誰も複雑なループなんて言ってねーじゃん >>500
>ちょっと複雑なのは普通にforやforeachがいい場合がある
forやforeachってループじゃないのかぁ 理解力が低い自慢はいいよ
使いたい人はなんでもlinq使えばいい
linqは限られた用途で光るもの
上の方のレスにある属性がMaxの要素を取り出すにはlinqでは2回ループがいる
foreachやforでは1ループでいい
それがどうだと思う人は永遠に初心者のまま 複雑さと関係ない例だよねそれ
まあLinqで困るようじゃ区別つかんか 10年前からLINQは糞で遅いから普及しないって言われてた。 >>506
ほう
試しにMaxだと2回ループが走って、foreachだと走らないコード書いてみて 初心者の質問スレなんで質問でも回答でもない「先生方」は別のところに行ってください 関数型言語がなんで廃れてるかがよく分かる。KYなんだよ、彼らは。 「そうそう、アメリカは悪いーヤツなんだよね…」
「あ、俺、最近は洋楽聞いてるんだ…」
「関数型言語がなんで廃れてるかがよく分かる。KYなんだよ、彼らは…」
「コーヒー、砂糖入れなくていいからな…」 >>505
バカ?
複雑な処理はって話で
「複雑」はループにかかってる修飾語じゃねーだろ
プログラム言語の前に日本語なんとかしろよバーカ >>514
あのさ文脈少しは気にしたら?
複雑な処理をLinqでやるかループでやるかって比較してたんだろ
ならここでの複雑な処理っての複雑なループか複雑なLinqのどっちかなんだよ
このロジック君にはLinqより難しかったかな? jsonresultの使い方がよくわからないのですが、Ajaxとかでpostしたら結果を受けることができるって感じなんでしょうか
何故かあんまり解説落ちてない >>515
はぁ?
処理は複雑だけど
複雑なループになる確証はねぇだろ
早く死ねよw Linqで書けないような複雑なコレクション操作を何度も書くのはしんどいよ
仮にループで書くとしても1回書いたらそれをLinq拡張として再利用すべきだろうね [1]
var maxItem=null;
foreach(var item in list){
if(maxItem!=null&&item.Value>maxItem.Value)
maxItem=item;
}
[2]
var maxItem=list.OrderBy(item=>item.Value).Last();
[3]
var max=list.Max(item=>item.Value);
var maxItem=list.Select(item=>item.Value==max).First(); 一般的にLINQコードのほうが少ないワーキングメモリで理解できる 馬鹿らしい勝負だな
適材適所
linqが使い良い場所ならそこで使う
forやforeachが使い良い場所ならそこで使う
汎用性はfor foreachが上 最近書き直された独習C# ってどんなぐあいですか?
C#2.0 から知識は止まっているので、買ってみようと思うときもあるのですが >>520
[2]は悪手
ループが多すぎる
並べ替えで何回ループしてるかわからない
しかも無駄にループする可能性があるので
OrderBy Lastの組み合わせじゃなくてOrderByDescending First使うべき Lastだと最後まで列挙されるからってこと?
だから前の誰かはわざわざ降順にしてたのか 仕様通りに動けば中身はなんだっていいんだよ。(個人ならね) 今のはlistがIListならLastでもいい
しかし全部の内部の処理動作を覚えて
いちいちその違いを認識してコードを書くとは思えないので
どうしたらパッと見早く動くように見えるかロジカルに考える習慣をつけるべき デカいリストの時とか変わったループ処理のときだけ原始的な書き方でやればいいんだろうな そもそも内部構造によって悪手かもしれないなら
普通に[1]を選べばいい
何をやってるかわかるから デカイリストとか変なループ処理じゃないなら直感的なリンクでいいよね 書いたコードでその人が何を考えて書いたのかはわかるだろう
そして弱点があるならその人のレベルを疑うだろう
PGは無駄がなく速く動くコードを書きたいと願うもの
初心者はまだその域に達していないだけ >>535
でも1ってバグってね?
maxitemに値入るの? 1,2,3ってそれぞれ別のモンを掴んで来そうだけど
こんな欠陥コードで比較してて大丈夫なの? >>539
省略してあるんだろと思ったけどバグ入り 1,2,3を同じ結果が得られるコードだと思ってるなら不味いよ
っていうか普通にlinqわかりにくいから使ってる奴死のうねってコード
じゃあ、1の不具合修正版と全く同じ動作をする処理を
2と3の形式で書けよって言われるとあんまりlinq使う意味ないんだろ
捨てちゃえよコレ なに言ってるかわからんが、結局
デカいリストの時とか変わったループ処理のときだけ原始的な書き方でやればいいんだろうな >>527
親を殺されてるのに冷静でいられる奴の方が変だ 要素数が多い場合はDBで処理すればいい
シーケンスの集合演算で容易に解けないようなレアケースは一度だけベタに書いてIEnumerable拡張としてライブラリ化して二度とベタに書いちゃいけない
DRYは基本中の基本 オンメモリで処理できるものをDBみたいに糞遅いものに頼ることはないと思うけど
なんかちょいちょい変なやり方をこれがいいですよみたいな書き方はやめたほうがいいよ それにlinqから複数の要素数の違うシーケンスを取り出せないって書いてあるだけだろ
つまんね >>539
バグ以前にコンパイル通らないだろ
> var maxItem=null; >>546
こういうタイプの人がとんでもない件数のデータ取得してAPで集計するみたいな酷い処理を書くのかな そもそも「linqから複数の要素数の違うシーケンスを取り出せない」って意味不明な文が何を言いたいのか全くわからんのだが >>551
それな。
zipとかの関数は小さい方に合わせるんだがそういうことではないのかね。 デジタルネイティブならぬlinqネイティブな超初心者の俺には原始的なやり方を出来るだけ使わないやり方のほうが少ないワーキングメモリで理解できて楽なんだが、今まで地道な書き方してきた人はできるだけその書き方をしたいと思うのかね。 超初心者の多いPythonのスレだと関数型的な関数とか内包表記に対して誰も文句言わずに当たり前のように受け入れられてるしね。
俺からみたらこのスレのリンク拒絶反応民は言語学的にみても自然な流れなのにら抜き言葉を受け入れられない老人ってイメージ。 新しい技術を学ばない人なら「地道な書き方」を続けるだろうね linqは早くなるわけでもないので、見通しが悪くなる場合は使用を控えるのが得策だな
ただ、直感的に判りやすいものは積極的に使うべきだ >>557
>>520が全部違う結果がかえる時点で超わかりにくいじゃん 同意
LINQ云々以前にパッと見で分からん様な処理はちゃんと名前付けるべき 俺のような超初心者には、述語もなくて原始的であちこち飛びまくりで状態変数更新しまくりのコードを理解するのには、長いリンクコードと比較して3倍のストレスを感じてしまうな。
超初心者だから、デカいコレクションとかを効率的に裁かなければいけない状況にはほとんど出会わないけれど、古参のプロプログラマーは俺が普段扱うような大規模でないコレクションには出会わないのかね。 保守性もなく糞遅いLINQでわさわざ書く理由が分からない。
もはや初心者スレでマウンティングすることぐらいしかできていないアホ機能。 LINQしか使えない人がLINQ+そのほかの機能も使える人に噛みついてるだけ
全員補助輪つけろという抗議活動 >>561
それで友の会スレ使わないで初心者スレきてんだ?w
初心者マウンティングがやりたくてわざわざこんなとこで貼ってるのかよ マウンティングならちゃんとやって欲しい
バグコードなんかダッチワイフとシコシコやってるのと変わらないだろ 大したモン作れないから
初心者スレで初心者が見慣れないコード貼って悦に入るゴミクズ
そうでないというなら友の会スレ新しく建ててそっち行けよ
前のはもう消えたけどなlinqなんて誰も使ってねーから >>555
人語の場合は正しいかどうかの基準は合理性ではないのでその議論はナンセンス。
日本語にも英語にも不合理な文法なんかいくらでもある。
あと、どうせ言っても分からんと思うけど、世代論に限らず「〜ガー」っていうのは
他人からは言ってる本人の被害者意識や被害妄想を語るに落ちてるようにしか聞こえないことに
いい歳こいてるなら気が付いた方がいいと思うw
もちろん受け取る側の他人もいろいろだけどね >>567
> 「〜ガー」っていうのは
> 他人からは言ってる本人の被害者意識や被害妄想を語るに落ちてるようにしか聞こえない
なにかトラウマでもあるんだろうな w >>566
>linqなんて誰も使ってねーから
はいキチガイ じゃあどうして友の会スレは消えちゃったの?
誰も書き込んでなかったからでしょ? C#の言語内機能でしかないシロモノで、単品で語る様な物じゃなかったからねえ
スレ自体は落ちて当然というか
むしろWPFスレとかよく残ってんなっていう
(まあそりゃ厳密にはC#以外でも使えるが) WPF終わったなって書き込むと
そもそも始まってないしって返ってくるスレ 深入りしなければ悪くない
個人的にFormsを使うことはなくなったし
ただエヴァンジェリストとかMVPとかの発言は聞き流すべきだなと思った WPF食わず嫌いしてたけど使ってみるとすごく楽で良かった
ただレイヤー分割をしっかりできないと逆に使いにくいのかなとも思った
日本の開発の現場ではレイヤー分割の概念がまだ広まってないからそこで失敗して嫌になっちゃうのかもしれない
早すぎたんだろうな WPFは個人的にも好きだよ
あくまで、linqと立ち位置を比較しての話ね
>エヴァンジェリストとかMVPとかの発言は聞き流すべきだなと思った
これには全力で同意だが 馬の耳に念仏って実際かなりあるからなんとも言えんな
エヴァンジェリストやMVPの言ってるのとがレベル高すぎて理解できないだけかもしれん
完全に理解したうえで論理的に反論するならともかく リンク使ってるだけで悦に入ってると思うとかどんなコンプだよ...
linqネイティブの俺には想像もつかんわ。 むしろ原始的な書き方をしてる人のほうが悦に入ってそう... w プログラミングがどうしてもできない人もいればなんの不自由もなくできる人がいるように、リンクがどうしても難しい人がいるんだな w
リンク書けるのに原始的な書き方を書けない人は居ない
原始的な書き方はできるけどリンク書けない人は居ないとは限らない w これがやりたくて友の会スレから脱獄してきたガイジなんでしょ?
誰も聞いて無いのに突然linq書き出して迷惑してますって被害届出てるよ >>586
どう考えても、LINQなんか使ってるやついないって言ってるお前がガイジ Linq最大の失敗はLinqすら理解できずにぶちぶち文句言う雑魚が存在することを予測できなかったことだな >>588
関係ないけど標準語ではぶつぶつ文句を言うだけど
ぶちぶちてどこの方言なんだ? 「でぶでぶ」太る、とかいう人もいるから、その類じゃないかな
ちょっと変わった擬態語でインパクトを与える、というのは日本語ならではだと思います リンク使っただけでブチブチ言われるとかどんな世の中だよ...
便利で簡単だから使ってるのにそれを難しく感じる連中どもの意見なんて要らない w >>589
「ぶちぶち」は文句を言うときのオノマトペ(擬音語・擬声語)です。
語彙力は大事だぞ少年よ 難しく感じてるんじゃなくて使いどころを見極めましょうだな
上で一日延々やってたみたいだけど読む気がしない ブチブチとか俺のところでも普通に使うが w
自演と思いたいなら勝手に思っとけ
ちな愛知 >>593
多分それ方言
周りで誰かつかってるか? >>594
そそ。
結局
デカいリストの時とか変わったループ処理のときだけ原始的な書き方でやればいいんだろうな
ってこと w
リンク難民は簡単なリンク使っただけでも早さがどうのこうの、動作が理解できないだのブチブチ言うんだよな w
リンクを難しく感じる連中の意見なんて要らない w linqみてーなマイナー機能に飛びつく傾向があるんだろ マイナーと感じるのはおまえが使わない(難しく感じるので使いたくない)から w
Pythonとかだと似たような書き方は一般的に使われてるのに w 特定の地方で用いられる方言ではなく単に「ぶつぶつ」と「ぐちぐち」が混ざったような俗語だろう >>596
普通に使われてるよ
ちなみに東京な
日本語を少しかじった在日外国人もぶちぶち文句を言うって言い回しには戸惑うらしい スレ違いで質問流すわ質問できない雰囲気作るわ、お前ら最低だよ LINQなんぞ拡張メソッドとラムダ式に過ぎず、実装的には殆どがfor(each)+コールバック+yieldなのに
殊更に対比して語る事自体とても奇妙に思える、yieldは吐くコードが迂遠だから避けられる事はままあるし ところでLinqでシーケンスのあるものって取り出すのはむつかしいか?
例えばSTX、~ 、ETXみたいにSTXとETXに囲まれた〜を取り出す方法ってある? その二つの関数がなにかをチャンと明示してみな。できないことを証明してやる。 すまん、そのマーカーを除くためにもうひとつの関数がいる >>608
お前の考えてる処理仕様が明確につたわってこない
エスパー回答するならSkipWhile, TakeWhileの組み合わせで解ける 質問はエスパーじゃなくてもパーでも解る。
しかし回答はピッタシだ。スペル見ただけで解った。 direct2dの初期化などをc++のdllで行って画像をC#で表示したいんですが
ID2D1HwndRenderTargetのhwndをC#のコントロールのハンドルにすればC#で表示できますか? 以下のようなコードで、"date"が同じ日付のオブジェクトの"no"を合算するGROUP BY的な処理をLINQで書く事は出来るでしょうか?よろしくお願いします。
class hoge
{
public DateTime date { get; set; }
public int no { get; set; }
}
class Program
{
static void Main(string[] args)
{
var test = new hoge[] {
new hoge { date = DateTime.Parse("2018/02/20"), no = 10 },
new hoge { date = DateTime.Parse("2018/02/20"), no = 20 }
};
//期待する結果 date = "2018/02/20", no = 30
}
} そのものズバリGroupByあるだろが
目ついてんのか test.GroupBy(x=>x.date).Select(xs=>new Hoge{date=xs.Key, no=xs.Source.Sum(x=>x.no)})
var key=0;
var grList=new List<IGrouping<int,Hoge>>();
foreach(var x in test){ 教えたいただいたコードをちょっと変えて
var newtest = test.GroupBy(x => x.date).Select(xs => new hoge { date = xs.Key, no = xs.Sum(x => x.no) });
で期待する結果が出ました
LINQの書き方に慣れていないので参考になります
ありがとうございます >>631
ちなみにですが
xs.Source
部分はインテリセンスが候補として出して来ないので不要ですよね?
実は肝だったらと気になりまして >>635
昔から言われていることとは微妙に意味が変わってきているね
flag == false
は OK だが
flag == true
はやめろ!
ってやつじゃない?C では結構重要だ それってマクロを使ってた flag == TRUE の話じゃなかったっけ。 BOOL(intのtypedef)の話だな。flag == true は冗長であることを除けば何の問題もない。
あと、BOOLをTRUEと比較しちゃならんってのもFALSE(0)以外が真とみなされる文脈でのことで、
本当にTRUE(1)を求めているのであればそれと比較することに問題があるはずもない。 VBでのif thenのせいもあるのかなっと想像した if(min <= dt && dt <= max){
debug.print("left thing must be a minimum , right must be a maximum");
} all your base are belong to us かよw //HACK: This is The Golden Rule of indentation.
if (~) {
count++;
} else {
count = 0;
}
//ass:
if (~)
{
} String flag = "true";
if(flag)
{
}
こんなのを見たことあるw stringじゃなくてStringとか下らない
暇つぶしは否定しないけどもっとプログラマ的に刺激的なこと、それが無理ならせめて面白いこと書いてよ 初歩的な質問ですみません
例外で例えば「FileNotFoundException」が発生した場合に、catch文で、「FileNotFoundException」を文字列として取得するにはどうしたらいいでしょうか
エラーログ取得用です [] [[[ [[ [] ][ [] [ ] [] ][]] [[[ [] } e.GetType().Name とかじゃなかったっけ。 エラーログならむしろex.ToString()全部出したら良くない? >>651です
今はToStringで出してるんですが、行数節約の為にと思いまして。>>653で試してみます。
ありがとうございました 要件に対してオーバースペックなのを勧めるのは良くない傾向だと思うにゃ 最低限の手法を説明しつつ、若干オーバースペックな手法も説明して選択させるのが好き。
メリットデメリットもちゃんと説明する。
普段そうしてる。 n個の"hoge"が入っている配列を作りたいんだけど、
Enumerable.Range(1,n).Select(i => new{"hoge"}).ToArray()
で良いのかな? ラムダ見るといつも頭混乱するんだけどこれって見やすいの? クエリ式の方が苦手
ラムダだとIntelliSenseでスペルミス防げるじゃん 個人的にはラムダは抵抗なく読める
Pythonの内包表記は苦手 >>663
見やすいと思うが個人差あるな
ただまあλの利点って見やすさじゃないからな >>661
Enumerable.Repeat("hoge", n).ToArray() じゃいかんのか ラムダは過去に一度滅んだ技術だからな。普及するわけがない。 >>670
それじゃ初心者相手にマウンティングできないだろ EFでList<string>のデータを保存するにはどうしたらいいの? >>672
え?滅んだんですか?何の技術だったんですか? >>676
おまえ、初心者丸出しに気づいてないの恥ずかしいな >>678
滅んだ、というのなら、それは何の技術だったのか説明していただけませんか? ただラムダ式が苦手なだけな奴の見苦しい言い訳に構うなよ w >>680-682
スレチだからこっちでやってくれませんか。
過疎ってるからって初心者スレで暴れないでくださいよ、低脳馬鹿ラムダ厨さん。
λ ラムダ式は神 ラムダ式を崇めよ λ [無断転載禁止]©2ch.net
https://mevius.2ch.net/test/read.cgi/tech/1494867168/ 古典教師とラムダ厨と被るわ。
役に立たない古い知識で初心者スレでマウンティングとか。→ ID:n9Q43L/40 www C#の例外処理スレを立てたらここはスレチになるのか w
ほんとラムダ式嫌悪厨は哀れだな w >>683
C# にラムダ式はあるのにどうしてスレ違いなんでしょうか? LINQスレあったよな。なぜそっちでやらないの?
あっ落ちたのかw 過疎りすぎて誰も次は立てる気がないようだw
だって10年でたった1スレすら消費できなかったからなwww 誰も興味ないかよほど嫌われてんだなw >>687
C# に LINQ はがっちり含まれているのに、どうしてスレ違いなんでしょうか? ID:n9Q43L/40 ←惨め杉www 初心者スレでマウンティングするしかないww
> リンク否定派==ラムダ式嫌悪厨
> ただラムダ式が苦手なだけな奴の見苦しい言い訳に構うなよ w
> おまえ、初心者丸出しに気づいてないの恥ずかしいな
> ほんとラムダ式嫌悪厨は哀れだな w
ほんとこいつ初心者スレで煽りとマウンティングしかしてねぇw byte[]buf = 1,2,3,4,5、ETX,7,8,9
AX=1,2,3,4,5
BX=ETX,7,8,9
BufからAX,BXをわけて取り出ししたい。(ETXはAX側でもBX側でも構わない)
AX=buf..TakeWhile(x=>x!=ETX);
とすれば取り込めるが、BXはどうしたらいいのだろう? SkiPWhileは違う。ETXで分離するのが目的だからだ。 >おまえ、初心者丸出しに気づいてないの恥ずかしいな
初心者丸出しが恥ずかしいことか? 陳湖丸出しとは分けが違うがお前はそういう趣味でもあるのか?
>C# にラムダ式はあるのにどうしてスレ違いなんでしょうか?
主観の問題だ。しかし感受性の問題でもある。ひらたく言うとどこにも頭の悪いのはいる。
>古い?どうして古いのでしょうか?
主観の問題だ。少しズレた主観もある。
>C# に LINQ はがっちり含まれているのに、どうしてスレ違いなんでしょうか?
しつこい質問者だからあえてシツコク答えるが主観の問題だ。しかしシツコク追い求めるのはプログラマーの適正でもある。 >>687
なぁ、いい加減誰も使って無いって気づいて欲しいぜ >>696
オブラートで包むと意味が解らないか? 解るようにハッキリ言うと荒れるしな。
困ったものだ。
SkiPWhileじゃだめってのはわかるか? このスレってリンクの質問ばっかだろ
なんで使われてないと思うのか謎
もしかして全員同じ人と思ってるの? だって10年で1スレ消費できないってかなりのもんだよ
まあ、友の会スレに書き込んで無かった君が一番わかってることだと思うし言っても無意味だと思うけどw 試しにC#非同期スレ立ててみようぜ w
どうせ伸びないから w
みんな使ってないもんな w # 先頭文字で、配列の要素をグルーピング
animals = ["cat", "bat", "bear", "camel", "alpaca"]
p animals.group_by {|item| item[0].chr }
{"a"=>["alpaca"], "b"=>["bat", "bear"], "c"=>["cat", "camel"]}
Ruby では、group_by で、配列の要素をグルーピングできる。
ブロックの戻り値が同じ要素で、グルーピングする
他にも、partition で、要素を2つの配列に分けられる C#でもできる
partionはないが多分GroupByで代用できる じゃあGroupBy使って
byte[]buf = 1,2,3,4,5、ETX,7,8,9
をETXの前後で分解してみて。 でも分解する場合には他に適当な方法がないのでは? GroupByとIndexを併用すれば
なんとかならないか? 明らかにそんなやり方よりTakeWhile, SkipWhileを使うやり方のほうが真っ当 >明らかにそんなやり方よりTakeWhile, SkipWhileを使うやり方のほうが真っ当
不味いんじゃないだろうか?
要するにループを頭から2回まわすことになるだろ。
Ax= buf.TakeWhile(〜)
Bx= buf.SkipWHile(~)
それならForeachの方がいいとおもう。
AX= ETXを見つけるまでこっちに入れる。
BX=ETXを見つけた以後はこっちに入れる。 効率が問題になるほど大規模なリストなら原始的な書き方をする。
そうでないならLinqでいい linqがボトルネックにならないならlinqでいいよな。 linqがボトルネックになる場合ってそもそもC#でやっちゃいけないでしょ ZDDアルゴリズムを実装してくれればLINQ使うよ >>692
そういうの、差集合って言うんじゃない? >>718
いいね!いいね! そのヒント。 君が一番頭いい。 ただ、あるインデックスの前後で二分するだけならたぶん無駄に非効率なんだろうけどね scores = %w[1 2 3 4 5 ETX 7 8 9]
numbers = scores.each_with_object({}) do | num, h |
# 配列の初期化
h[:before] = [] unless h[:before]
h[:after] = [] unless h[:after]
if h[:ETX]
h[:after].push num
else
if num == "ETX"
h[:ETX] = true
else
h[:before].push num
end
end
end
p numbers
{:before=>["1", "2", "3", "4", "5"], :after=>["7", "8", "9"], :ETX=>true}
Ruby の、each_with_index メソッドは、引数に蓄積器を指定して、繰り返し処理する。
空のハッシュ { }に、結果を蓄積していく。
"ETX"があったかどうかの状態を記憶して、処理を分岐する >>723
修正
>Ruby の、each_with_index メソッドは、引数に蓄積器を指定して、繰り返し処理する
each_with_index ではなく、each_with_object var temp = buf
.Select(x => new { value = x, flag = x < etx })
.GroupBy(x => x.flag, x => x.value)
.Select(x => x.AsEnumerable())
.ToArray();
var ax = temp.First();
var bx = temp.Last(); flag = x < etx
これってETX以前はTrueになる? たぶんそういう意図だろうけど
xはindexだろけど、etxと比較しても駄目って思うが、、、 linqなんてクソ機能を使うと移植が大変になるわけだが イテレーター書くだけだから逆に移植しやすくなる
抽象化レイヤーがないと全てのループ処理について移植できるかどうか
移植するにはどうすればいいか
例外ケースはないかなど悩まなくてはならない >>734
は?普通はそんなことすらやらなくてよくね? >>735
linqを使わないで移植すると移植しなきゃならないコードが一気に増える
linqを使っていればlinqを移植するだけでほとんど終わり
簡単だね 日曜大工プログラマーなんだけど、実際Linq使わないってなるとプロの方はどういうことを基本としてるの?
プロの方々なら当然Linqも理解して手段の一つとして持ってると思うけど
あえてそれは使わないってなると、同じこと実現するのに何が基本となるのかまじめに教えてください 周りにはlinq使うなよと吹聴しつつ自分は使うというのが最高に決まっとる LINQなんて銘打たれてても只のパターンだからねぇ
デリゲートがインライン展開されるならまだしも
switchまみれのIEnumerator<T>とかは草生える
どうせコントロール追加もAddよりAddRangeの方が良いし
概ねArrayやList<T>のメソッドで済む事が多いな
あと拡張メソッド多すぎでIntelliSenseの邪魔、フィルタが面倒 効率はすでに言った通りだからともかくとして、このスレのlinqの質問のほとんどはarrayやlistのメソッドでは事足りないだろう LINQ使わずに同等の処理をしたいならそれこそReference Source参照で良いんじゃね
個人的にはyieldもブロックスコープで最適化したくなる妙な実装に思えるけど LINQとか表記は割りとどうでも良いからユニットテストがきちんと書けるソースコードにして欲しいと、200行超えの他人のクソメソッドをメンテしてて思った
リファクタリング楽しいです(^q^) Span実験してみたい。しかしSystem.Memoryインストールに失敗する。何でだろう? 素人ながらに四苦八苦しながら小規模の業務アプリを作っているのですが
Program.csに、アプリケーションに保持させておきたい情報をまとめた自作クラスを
staticで保持させておいて、全フォーム通してそれを読み出せるのかと考えたのですが
愚行でしょうか? >>749
なんの問題があるの?
Program.csでなくてもいいし発想そのものはCとかのヘッダファイルとかと同じだよね >>749
本当にその必要があるならその方法でグローバルな情報を持ってOKだと思う。
前に同じ質問で「そんなものコンストラクタの引数で渡せ」と書いてた人がいたが、
むしろそっちの方が不適切。
でも、本当にそれが必要なのかは再考した方がいいかもね。
グローバルなデータなんて普通はそんなにいらないよ
>>750
だからそれを聞いてるんでしょw
っていうかヘッダファイルって意味不明だよww >>749
どんな設定かによって答えが変わるので情報出して
汎用性考えるならインジェクションだけどまだ練度が足りないかな 質問よろしいでしょうか
ある複数のパラメータを持ったクラスを他のクラスのメンバに代入すると、そのパラメータが変更されたら代入先のメンバも書き変わってしまいますよね?
一度代入した時点から勝手に書き変わられたくない場合、パラメータを持ったクラスがクローンを返すような実装をするのがいいんでしょうか。他に定石等あれば教えて頂きたいです みなさまご教授ありがとうございます
グローバルを持つべきか再度よく検討の上やってみたいと思います
>>752
自作クラスだと一手間いるのと、修正しやすさでProgram.csに置きたいなと ApplicationSettingsは自作クラスじゃなくてVSのきのうだよ >>753
端末のIPやらMacアドレスのほか、データベースへの接続文字列を実行中に随時切り替えて接続させてるのですが
そのためのList<string>とかです
あとはNotifyIconをおいて、アプリの動作状況によって各Form上からも通知アイコンの画像を変更させてます >>754
構造体とかイミュータブルオブジェクトとか >>754
(1) クローンを返す
(2) イミュータブルな別の型(インターフェイス or コンポジション)として返す
(3) 気にしない >>754
メンバに参照を保持るのは禁じ手
そのインスタンスが死んだらハングアップすんじゃん
必要であるたびにメソッドの引数から必要な分だけ必要な形で渡すのが真っ当なやり方 >>755
そのファイルにクラスおいた方が楽って感覚がわからないな
1クラス1ファイルが基本だし別のファイルおいた方が色々楽だと思うけど
まさかないと思うけどpublicなインナークラスにするのはよくないから気をつけてね >>761
拠点毎のデータベースと、全拠点と端末を管理したり共通の設定情報を保持するデータベースとわけてるので
必要な情報に応じて動的につないでSQL文を実行させてます
>>763
全体を管理するデータベースの情報を元に端末毎に動作する権限や機能を割り当てるようにしてるので
起動するフォームを異なります
なので、初回フォームが起動する前に端末情報をProgram.csに保持させたいということと
異なる役割の端末(Form)からでも共通の設定値を利用したかったからです
>まさかないと思うけどpublicなインナークラスにするのはよくないから気をつけてね
この辺の理解がだめです・・・(書籍を読んで独学で一人でやってます)
外部クラスなりにProgram.csにおいたStaticな自作クラスにアクセスさせてはだめってことなのかと理解しましたが
具体的にどうだめなのかがさっぱりで・・・ Listで中にclassをaddしていって
中のclassが解放されて歯抜けになって状態でaddした場合
nullの配列にaddされるか
歯抜けになったのをソートして埋めることって出来ない? 自分で明示的にnull代入しない限りListが歯抜けになったりしないだろ Listで型をclassにしてaddしていって
格納したclassがいくつか解放されて歯抜けになった状態でaddしたときに
歯抜けになった配列を埋めるようにaddされるか
歯抜けになったのをソートして埋めることって出来ない? >>766
いくつかaddして
listとは関係なく外部でclassを解放した場合
歯抜けになるでしょ その外部でclassを解放するって具体的に何のクラスのどのメソッドを呼んでいるんだい >>768
解放したいんじゃなくて
解放されて歯抜けになったとこにaddするか
ソートして歯抜けを埋めたいんだって dipose呼んだらゾンビになるだけでそいつはそいつだぞ まあ、いいや
超常現象でnullになるとしよう
Addに自動で隙間を埋めるような介護機能はない
IndexOfでnullの場所を探すのみ >>764
何を言ってるのかよく分からないけど、
Program.csにProgramクラスとTestクラスを作るのと、Program.csにProgramクラスTest.csにTestクラスを作るのは同じ
どっちでもいいけど普通は後者かな
ただ、以下のようなインナークラスにはするなってこと
static class Program{
...
public static class Test{}
} >>778
よくわかってなくてすみません
ただ、まさにインナークラスになる記述です
具体的に避けるべき理由を教えて頂けませんか? >>769
classがオブジェクト参照を意図するなら、Listが持っている時点でインスタンスは解放されない
Dispose()はアンマネージリソースといった“メンバーの解放”でインスタンス自体を解放はできない
GCは強参照されていないインスタンスしか解放しないので、明示的に代入しない限りnullに成りようがない
ひょっとしてやりたいのはこういう事か?(※機械翻訳のようで日本語が不自由
https://docs.microsoft.com/ja-jp/dotnet/standard/garbage-collection/weak-references
IDisposableに処分済みインターフェイスは無く、ObjectDisposedExceptionを投げるクラスは独自の内部フラグ >>779
関係ないクラスを一緒くたに管理しないほうがいいってこと
マシン設定ならマシン設定
データベース設定ならデータベース設定
権限管理なら権限管理
アイコン管理ならアイコン管理
プログラムは1つ1つ関心ごとに分けて後で組み合わせるのが基本
設定項目も一緒くたにしないで個別に設定クラスを作る >>779
アクセス名が長くなるから外に出せば見栄えが良くなる。
public staticだから動作には関係ない
ここで何でも聞いて気にするより動かしてみて確認したほうがいい >>779
Programのデフォルトの公開範囲がprivateだから
って思ったんだけどクラスって省略されるとinternalなんだね
じゃあ別にやってもいいかな
ただ、各フォームから起動元であるprogramクラスにアクセスするのは違和感があるからインナークラスは推奨しない
よく言われるグローバル変数にせず、フォームの起動時に引数で渡せばいいと同じレベルの話だから余り気にしなくていいかも >普通はVSのフォームデザインでプロパティからApplicationSettingにてPropertyBindingを行う
これはどういう意味や?
バインディングってのはデータソースがコロコロ変わる時に便利なだけだろ。何でグローバル変数みたいな
変わらんものに「普通は、、、、使う」なんて言いきれるんだ。
意味わからん。 グローバル変数(static変数)なんて難しすぎる機能は初心者には扱いきれないでしょう
普通にコンストラクタやメソッドに必要なものを渡していけば確実、安全、簡単だよ
var loginForm = new LoginForm();
loginForm.ShowDialog();
var loginUser = loginForm.LoginUser;
var loginService = new LoginService();
loginService.Login(loginUser);
var systemInfo = SystemInfo.Read();
var databaseModule = new DatabaseModule(loginUser, systemInfo);
var authModule = new AuthModule(databaseModule, loginUser, systemInfo);
var domainService = new DomainService(databaseModule, authModule);
var iconManager = new IconManager("url://to/icon/resource/base");
var formFactory = new FormFactory(databaseModule, authModule, domainService, iconManager, loginUser, systemInfo);
Application.Run(formFactory.CreateMainForm());
loginService.Logout(loginUser); 設定値と処理を密にすると
設定値集Aと設定値集Bとか異なる設定で動かさなきゃいけないときにウザいよ
それを消そうとするとグローバル変数は消えるけど
仕様でそういったもんが別にいいなら問題は起きない
環境変数みたいにインストール時に固定なんだよ的な >グローバル変数(static変数)なんて難しすぎる機能は初心者には扱いきれないでしょう
何を根拠に難し過ぎるというのか意味不明だ。
複雑だからか? どう複雑なんだ? 複雑なわけない。w
他に難しい理由があるのか? 誤動作するからか? するわけない。w
ちゃんと理由を上げて説明してみろよ。 >>758-760、>>762
ありがとうございます
参考になりました。頂いた内容で再検討してみます 入力可能なコンボボックスの値を取得したい。
ドロップダウンで選択した値を取得する事は出来た。
手入力した値を取得するのはどうすればいいのでしょうか?
https://i.imgur.com/Xh6vU1X.jpg ググったら
selecteditem.tostring()でやってるのが多いけどそれだとどうなの? >>791
こうですか?
if (comboBox.SelectedItem != null)
//cb = ((ComboBoxItem)comboBox.SelectedItem).Content.ToString();
cb = comboBox.SelectedItem.ToString();
else
//comboBox.SelectedIndex = -1;
cb = comboBox.Text
}
値の前にこんな文字も取得してしまいす
System.Windows.Controls.ComboBoxItem:
if〜で選択した値は取得できてます。
else〜で手入力した値を取得したいのですがうまくいきません。 >>790
何が聞きたいのかもっと明確にしないと誰も答えようがないと思うw
説明が下手なら(たぶんそうだと思うがw)人に冗長だと思われることをいとわず
くどくど馬鹿丁寧に書いて 編集可能コンボボックスを編集してSelectionChangedイベント発生するか? >>792
cb = comboBox.Text
これだけで良くない?
if elseで分岐させる意味よく分からない >>794
しないね。
>>790
KeyUpイベントでComboBoxのTextプロパティを読めば良い。 killfocus的なイベントで取得しねーとあれっしょ? >>795
そうすると、値を手入力したときに、選択した項目の値がおかしくなるんです >>797
そこら辺はケースバイケースかな。
>>798
WPFみたいだから、そのイベントは無いぞ。 >>798
これは駄目でした
private void comboBox_TextChanged(object sender, TextChangedEventArgs e)
{
String cb = comboBox.Text;
} そもそもコンボボックスでリストにない値を使うやり方がおかしいんですかね? <ComboBox x:Name="cb" IsEditable="True" TextBoxBase.TextChanged="cb_TextChanged" />
private void cb_TextChanged(object sender, TextChangedEventArgs e)
{
var text = cb.Text;
} >>805
おぉ、そんな使い方が。
>>798
すまない。>>800は間違いだった。 >>805
出来ました。ありがとうございますm(_ _)m >>807
スマホで撮った画像を上げるのはよくない
コードを貼れ
画像を貼るにしてもwindows標準のsnipping toolで必要なところだけ切り取ってアップしろ >>808
すみません
PCでここを開けなかったもので…
画像サイズもデカすぎました
次から気をつけます そんなしょうもないことに上から目線で偉そうにいう馬鹿に謝る必要ないのにw 一歩引いた視点からスレを冷静に観察できる俺カッケー StreamWriterでファイルの末尾へ書き込む場合、
ファイルのサイズは書き込み速度に関係しますか? >>818
回答でいいんですよね?
そのようです。ありがとうございます なんでだろうね?
関係しそうな気がするのに不思議だよね 逆にどんなファイルシステムなら影響が出るのかそっちの方が気になるよw ただのラッパーだから分からないが正解。Streamに依存するが正解。DATならまあ遅くなるわな。 そうかな
CMTだろうが穿孔テープだろうが関係ないと思うけどw 関係ないよw
メディアの問題というよりファイルシステムの問題
シーケンシャルにしかアクセスできないからシークが遅いとか、そもそも追記ができないとかいう話なら分かるが、
追記可能なのに書込み速度がファイルのサイズに影響するファイルシステムってちょっと思いつかん >>825
記憶媒体がどういう仕組みで記憶してるのかよくわからないから
メモリみたいなの想像してみた
追記に足りない領域しか空いてなかったら再確保するんじゃね?みたいな 業務アプリばっかりやってきて最近のトレンドに全くついていけてない老害に教えてやってほしいのですが、
●やりたいこと
WPFアプリ、SQLite(最新)を使用、EntityFrameworkで実装したい
DBはそれほど複雑でなく、せいぜい2つのテーブルをjoinする程度、あとは、各テーブルをCRUDする感じでサンプルに毛が生えたようなレベルです。
.NETのバージョンはv4.6.1とした場合、
どのパッケージを使用したらよいだろうか?が知りたいです。
参考にしたいな、と思った記事は、
https://qiita.com/massu/items/b2546a0d876e207de882#%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90
SQLiteで簡単にEFできるかな?と思ってコードを眺めていました。
だが、パッケージ名で.NET Coreを使用するように見えてしまい、
WPFで使っていいの?など何が何やら、、、
本人のバックグラウンドとしては、v3.5程度までの業務コーディング知識は
あるつもりなのですが、なかなか最近の技術、名称についていけておらず。。
最近のトレンドに乗りつつ、知識をつけつつ開発したいと思っています。
ちなみにこのアプリは業務使用ではないのです >>829
まずはこの辺の誤解を
・WPFは最近のトレンドなどではなく、とっくの昔に死んだ技術である
・EFはサーバー用のオーバーヘッドが極めて大きいフレームワークであり、デスクトップアプリで使うものではない 一番大きなギャップは、今の.NET界は完全にWebに傾倒していて、コミュニティの話題や新しい技術はほぼ全てWebであるということだな
デスクトップアプリなんか完全に時間止まってるから.NET 3.5の知識だけで全く問題ないよ >>831
>EFはサーバー用のオーバーヘッドが極めて大きいフレームワークであり、デスクトップアプリで使うものではない
ソース >>831
「死んだ」の定義を
トレンドでないというのはその通りだが >>825
抽象度の違う話だけどフラグメント化の状態によってはファイルサイズが大きくなると書き込み速度遅くなるよね? WPFが生まれた時からずっと疑問なんだが
これって覚えたほうがいい技術なのか?
すぐ主流になるだろうからそれから乗り換えようと思ってもう何年もたつんだが まぁWinFormsよりはマシじゃねえかなという感じ MSはhtmlとjavascriptでデスクトップアプリを作るPWAに手を出し始めた
C#自体がどうなるか不透明にになってきたね xmlでシリアライズするときに、配列のタグに番号を付与していくにはどうしたらいいのでしょうか >>844
なんか勘違いしてるみたいだが、PWAはWebアプリだぞ
今時ガワで何でもやるアプリなんてほとんど無くて、重要なのはWeb越しにある裏側の仕組みだ
つまり、PWAサポートするからバックエンドをVSやAzureで作ってね、ということ
そして、MSはC#を最重要なWebバックエンド開発言語として位置付けている
今更デスクトップアプリなどという時代遅れな技術を使いたくない、Web技術で全部作らせろ、というニーズは.NET開発者からも多いんだぞ?
今時C#=Winデスクトップアプリ向け、なんて言ってるのは10年遅れ >>847
C#の強みは、デスクトップとwebが同じテクノロジーで構築できることだろうし
ソレが崩れたらバックエンドの代わりはいくらでもあると思うんだわ
javaでもphpでもrubyでも >>848
今時Webできない開発者なんかいない(そうでない連中はどうせ新しい物買わないし先細りだし放っといてもMSから逃げられないから餌をやる必要がない)
MSから見ればそこに拘る意味がなくなってるんだよ
今の.NETプラットフォームはAzure含めて純粋にWebプラットフォームとしての使いやすさで勝負していて、
十分に競争力のあるものになってるし実際大成功してるよ 見様見真似で勉強始めたばかりの初心者です
以下の記述でerror CS0234が出まして、ここから学習が進んでません
class test001:System.Windows.Forms.Form
{
static void Main()
{
System.Windows.Forms.Application.Run(new test001());
}
}
スクショttps://dotup.org/uploda/dotup.org1474023.jpg.html
各単語の意味もわかってませんが、
空のウィンドウが表示されるだけのソースのつもりで書いてます
1.基本的にこの記述は間違っているのか
2.error CS0234の対処法ググるとVisual Basicの設定方法がヒットするんですが、
メモ帳とコマンドプロンプトで制作してる者としてはどう対処すべきか
(取り急ぎ開発環境導入しますが、メモ帳だけでやってる方もいるらしいので)
以上2点ご教示願います >>850
どんな環境で何を見て始めたのか知らないけども、
VSならプロジェクト作成から「Windows フォーム アプリケーション」を選んで実行すれば、
空のウィンドウが表示される
初心者ならコマンドプロンプトで作らなくていいんじゃね? >>850
初心者がIDE入れないでやるのは自殺行為
自称上級者でもメモ帳ではまあまともにアプリなんて作れない
IDE入れる
本を買って来て手順を踏む
5年たったらメモ帳でアプリ製作に挑戦 c#はどの場面でもメインにはなれないけど隙間隙間でやっていくだろう >>850
おそらくSystem.Windows.Forms.dllへの参照が埋め込まれていないんじゃないかと
うちの環境だとIDE入ってるせいかSystem.Windows.Forms.dllへの参照は勝手に入るが
コンパイルエラーコードはこの辺りに纏まっている
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/CS0234
といってもVSはVSでエラーコードに関してヘルプをBingで検索しだす奇天烈仕様 azureの知識とかどうやってつければええのですん? 回答ありがとうございます
実際の対策としてVS導入はするつもりですが、
知識欲として、参照が埋め込まれていない状態をIDE介さずに解消するのは難しいのでしょうか? >>857
コンパイラスイッチで参照追加すればいいよ >>848
> javaでもphpでもrubyでも
よりによってなんでそんなアホな選択肢なんだよ w > 今時Webできない開発者なんかいない
Webやってるのって少数派じゃねーの。使い捨て技術者のイメージ。 >>857
ビルドも通らない人間が気にするこっちゃないよ >>861
そんなことはないでしょ。
でも、ドリーマーが多いのは確かだと思う。
なにせ20年ずっと「UIはHTMLの時代になる」って言い続けてるんだからw >>857
csc test.cs -r:System.Windows.Forms.Dll
でもできない? でも正直なところ一般人の目に付く範囲のアプリってoffice除いたら
大体htmlで構成されてるものが多いんじゃないか
そうじゃなくてもネットワークがないと何も始まらない WEB技術なんか追いかけてたら廃人になると思う
フレームワークが使い捨てだもんな Webの特にフロントエンドはひどすぎるな。JavaScript。
生産性の低い道具を使って仕事たくさん生み出そうってことなんだろう。
俺もReactだけは勉強したけどさw
去年のQiitaアドベントみると去年はVue.jsだったのか?ww
アホすぎ 業務系はレイヤー分割下手くそな初心者みたいなSE, PGばっかりだから
フロントを入れ替える=全改修みたいな悲惨な事になるから、頻繁にフロントを変えるって発想ができないんだろう
ここにはどうしても高い文明の壁があるから分かり合えることはない ちょっと流れてしまいましたか、貴重な意見ありがとうございます。
教えていただいたページで勘違いしていたところがスッキリしました。
WPF登場してから時間が立っているからか、古く感じてしまうのは仕方なしなのかな、と思う一報、クライアントアプリを扱う現場ではまだまだ全盛、WinFormも負けてられない勢いで使われているとおもいます。
また、一部、EFはサーバーサイドで…と言う意見もいただきましたが、クライアントでも、問題ないですよね、多分。
というか今回の質問としてはwebでないので3層は意識せず、でもUIとロジックの分離、その先の責務の分離を考えると、良い方法かな、と思いますが…じゃあEF使わないんだったら、どうしよう、constでクエリ定義してDataAdapterにぶっ込む…なんてしたくなかったですし。。。
もう少し調査は必要かもですが、ちょっとやってみたいと思います。 >ここにはどうしても高い文明の壁があるから分かり合えることはない
例えばどんなところが「高い壁」といえるんだ? アセンブラの理解を必要される世界は土人の世界と言える。 高いか低いかそれすらわからない。要するに何もわからないという壁だな。w 本人にとっては高い壁なんだから放っておいてあげなよ アセンブラの理解ってか、論理回路を理解するかどうかじゃね?
ちょこっと弱電をかじれば、なんとなく理解出来ると思うけども >>875
おまえがなんとなく理解出来るんなら大体の人は正確に理解できんじゃね? アセンブラは何とか成るけど、そのまま16進数打っていた奴には敵わんかったわw
いくら8ビットで命令少ないからって常人が出来るものじゃない >>876
ソフトの原理を理解していれば、
電気回路も大体理解出来るよ。 >>877
こういう話で 8086 のバイトコードを丸暗記していたという話はきいたことがないね >>880
Z80はアドレッシング・モードが簡素なので、手計算でジャンプ先の数字セットできるけど
68とか86辺りになると人の手に負えないからね >>877
命令が少ない上に、規則があるから簡単だよ。
それより、2、30人の家の電話番号覚えてた方が驚異的。今はもう絶対無理w Task taskA = Task.Run(async () => {
int count = 60;//6sec
while (count-- > 0) {
Debug.Print("sw0:" + sw.ElapsedMilliseconds.ToString());
await Task.Delay(100);
Debug.Print("sw1:" + sw.ElapsedMilliseconds.ToString());
}
} );
taskA.Wait(5000);
5秒で一旦止まるように見えるが、暫くするとまたタスクは回り始める。C#バグかよ。 しかもUIは5秒間止まってしまう。TASKの意味ないよ。書き方を間違ってるんだろうか? ちなみUIを止めたくなければtaskAをawaitすれば良いはず >>886-887
何だか良く分からないけど、どうみても6秒以上掛かるコードだし
Wait()はタイムアウトしても終了させないし、待機時間ブロックする
UIスレッドでしたら固まるし、awaitは解放したいスレッドで使う物だよ >>886
思い違い
WaitでGUIのスレッドを使って待機してるのでGUIはその間動かない
5秒たつと待つのをやめてそのまま進む
そのtaskはタイムアウトでは止まる用には設計されてない >>888
上はFormに貼り付けたボタンイベントで実行してるだけ。それなのにボタンを押したら
5秒間フォームが固まる。w 次はasync voidで定義してなくてエラーになる質問が来ると見た >>891
サンプル見て書いたつもりだったが、間違いでしたか?
Asyncが非同期処理を宣言するような機能で、Awaitは解放するスレッドに付けるのだから、Task.Delay(100)を
解放してUIに戻す.つまり100msec待ちながらもUIに制御を戻すってことではないのか? >>895
UI止めたくなければこうやで
taskA.Wait(5000); ⇨ await taskA; >>895
Taskはスケジューラを指定しない限りワーカースレッドで動くよ
その非同期ラムダでawaitしてもワーカースレッドが解放されてるだけ
UIスレッドで非同期待機するなら作成側を非同期メソッドにしてawaitする await/asyncはネットに碌な例がないからしゃーないわな 間違った理解
awaitがあるとUIに制御を戻す
awaitがあるメソッドに出会うとUIはその場で対象のメソッドの終了を待つ
2番目が特に誤解を招きやすい >WaitでGUIのスレッドを使って待機してるのでGUIはその間動かない
>5秒たつと待つのをやめてそのまま進む
GUIのスレッドを使って待つの当然でしょ。それが目的だから。だめなの?
じゃあどこで待てばいいのだ?
void ボタン_Click(){
TaskAを実行(起動);
TaskAの完了を待();
}
処理の流れはこうだけど、これは駄目ってこと? じゃあどうするの?
void ボタン_Click(){
TaskAを実行(起動);
}
どっか別のところで、例えばタイマー割り込みで
TaskAの完了を待();
ってことか? 流れがわかり難いので不細工だよな。「シーケンシャルに流れを書いて且つUIが
止まらない」というようになってないと駄目だろ。 ちょっと語弊があるな
間違った理解
awaitがあるとUIに制御を戻す
awaitがついたメソッドに出会うとUIはその場で対象のメソッドの終了を待つ
2番目が特に誤解を招きやすい >>902
やっぱり君か
間違ってるのは自分なのに文句ばかりだな >>902
>GUIのスレッドを使って待つの当然でしょ
違うね
GUIのスレッドを戻してあげないとGUIは他の仕事ができない winformsで非同期やってた時、デバッグとリリースで動作が違くてはまったなぁ
CheckForIllegalCrossThreadCallsは絶対に許さない >>906
確かそれ挙動は同じなんだけどデバッグ時はIDEかなにかにスレッド渡す奴だっけ? >>902
いやだから…そのWait()の代わりにawaitをUIメソッドに書くんでしょうが…
そうすれば一旦スレッド制御を返し、Taskが終われば取り戻し再開してくれる
レガシーな書き方だってTaskScheduler.FromCurrentSynchronizationContext()を指定して
ContinueWith()すれば良いし、UIコンテキスト取得しといてワーカースレッドから投げても良い >>908
こいつをTrueにしないと別スレからUI触った時に例外を吐いてくれなかったはず。デバッグで動かしてるか否かで初期設定が変わる。
だいぶ昔だから間違ってたらゴメンね。 >Taskはスケジューラを指定しない限りワーカースレッドで動くよ
>その非同期ラムダでawaitしてもワーカースレッドが解放されてるだけ
>UIスレッドで非同期待機するなら作成側を非同期メソッドにしてawaitする
言ってることの意味がわからない。Async()=>{}にしてるでしょ。
しかもこのラムダはRunが確保したスレッドプールで動作してるんでしょ。意味的にそうでないと
可笑しい。でラムダのその中でawaitしてるんだから、、、、って
UIスレでボタン受付
スレ4000でラムダ起動
AWAITでスレ4001にスイッチして100msec待つ
100msec完了でスレ4000に戻る。
スレ4000でループ
Task.Wait(3000)はUIスレでスレ4000の終了を待ってる。
ここで待ってる限りUIは止まるってことね。
そういう意味か? 何となく解った。 まぁ別スレからUI触るなクソ野郎と言われればその通りなので、当時の俺が悪かったのは間違いないのだが。 >いやだから…そのWait()の代わりにawaitをUIメソッドに書くんでしょうが…
そういうことね。解り申した。 ちなみに非同期の勉強ならasync/awaitよりも
生threadから始めた方が良いと思うんですが? あんまり実践で使うことないな
基本的にスレッド必要なときってメソッド内で終わるほど準備ヌルくないし
簡単な機能使って実装すると大抵バグってる ま非同期など定形を何本か覚えたら、ソレ以上凝ったことしても大して効率上がらんのよね たまにはBackgroundWorkerさんのことも・・・
ううん、忘れていいw クライアントアプリならイベントハンドラでの await Task.Run だけ覚えてそこから先は全部同期でいい
WebだとTPL Dataflowとか CancellationToken とかまで踏み込んで使いこなさないとあまり意味ないけど >>920
>そこから先は全部同期でいい
は下手に非同期使うと不味いことあるの? >>921
そもそも勘違いしてるみたいだが、asyncはオーバーヘッドが大きいから一般にはなるべく使わないほうがいい。
じゃあWebではなぜ逆に非同期を全面的に積極的に使うかというと、
多数のリクエストを同時に処理するときのスレッドプールの消費を抑えることでメモリ使用量を低減できるから。
クライアントアプリなんか必ず同時に一人しか使わないんだから、UIのイベントの度にRunしても全く問題にならない。 >asyncはオーバーヘッドが大きいから一般にはなるべく使わないほうがいい。
これが独自研究の独自理論 個人的には非同期IOのシナリオの場合ならクライアントでも積極的に非同期使うようにしてるにゃ そもそもなぜ非同期なんかにしたいのか?
すっげー不具合増えそうだしぶっちゃけやるんじゃねーよ
ぶっころ >>926
> 結論 – 非常に短いメソッドにasync/awaitを使うことを避ける、あるいはきついループ内でawaitステートメントを持つことをを避ける
使い所を間違えるなとしか書いて無い。
「一般にはなるべく使わないほうがいい」とか、曲解だよ。 >>930
じゃあ言い換えようか?
複雑になる、オーバーヘッドが増える、それをペイするだけのメリットはない。
GUIをブロックしないという超重大な目的さえ達成できれば十分。 >>920
クライアントアプリならREST API叩くのもごく一般的だと思うが、それも全部同期でやるのかい? >>932
理解してないのは君だけ
イベントハンドラでだけawait Task.Runしてその中は全部同期でやれって話だぞ var cant = new System.Threading.CancellationTokenSource();//なんじゃこれは?
Task taskA = Task.Run(async () => {
int count = 60;//6sec
while (count-- > 0) {
〜処理
cant.Token.ThrowIfCancellationRequested();//例外発生
}
}, cant.Token );
何じゃらほい? 大したことできんのにたいそうな名前を付けやがって笑える。普通にflg使ったらいいだけだろ。 >>934
何が面白いのか知らないけど、同期でREST APIを呼ぶケースなんて普通にあるぞ
>>936
正しい非同期メソッドは必ずCancellationTokenを引数として受け取る
そして、非同期メソッドからさらに別の非同期メソッドを呼ぶときには引数にcantを渡す
そうやって共通のCancellationTokenを引き回すことで、別の非同期メソッドを呼んでる間でも待機状態を確実にキャンセルできる
同期ならabortすりゃいいだけだけどね これってどういう意味があるの?単純にフラグを叩けばいいだけだろ。大して利点があるようには思えんが?
ManualResetEventの代わりにflg=Flseで初期化しておいて、setのところでflg=trueにして、
while(!flg);で待機したらいいだけではないのか?
var waitHandle = new ManualResetEvent(false);
Task.Run(() => {Thread.Sleep(2000); waitHandle.Set(); });
Console.WriteLine("Wait");
waitHandle.WaitOne(Timeout.Infinite); 100msecのタイマー割り込みの中でこういうのを順番に実行する。
void timer1(){
switch( state){
case 0:
if( do1() ){state++;}; break;
case 1:
if( do2() ){state++}; break;
case 2:
if( do2() ){state=0}; break;
}
}
何かもっとスマートな書き方はないか? stateがマジックナンバー感があるので、配列よりDictionaryクラスっても、
でも賛否両論です。 Stateを使いたくない。
while(1){
while(!do1()){ wait(100);}
while(!do2()){ wait(100);}
while(!do3()){ wait(100);}
}
こんな感じでなんかいい書き方は? >>944
state++;
if(state>2)state=0;
ってやればスマートにならね? >>947
doの処理ステップによって遅延がでてこない? >>949
遅延は無視できるレベル。
>>948
ならない。というかStateは使いたくない。 >>944
ネタっぽい質問だけどこんなのでも作るとか
public class RoundRobin
{
int index = 0;
RoundRobin(params Action[] jobs)
{
if (jobs == null || jobs.Length == 0) jobs = new Action[] { () => { } };
this.Jobs = new ReadOnlyCollection<Action>(jobs);
}
public ReadOnlyCollection<Action> Jobs { get; private set; }
public void DoNext()
{
Jobs[index]();
index = ++index % Jobs.Count;
}
}
余談だけど、組み込みか何かの人?
タイマー割り込みてw どんどんソースが長くなる不思議。タイマー割り込みを馬鹿にしてるからだな。 まあ、動いてるならスマートにする必要ってないよな
普通に記述してそれがイモっぽいなら
そりゃ言語がイモなんでしょうがないんだよ stateいらないとか、テストやデバッグするときstateが分からなくなるのに。
マルチスレッドや同期を書かせたらいけない人。 Timer1のなかにステートマシンつくったらなんでもできるけど、わかり難いだろ。
フローチャートのように上から下へ自然に流れる方がいい。 >>952
var cts = new CancellationTokenSource();
Task.WhenAll(
Task.Run(() => EventLoop(cts)),
TimerLoop(cts.Token)
).Wait();
こういう書き方を見るにつけ、なにかいい方法はないかとつらつらと考えてる。 あとはこんなの
IEnumerable<Action> JobSequece()
{
while (true)
{
yield return () => { ... };
yield return () => { ... };
....
}
}
async Task RoundRobin()
{
foreach(var j in JobSequece())
{
await Task.Run(() =>Thread.Sleep(100));
j();
}
}
タイマー割り込みって言葉使うのはHW直接いじる超低水準のコード書いてる人か
80年代マイコン少年のおじさんだろうねw >>958
WhenAllをよく使う人はTPL Dataflowを覚えたほうがいい C++ならTimer割り込みって言葉は普通につかうぜよ。 本を読みながらUnityでC#を勉強しているのですが・・・
それぞれのコードの最後の行にあるnewは何をしているのか教えて下さい。
public class ArrowGenerator : MonoBehavior {
public GameObject arrowPrefab;
float span = 1,0f;
float delta = 0;
void Update()
this.delta > this.span) {
GameObject go = Instantiate(arrowPrefab) as GameObject:
int px = Random.Range(-6, 7);
go,tansform.positon = new Vector3(px, 7, 0);
}
}
}
他にも
public class IgaguriController : MonoBehavior {
public void Shoot(Vector3 dir) {
GetComponent<Rigidbody>().AddForce(dir);
}
void Start() {
Shoot(new Vector3(0, 200, 3000));
}
}
長いので分割します。すみません。 それぞれ最後の行の、
go,tansform.positon = new Vector3(px, 7, 0);
Shoot(new Vector3(0, 200, 3000));
このnew演算子?は何をしているのでしょうか?
それぞれVector3というメソッドが直後のカッコの中の引数を渡していると思うのですが
その手前のnewが何なのかわかりません
クラスをインスタンスにするときに使用するnewとは若干形が違いますよね
いくら調べてもこの形のタイプのnewが出てこなくて・・・。
どなたか宜しくお願いします・・・。 ああ・・・空白が埋まってしまっていてとても見づらいですね
本当にすみません >>966
いや、見た通りやよ
Vector3クラスのインスタンスを作成しつつ代入しとるんや メソッドではなくクラスですね。
newは
クラス名 変数 = new クラス名()
の形しか見たことなくて・・・
上は
Vector3 go,tansform.positon = new Vector3(px, 7, 0);
という風に頭にもVector3 を付けないのですか?
下は
Shoot(Vector3 ABC = new Vector3(0, 200, 3000));
といった風に、ABCの様な変数は表記しないで、クラス名にnewを添えただけでも
クラスをインスタンス化できるのでしょうか?
>>970
一応、上のは入門書に書いてあるコードなのですよね
入門書が不親切なのか私に応用力がないのか・・・後者っぽいですね
他の入門書も調べて買ってみます コードを形で覚えてるのかなぁ
式という概念は分かるかな? >>971
コードがタイポってる気がするが、上はフィールドへの代入だから
TransformクラスでpositionはVector3Dであると既に定義されている
下はコードにメソッド定義も含まれていて仮引数の型が書いてあるよね
変数宣言の型指定であって、インスタンス化には代入を伴う制約はない
未初期化の変数は参照できないから殆どは宣言時に代入もされるけど
それぞれの字句に切り分けて意味を把握しないと歪んだ理解になります >>974
とても詳しく教えて頂きありがとうございます
そういうことなのですね・・・やっと少し理解できました
意味を捉えようとは思って勉強していたのですが形で覚えていたんですね
1単語?ずつ意味を捉える様に意識してみます
皆さん変な質問にお答え頂きありがとうございました! Vector3 vec; 変数定義
vec = new Vector3(1,3,2); インスタンス生成後、変数に代入 処理の結果を返してくれるapiで、例えば
貼り付けるテキストを決める
フォント名設定
色設定
文字の大きさ設定
なと細かくapiを呼び出ししないといけない場合でも、結果を受け取る変数はやっぱり使い回ししないほうがいいですか?その変数はapi呼び出したあとエラー確認するだけです 個人的には、
異なるインスタンスなら原則使い回さない
インスタンスが同じなら使い回す >>977
そもそも変数いらんのでは?
if (api.Foo().HasErros) return;
if (api.Bar().HasErrors) return;
... >>978-980
ありがとうございます。
変数を使用しない方法もありますね。ただメソッドは引数が多く、文が長くなるため悩み中です pythonで言うデコレーターはC# のどれに辺りますか? C# 修飾子 でググるとC++ 修飾子の記事しかHITしません。 属性(Attribute)
Pythonのデコレータとは違って、それ自体はメソッドに純粋にメタデータを付けるだけの機能なので、
属性を処理するにはリフレクションを駆使する必要がありクソ面倒臭い
フレームワーク作る人のための機能 >>983-985
デコレータ自体を実現しようとするなら厄介よね、一般的なデコレータに相当するもので良ければ
@propertyならC#プロパティがあるし、@classmethodや@classmethodならstatic修飾子で済むんだけど
実装に関わってきそうなのはデリゲートとかかな、Pythonで言えばbound/unbound methodに相当する デコレーターをC#で実現するなら
インターフェース使って素直にパターン実装するか
横断的関心事なら属性使うかのどっちかじゃない?
使いたい目的次第 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 27日 10時間 23分 38秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。