ふらっと C#,C♯,C#(初心者用) Part135
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらない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 たびたびお世話になります。
ラムダ式で作ったスレッドの優先度を変えるにはどのようにしたらよいのでしょうか。
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
単にどちらが大きいか見て
コンソールに大きい方を表示させたいだけです ■ このスレッドは過去ログ倉庫に格納されています