ふらっと C#,C♯,C#(初心者用) Part145

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 1e7b-qjLW)
垢版 |
2019/10/07(月) 20:16:17.93ID:9eyAES450
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part144
https://mevius.5ch.net/test/read.cgi/tech/1563258983/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/11/07(木) 22:58:10.38ID:YpFFJiGZM
EXEもLoadLibrary出来るのよ。
なので関数をexport出来れば、どちらでも使える
2019/11/07(木) 23:09:00.51ID:5UmAe6Qb0
いろいろありがとうございます。
説明ヘタですいません。

https://ja.wikipedia.org/wiki/%E5%BC%A7_(%E5%B9%BE%E4%BD%95%E5%AD%A6)
の上から2番めの図のABで円の端を切り落とした形状です。
任意の半径をしていするとこの形状が表示できるようにしたいのです。
隅っこがAB直線で欠けた円ですね。
2019/11/07(木) 23:10:57.49ID:5UmAe6Qb0
https://ja.wikipedia.org/wiki/%E5%BC%A7_(%E5%B9%BE%E4%BD%95%E5%AD%A6)

貼り付けたら後ろがハイパーリンクじゃなくなってますが、コピペしていただくとwikiのページが開きます。
2019/11/07(木) 23:18:55.53ID:5UmAe6Qb0
やっかいなのは

欠けた円の半径を任意に変更したいのでGraphicPathで円に接する直線を引くのが難しいこと
欠けた円をたくさん描くので、rectangleやgclipでやると隣の欠けた円にも影響を及ぼすこと

なんですよね。
clipならできるのかなぁ。
2019/11/07(木) 23:22:58.14ID:6/qmKr7m0
単純に描画順で回避すればいいじゃん
463デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/07(木) 23:24:51.97ID:nmFTkuxva
>>461
>>455で何がダメなの?
2019/11/07(木) 23:25:47.22ID:6/qmKr7m0
それもできないなら一度
どっかのピクチャーボックス(wpf?winforms?)に貼り付けて
欠けた円を作ったあとで
それを必要な領域だけくり抜いて持って来ればええよ
2019/11/08(金) 01:03:44.16ID:OPBfzRS70
vs2019でc#フォームアプリを作ろうとするとデフォが.net coreなのね
.net frameworkはやたら下の方に出てくるしこっちもデフォはユーザコントロール用だ
2019/11/08(金) 01:52:25.99ID:u/zQOw3qH
>>457
おおーこれです!
ありがとうございます
2019/11/08(金) 07:02:50.73ID:uJPiJMNYM
Properties.Settings.Default を変数dに入れて
クラス内のpublic変数にしたいんだけど
何かうまい方法はないだろうか

記述が長すぎるから短縮したいんだよね
2019/11/08(金) 10:09:55.65ID:q9/Fdf+e0
>>467
>>100
2019/11/08(金) 10:55:00.38ID:l/9rfM6i0
usingは無理でした
名前空間はPropertiesだけで
Properties.Setting.Default のエイリアスや参照は作れないようです

privateだと参照が作れるんですが
publicにするとDefaultが internal sealedで定義されているため
エラーになっちゃうんですよね…
2019/11/08(金) 11:05:14.26ID:gdoQlzgA0
そりゃそうだろ
internalでいいじゃん

using static hoge.Properties.Settings;
で Default.fuga なんて書き方もできるけど
2019/11/08(金) 11:46:56.06ID:QwZEyG0Sd
publicなgetter setterもったラッパーでも作っちゃえば?
472デフォルトの名無しさん (アウウィフ FFcf-tB+Q)
垢版 |
2019/11/08(金) 13:05:04.27ID:3E1/z7K0F
>>461
これじゃいかんのか
http://20100718seko.blog130.fc弐.com/blog-えんとり-43.html
https://どぼん.net/vb/dotnet/graphics/drawrectangle.html#section7
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.graphics.fillellipse
2019/11/08(金) 13:27:02.99ID:GoK8IDZc0
以下のプログラムについて質問お願いいたします。

--- 以下プログラム ---
public static int TwoAdicValuation(ulong x)
  => TwoAdicValuationTable[(x & ~x + 1) % 67];

static readonly int[] TwoAdicValuationTable
  = InitializeTwoAdicValuationTable();
static int[] InitializeTwoAdicValuationTable() {
  var table = new int[67];
  table[0] = -1;
  for (var i = 0; i < 64; i++) {
    table[(1UL << i) % 67] = i;
  }
  return table;
}
--- 以上プログラム ---

上記の TwoAdicValuation メソッドは、
・引数 x がゼロのときは -1 を返す
・それ以外の場合、引数 x が 2 で割れる回数を返す
という動作をするようです。
例えば TwoAdicValuation(2*3*5) は 1,
TwoAdicValuation(2*2*2*17) は 3,
TwoAdicValuation(19) は 0,
TwoAdicValuation(0) は -1 を返します。

しかしプログラムを読んでみても、
何がどうなってそのような動作になっているのかどうしても理解できません。
何かお分かりになることがあれば
どんなことでも構いませんので教えていただけないでしょうか。
どうぞよろしくお願いいたします。
2019/11/08(金) 13:54:06.44ID:bNpOstnB0
Ruby で説明すると、

2進数で、右から連続する、0の数が、2の累乗を表す。
0b は、2進数

0b0101(5) → 奇数

0b0110(6), 0b1010(10) → 2^1

0b0100(4) → 2^2

0b1000(8) → 2^3
475デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/08(金) 13:55:40.06ID:Y8kt1QUVa
>>473
なんか1年ぐらい前にも同じネタがあった気がするんだけど...
コードよく読んでないけど、要するに2進数で見た時に
「値が1の最下位ビットの位置」を求めてるだけだと思うよ。

2進数で2で割ることは右に算術シフトするのと同じなのは分かるよね?
あと、奇数とはbit0が1の数なのも分かるよね?

だから「x が 2 で割れる回数」と「値が1の最下位ビットの位置」は同じになる
476デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/08(金) 14:03:08.97ID:Y8kt1QUVa
>>475
× 算術シフト
〇 シフト

要するにLSBが1になるまで右シフトを繰り返した、その回数を求めてるんだと思う
知らんけど
2019/11/08(金) 15:02:17.09ID:l/9rfM6i0
なるほど因数分解して2がいくつあるか数えるのね
2019/11/08(金) 15:11:25.53ID:GoK8IDZc0
>>474-477

ありがとうございます。
色々と実験してみた結果、
x & ~x + 1 が、x と 2で割れる回数が同じ、
1UL << i の形の値になることがわかりました。

ただ、どうして x & ~x + 1 と 1UL << i が
結びつくのかまだ理解できておらず、
67 で割った余りを計算する理由も分かっていないので
引き続き考えてみようと思います。

もし他にもヒントがあれば教えていただけると嬉しいです。
よろしくお願いいたします。
2019/11/08(金) 15:35:02.78ID:bNpOstnB0
Ruby で作った!

そんな、67 とか、訳の分からないロジックを解析しても、仕方ないだろ。無視すべしw

def func( num )
return -1 if num == 0
# 2進数の文字列にして、逆転して、左から探す
num.to_s( 2 ).reverse.index( "1" )
end

nums = %w(0 5 10 4 8).map!( &:to_i ) # 数値の配列
p nums.map { |num| func( num ) }

#=> [-1, 0, 1, 2, 3]
2019/11/08(金) 16:37:08.11ID:l/9rfM6i0
なぜC#スレにruby厨が?
2019/11/08(金) 16:48:42.14ID:q9/Fdf+e0
>>473
tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
x=1, ~x=254, x&(~x+1)=1
x=2, ~x=253, x&(~x+1)=2
x=3, ~x=252, x&(~x+1)=1
x=4, ~x=251, x&(~x+1)=4
x=5, ~x=250, x&(~x+1)=1
x=6, ~x=249, x&(~x+1)=2
x=7, ~x=248, x&(~x+1)=1
x=8, ~x=247, x&(~x+1)=8

64と67の関係は、16と19, 32と37でも同じ結果が得られそう
ぶっちゃけbrainfuck系のコードなのでビット演算を理解すればあとは忘れていい類だと思う
2019/11/08(金) 16:50:19.91ID:l/9rfM6i0
>>478
わかったわ

x & ~x + 1 は、最下位の1のビットだけ残す計算
ビット反転して1を足すことで、最下位の1まで繰り上がり
他のビットは必ずどちらかが0になるのでandで消える

で、67で割った余りを求める理由は、2^t を67で割った場合
tが0〜63の範囲ならユニークな値になるから
最小サイズの配列のインデックスを返す値として
最も適していたということだな

なかなか面白いプログラムだった
2019/11/08(金) 17:03:13.19ID:N8JdoV2L0
文字列にするとかいう高コストの処理をしないためのアルゴリズムなのに無視すべきとか何言ってんだw
競技プログラムとか触ったこと無いの?
2019/11/08(金) 17:10:37.08ID:n8X47CXXa
>>480
そいつはいろんな所に湧いて出てくる有名人だ。スルー推奨。
2019/11/08(金) 17:10:58.46ID:l/9rfM6i0
>>482を修正

>で、67で割った余りを求める理由は、2^t を67で割った場合

割った余りを求めれば

>tが0〜63の範囲ならユニークな値になるから

tが1〜64の場合だな


かなり洗練されているが読みやすさとしては
仕事で扱うには勘弁してほしいw

ところでまさかこれ課題じゃねーよな?
2019/11/08(金) 18:04:22.31ID:GoK8IDZc0
>>479
ありがとうございます。
Ruby を扱う技術が私には無いので
アイディアだけお借りして C# に翻訳してみたところ、
期待通りに動作いたしました。
ちなみに、他の方から実行速度に関するご指摘があったので
オリジナルと比較してみたところ、私の書いたコードでは
オリジナルよりも 250 倍程度時間がかかってしまうようでした。
とはいえ読みやすさは良いプログラムの重要な条件なので、
場面に応じて使い分けるのが良さそうですね。
2019/11/08(金) 18:04:48.09ID:GoK8IDZc0
>>481-482
大変わかりやすいご説明どうもありがとうございます。

>>481
> xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
>>482
> x & ~x + 1 は、最下位の1のビットだけ残す計算

いただいたアドバイスを元に↓のような実験をしてみて理解できたと思います。
00101100 (44)
11010011 (~44)
11010100 (~44 + 1)
00000100 (44 & ~44 + 1)

>>481
tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
>>482
> 67で割った余りを求める理由は、2^t を67で割った場合
> tが0〜63の範囲ならユニークな値になる
なるほど!実験してみて、確かにそうなっていることがわかりました。
40 人のクラスの中で同じ誕生日のペアがいる確率は 90% 近いと
聞いたことがあるので、なんだか不思議な感じがします。

>>481
> 64と67の関係は、16と19, 32と37でも同じ結果が得られそう
すごく興味深いです。私も実験してみたところ、
1 と 2、2 と 3、4 と 5、8 と 11 という感じになったのですがあってますか?
また、「16と19, 32と37」というのをさらっと書いてくださっていますが、
これは実際に調べてくださったのですか?
それとも、きちんと数学を勉強していればすぐに分かることなのでしょうか。。。
2019/11/08(金) 18:05:15.79ID:GoK8IDZc0
>>485
> ところでまさかこれ課題じゃねーよな?
学校の課題というわけではないのですが、
本来は自力で解くべきものだと思います(汗)
ごめんなさい。。。。
2019/11/08(金) 19:01:19.01ID:bNpOstnB0
>>487
限定された範囲で、規則性があるものは、理論的に説明できないだろ。
ちょっとしたトリビア

355 / 113 = 3.141592 92035

円周率と、小数点以下6桁まで一致するとか
2019/11/08(金) 20:36:38.33ID:83cZSp6a0
コレクションの初期化子で複数を同じ値でまとめて指定する方法はないでしょうか?

Pythonの、l=[False]*100みたいなことをやりたいのですが、
var l = new List<bool> { False, False・・(100個分)}ぐらいしか思いつかず・・
2019/11/08(金) 20:40:33.49ID:3NnH1vyN0
>>490
Enumerable.Repeatでググろう
2019/11/08(金) 20:42:51.62ID:3NnH1vyN0
>>487
16、32、64はビット数
ついになる数はそのビット数の次の素数
2019/11/08(金) 20:45:08.81ID:3NnH1vyN0
ruby君はほんとひどいな
自分が軽く触れそうな話題にだけ飛びついてわからない部分は謎理論で適当な回答しかしない
2019/11/08(金) 20:51:12.72ID:GoK8IDZc0
>>492
> ついになる数はそのビット数の次の素数

レスありがとうございます。
私も最初そのように考えたのですが、
16 の対が 17 ではなく 19 なので
そういうわけではないようなのです。

ちなみに 16 の対が 19 になるというのは
>>481 さんが書いてくださっており、
私のほうでも改めて確認しているので、
間違いではないと思います。
2019/11/08(金) 21:38:06.59ID:3NnH1vyN0
>>494
ほんまやね、すまん
ここらへんは整数論の話だから得意な人に聞けば話は早いんじゃないかな?
フェルマーの小定理から決まるのかな?って思うけど俺自身は整数論詳しくないんで解説できないわ
2019/11/08(金) 22:38:41.75ID:GoK8IDZc0
>>495
レスありがとうございます。
フェルマーの小定理について調べてみました。

フェルマーの小定理から分かることとして、p が奇数の素数のとき、
(2^0)%p と (2^(p-1))%p はともに 1 になるようです。

つまり >>482 さんの言葉をお借りするなら、
奇数の素数 p がビット数 n 以下のとき
t が 0〜(n-1) の範囲で変化すると (2^t)%p がユニークにならないため、
ビット数 n の対としてn 以下の奇数の素数は不適切ということになります。

ただ、フェルマーの小定理は p > n のときに (2^t)%p がユニークになることを
保証するものではありませんし、そもそも奇数の素数じゃなくても
ビット数 n の対としてn 以下の数が適切でないのは当たり前な気がするので、
フェルマーの小定理から直ちに欲しい情報が得られるというわけではないようです。

とはいえ、関連しそうな分野が分かっただけでも大きな前進ですので、
もう少し詳しく調べてみようと思います。どうもありがとうございました。
2019/11/08(金) 22:59:25.16ID:EylFl5WNM
ついでにガロア体も調べると、
QRのコード化で楽になるよ:-p
2019/11/08(金) 23:04:00.88ID:83cZSp6a0
>>491
ありがとうございます。下記でうまくいきました。

var l = Enumerable.Repeat(false, 100).ToList();
2019/11/08(金) 23:08:44.38ID:3NnH1vyN0
>>498
もしfalse限定ならC#のbool変数の初期値はfalseに決まってるからbool配列100個を作るだけで目的のものは作れるよ
trueの場合はRepeatすることになるけど、falseなら配列宣言で済ませたほうがパフォーマンスは良い
100個程度なら微々たる差ではあるけど
2019/11/08(金) 23:10:41.57ID:oRbRRQfv0
>>498のは値型だからいいけど参照型でやると楽しいことになる
2019/11/08(金) 23:27:30.91ID:kn5mNyzW0
値型でしか使ったことなかったけど調べたら参照型は複製してくれないのかよ!
やっぱforループしか信じられねえわ
2019/11/08(金) 23:27:57.31ID:83cZSp6a0
>>500
Pythonで[[0, 1]]*10とかやって、恐ろしいことになったのを思い出しました
今はちゃんと[[0,1] for _ in range(10)]としてますが、C#でも同じですね

それにしてもPythonから移ってくると、C#は難しいですね・・
2019/11/08(金) 23:28:43.13ID:GoK8IDZc0
>>497
レスありがとうございます。

いろいろなビット数 n の対になる数を調べてみると、
必ずしも素数になるとは限らないものの、
調べた範囲では全て p^k(p は素数、k は自然数)の形になっていました。

で、教えていただいたガロア体というのは要素の個数 p^k の集合ということで
ビンゴかと思ったのですが、
どうやら私が考えているのは p^k を法とする剰余環というものらしく、
k = 1 で無い限りガロア体とは本質的に異なるもののようです。

しかし色々と調べれば調べるほどこのあたりの分野から答えが見つかりそうだと
思えてきたので、もう少し頑張ってみようと思います。どうもありがとうございます。
2019/11/08(金) 23:52:22.74ID:3NnH1vyN0
>>501
newするRepeatをGenericで作ればいいよ
whereで値型と参照型分けるようにして作ってそっち呼ぶようにすれば気にする必要もなくなる
インスタンス生成が多くなるようなプロジェクトではよく使う
ゲーム系なんかだと結構使われること多いんじゃないかな?
2019/11/08(金) 23:55:21.55ID:J2B6vaPv0
>>501

LINQ の速度が許容できるなら、こんな感じでやろうぜ。

Enumerable.Range(0, 100)
.Select( i => new CertainClass { ... } )
.ToList();

for 文ダサい。
2019/11/09(土) 05:56:33.04ID:b9xnhqog0
LINQ覚えたてで使いたくてしょうがなくてイキって書いたコードに見えるわ
2019/11/09(土) 08:50:31.29ID:Bvga/TrM0
Visual Studio2019で新プロジェクトを作ろうとしたらWindows Forms App(.NET Core)がさも推奨かのように上の方に出てきますが、
Windowsで使う想定のWinFormsアプリを作る場合も.NET Coreで作ったほうがいいんでしょうか?
2019/11/09(土) 09:05:30.09ID:SXTesUyU0
>>507
言わせんなよ
というMSの気持ちを察しろ
2019/11/09(土) 09:13:38.87ID:pySBQwYBH
ロードマップではこれからcore主流になるんでしょ
2019/11/09(土) 09:36:44.32ID:7/SeOb4dp
CoreってWindowsに標準でインストールされてるの?
ユーザーに別途インストールさせるようなことない?
2019/11/09(土) 10:32:51.34ID:HanEs9+F0
されてないし今のところWUで配るような予定も無いとさ
逆にインストール不要なcoreのランタイムそのものを同梱して配布はできる
2019/11/09(土) 10:38:23.18ID:YXlbcSmw0
>>506

手続型は可読性と保守性が低い。使うなら局所的に、隠蔽して使うのが吉。

どんな場合でも LINQ とは言わないが、データ変換が主な場面ではメソッドチェーンや遅延評価できる LINQ 推奨。
2019/11/09(土) 10:55:47.68ID:Bq7xaXZQ0
ちょっと条件変わったときに途中で引っ掛けにくいよね

あ、ここ、フラグでcontinueいるわ
あ、i%10==0毎に処理いるわ
あ、i±Nまで見る必要あるわ

とか、for文のが圧倒的に拡張性が高い
2019/11/09(土) 11:01:23.16ID:c61Xm8G30
foreachがインデックスも定義できれば
もっと活用の幅が広がるのだけど
2019/11/09(土) 11:15:58.41ID:HanEs9+F0
インデックス付きSelect/Whereとかでええんちゃうの
2019/11/09(土) 11:17:41.47ID:UZitXSsm0
別に i は LINQ でも出来るような気が。
2019/11/09(土) 11:18:29.90ID:aDURcOtda
ループ内を雑に拡張して後で困るのが嫌だからLinqとLinq拡張ライブラリを使う
n件ごと、前後n件なんて頻出処理だしなおさらね
2019/11/09(土) 11:24:19.54ID:c61Xm8G30
>>515
そんなのあるの?
519デフォルトの名無しさん (ワッチョイ 9f2c-E8Ce)
垢版 |
2019/11/09(土) 11:56:21.81ID:Ypm9+s0e0
>>501-502
Ruby でも、ブロック無しで、Array.new すると、同じ参照を使ってしまうが、
ブロックを渡せば、ブロック内で個々のインスタンスを作れる

p ary = Array.new( 2, [ 0, 0 ] ) #=> [[0, 0], [0, 0]]
ary[ 0 ][ 1 ] = 2
p ary #=> [[0, 2], [0, 2]]

ary_2 = Array.new( 2 ) { [ 0, 0 ] }

ary_2[ 0 ][ 1 ] = 2
p ary_2 #=> [[0, 2], [0, 0]]
2019/11/09(土) 12:15:40.62ID:YXlbcSmw0
>>513

設計せずに書き出すダメプログラマー丸出しの発言だな。そうやってできるのは、いちおう動くけどバグが埋れてて、変数ダンプしながらフローを追わないと挙動がわからない可読性の低いコードになるんだよ。

君のいうことは、インデックス付き Select や GroupBy & SelectMany や TakeWhile なんかを組み合わせれば簡単にできるよ。

もともとは System.Linq の Enumerable.Repeat が参照型では Shallow Copy になるってことから始まったのだから Select 使って Deep Copy にすることでいいんでないの。
2019/11/09(土) 12:16:44.81ID:Bq7xaXZQ0
>>520
敗北宣言長いな
2019/11/09(土) 12:32:54.67ID:u1W/mjBNM
>>519
グロ
2019/11/09(土) 13:03:11.11ID:YXlbcSmw0
>>521
根拠なく脳内勝利かよ。
2019/11/09(土) 13:06:18.14ID:46ABhOVc0
>>522
グロって書くと画像のサムネイルをモザイク化できるけど、 Ruby君の発言もモザイクにならないかな。見たくない。
2019/11/09(土) 13:24:32.16ID:XH4+9Keu0
>>524
[Rr][Uu][Bb][Yy]でNGしとけ
526デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 14:14:43.55ID:6EEimGlVa
どこまで本気なのかネタなのかよくわからないけど個人的には>>505は選択しないなあ。
普通にforで回して埋めると思う。
理由は、そのコードを<読む時>に思考力の消費量がより少なくて済むと思うから

(a)
var list = Enumerable.Range(0, 100).Select(i => new Label()).ToList();

(b)
var list = new List<Label>(100);
for (int i = 0; i < list.Count; i++) list[i] = new Label();

一瞬で何やってるか理解できるのは(b)の方。
これは構造化(= パターン認識)の威力。

(a)も十分読みやすいけど、(b)に比べると若干高コスト。
(a)を好むのは多分巨大なコードを書いてメンテナンスしたことがない人だと思う。
2019/11/09(土) 14:30:15.58ID:54kG5N3g0
>>526
慣れだ慣れ
普段使ってる方がしっくり来るだけだ
2019/11/09(土) 14:38:43.64ID:w+/raRA00
普段から書いてりゃ慣れるしLinqの遅延評価が役立つ場面なら積極的にlinqの方を選択する
可読性なんてその人そのプロジェクトで変わる
難読可したコードとかまでいくなら気にするのはわかるけど、この程度の差ならどっちでも良い
他言語から入ってきた人ならlinqが馴染みやすいこともあるだろうし、Cからやってる人ならforが馴染みやすいかもしれない
ただそれだけ
2019/11/09(土) 14:47:42.99ID:Ersh0Xipa
そのコレクションが固定長だったら、だけど
自分だったら
var array = new Label[100];
と配列で宣言したうえで>>526の(b)だな
listをわざわざforループで添字アクセスするのはちぐはぐだし
配列を明示的に使って固定長であることを明示的に表すべきだと考えるロートル人間なので
2019/11/09(土) 14:48:48.43ID:05Upg6UNM
>>526
aのほうが遥かに読みやすい
ある範囲に対してそれぞれ新規インスタンスを選択
してリストにした物
って言葉として読んだまま理解できる
2019/11/09(土) 15:22:31.65ID:SYTZJUM/0
突然

i=>new Label

は厳しい
「i」ってなんやねんってまず思う
2019/11/09(土) 16:06:06.38ID:HanEs9+F0
そのへんは _ にしちゃうなー
匿名の引数では言語仕様としての破棄パターンとみなされる文脈ではないけれど
2019/11/09(土) 16:07:38.17ID:rNsqZ2GJ0
C#というかアルゴリズムの質問になっちゃうかもしれないんですけど
aというテキストファイルがあってそこにはb cという2つのファイル名が書いてある bを見るとdと書いてあって cにはファイル名書いてない
このときaを読み込んで最終的に手元にa b c dの4つのファイル名を取得したい。まぁList<string>に格納される感じでしょうか
再帰で書くんだろうなぁとは思いつくんですが、再帰が大の苦手でどういう終了条件でどういう戻り値の関数を作ればいいのか考えつきません
手助けいただけないでしょうか
2019/11/09(土) 16:40:40.94ID:Xnyz1DqK0
IEnumerable<string> ReadFilePaths(string filePath) { /* 再起なしでファイルパスをすべて読み取る */ }

IEnumerable<string> ReadFilePathsRecursive(string filePath) =>
ReadFilePaths(filePath)
.SelectMany(i => ReadFilePathsRecursive(i))
.Append(filePath)
;


はい
2019/11/09(土) 16:58:20.97ID:jywkcdak0
>>510
ランタイム同梱でexeを配布できるから問題ない
2019/11/09(土) 17:06:05.75ID:4gIYGCYB0
不要な引数は_だね
破棄パターンはまだ言語仕様になってないけど要望も多いし議論も進んでるからそう遠くない未来には入るだろう
すでに導入されてる言語もあるし

俺個人的には526のbみたいなlistなのかarrayなのかよくわからん制御のほうが混乱する
2019/11/09(土) 17:12:48.50ID:MvykJ39t0
>>526
>(b)
>var list = new List<Label>(100);
>for (int i = 0; i < list.Count; i++) list[i] = new Label();

list.Countは0なのでループの中身は実行されない
一瞬で何やってるか理解できてる・・・?
2019/11/09(土) 17:20:28.60ID:YXlbcSmw0
>>526

LINQ が万能ではないことは認める。使う人を選ぶ技術でもあるし。

だが、Enumeration の操作にいちいちカウンタ使って境界テストしなければならなかったり、if, break, continue でフローを追わなければならなかったりするのは、レビュアーや運用・保守者を泣かせるコードになることが多い。

モダンな言語がここ10年のあいだに参照透過性や関数型を追求する方向に進化しているのは、そういう可読性、保守性、開発効率性を意識しているから。

ちっちゃいコードなら手続型で好きなように書けばいいんだよ。大規模開発やビジネスロジックが重要な場面では関数型で書くのが適してる。

まあ、LINQ もあまりやりすぎると読みにくくなるのだが。
2019/11/09(土) 17:41:21.17ID:MvykJ39t0
>>533
aをrootノードとしたツリーとして対象をとらえれば
習ったことを生かせるんじゃないの?
2019/11/09(土) 17:42:32.31ID:05Upg6UNM
>>537
ほんとだ引数capacityじゃん
Linq使っててよかった
541デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 17:47:37.52ID:6EEimGlVa
>>537
ぐぬぬw
2019/11/09(土) 17:53:51.45ID:05Upg6UNM
良いコントだったよ
2019/11/09(土) 18:17:38.87ID:iu4bIs8od
わろたwww
544デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 18:25:40.87ID:6EEimGlVa
MSのDocs(?)の日本語版ってマウスオーバーでオリジナルの英語版が読めなかったっけ?
対応してるページと対応してないページが混在してるのか?
Docsって何やねんw
2019/11/09(土) 19:22:51.64ID:rNsqZ2GJ0
>>534
凄い……いや理解するのに10分以上かかったけど確かにこれで出来てる……
ありがとうございました勉強になりました
2019/11/09(土) 20:24:40.88ID:pySBQwYBH
おまえら天才か
2019/11/09(土) 20:45:25.24ID:RT6p7yxc0
LINQは慣れると意図が読めるけど
forは何のためにループ回してるのかは解りづらくなりがち

数学的な問題や複雑な処理を書く場合LINQの表現力はすごいけど、慣れてない人が理解できるようになるのは大変

LINQやRxなしで同等のコード書くのはもはや考えられない
2019/11/09(土) 20:48:12.46ID:sTrPPJ5/r
プログラマなら普通は逆だよね?

linqというかSQLはただの集合論のはずなのになぜかforの代替で使われたりする
linqはループを隠ぺいしているだけで実際はループしてる
2019/11/09(土) 20:50:43.28ID:sTrPPJ5/r
Linqが本当に集合論を表してるなら途中でエラーがでてもデフォルトで残りの処理を終えるはず
そしてエラー含んだ集合が手元に残るはず
2019/11/09(土) 21:03:01.43ID:XH4+9Keu0
>>547
> forは何のためにループ回してるのかは解りづらくなりがち
流石に
> for (int i = 0; i < list.Count; i++) list[i] = new Label();
の意図がわからないならプログラマーやめるべきだと思うわ
2019/11/09(土) 21:05:00.70ID:aDURcOtda
やりたいことは何かを書いてそれを実現する具体的な方法をライブラリにお任せするのがLinq(宣言的)
やりたいことは何か全くわからないけどそれを実現する具体的な手続きだけは知りたくないことまで細かく書くのがループ(手続き的)

何をしたいのかわからないコードよりしたいことが書いてあるコードのほうが親切
2019/11/09(土) 21:06:24.76ID:d07pJzzX0
>>549
例外で全部ぶった切ってもいいじゃん
決め事の話だからどっちも筋は通ってる
2019/11/09(土) 21:13:08.77ID:6gLEbAuX0
基本LINQでいいかなってなる
List.ForEachは使わんが
2019/11/09(土) 21:16:52.79ID:RT6p7yxc0
>>550
そらそうだな
こんなコード書いて仕事になるやつおらんやろ

>>551
そうそう それが言いたかった
2019/11/09(土) 21:22:32.05ID:XH4+9Keu0
>>554
そりゃこんなコード「だけ」じゃ仕事にならんけど、仕事でその手のコードを書くことはあるだろ
2019/11/09(土) 21:32:36.03ID:sTrPPJ5/r
大体の場合においてやりたいことだけをlinqで書けはしない
普通の処理をすべてLinqに置き換えられるならそれだけでいいが
そんな世界どこにもない


実現不可能な話でlinqがいいなんて現実的じゃない
2019/11/09(土) 21:34:38.32ID:sTrPPJ5/r
標準で書けたところでそれって本当に効率的なのか疑問な場合がある
ループなら一回でmax min両方とれる
linqで標準で書いたとしてMAX MIN二回ループが回る
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況