ふらっと 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/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二回ループが回る
2019/11/09(土) 21:40:24.07ID:d07pJzzX0
基準はシンプル
状態の更新を伴うものはループで書く
2019/11/09(土) 21:45:51.67ID:aDURcOtda
プログラマがヘボでクエリとコマンドの分割がうまくできてないとLinqが綺麗に適用できないことがある
しかしLinqはクエリであることを忘れてはいけない
コマンドで汚染されたループをLinqでは書きにくいと主張するより先にリファクタリングすることをおすすめする

速度最適化が必要な場面はあるが常に速度最適化が求められるわけではない
速度よりメンテナンス性が重視されることの方が多い
2019/11/09(土) 21:46:24.40ID:sTrPPJ5/r
本当に集合論ならループの順番などという概念がない
が実際にはある
MS自体はシーケンス(連続、並び)と言ってるが一部のオタが勝手にSQLと同じ集合論だと言ってるだけ
2019/11/09(土) 21:48:01.22ID:sTrPPJ5/r
どちらとも使えるのが正しい姿で必要に応じて使い分けるのが筋

所がlinq信者は全部lnqでいいforは使わなくていいと言う
2019/11/09(土) 21:55:50.65ID:sTrPPJ5/r
Linqでももともとやりたいことをそのまま表現できるパターンは少ない
それでどちらにしてもコードに落とし込みをする段階がある

処理に応じて手順を分解してコードにする
実際にそれをやるのがプログラムである
手順が分解できない、他人の書いた手順を理解する気がないならプログラムする気がないと言うこと
2019/11/09(土) 22:00:36.64ID:OIyXFfhra
信者うんぬんの前に正しいスペル・大文字小文字でLINQと書けない人がテクニカルなことを主張しても説得力ががが
2019/11/09(土) 22:01:50.43ID:sTrPPJ5/r
説得力などなくていいよ
酒飲んでごろ寝してスマホでかいてるんだから適当だよ
2019/11/09(土) 22:05:04.49ID:sTrPPJ5/r
ああこれwintabだわ
つかいにくなこれw
566デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/09(土) 22:38:55.83ID:6EEimGlVa
>>534
これもイテレーター使った方が読みやすい気がする
IEnumerable<string> ReadFilePathsRecursive(string path)
{
  yield return path;
  foreach (var path2 in ReadFilePaths(path))
    foreach (var path3 in ReadFilePathsRecursive(path2))
      yield return path3;
  }
}
2019/11/09(土) 23:36:14.18ID:MvykJ39t0
循環する可能性を考慮しないのって普通にヤバイと思う
2019/11/10(日) 00:04:25.73ID:oSCFf5ef0
俺社環で{}省略していると糞扱いされるので迷わずLinq選ぶわ
2019/11/10(日) 00:18:01.25ID:jJedryfu0
>>561
LINQ をまともに使っている人は LINQ の得手不得手を知っているから LINQ が万能だとは言っていない。
データ処理の多くの場面ではカウンタ使ってプリミティブに手続書くのは非効率だと言っているだけ。

逆に手続型信者 (老害ともいう) は不必要な場面でもカウンタ使ってイテレーションを書き、コードをいたずらに冗長化するねっていうこと。それに対する有効な反論がない。自分にとっては読みにくいっていう個人的感想ばかりじゃないか。

誰かが言ったとおりこれは慣れだよ。初めは確かにとっつきにくいが慣れる。そして戻れなくなる。

>>562
趣味グラマーならそれでいいよ。だが、ビッグデータやデータサイエンティストの時代になって業務ユーザもコード読むようになったこのご時世。
運用が止まって、下手くそなコード読んでトラブルシュートしなければならない身にもなってみて欲しい。センスない奴が書いたプリミティブな手続をダンプしながらフロー追っかけて修正し、リグレッションテストして、一定時間内に通常運用に戻すのは地獄。

無意味な宗教戦争にしないために、みなさんが前提や目的や利用場面をもう少し明確にすることを提案する。
下請けで隠蔽工程のコーディング担っているプログラマは LINQ のありがたみなんてわからなくても当然。レビュアーや PM や使う人のことを考えず、自分のスキルでとりあえず動くものを行数書いて月給もらえればいいんだから。
2019/11/10(日) 00:23:11.55ID:rujkcJN50
LINQでDB通信タイミングコントロールできなくなって
泣きを見る話は聞いたが
2019/11/10(日) 01:00:17.48ID:jJedryfu0
>>570

LINQ to Entities のことかな?
LINQ to Entities は残念ながらまだ発展途上だね。(もう 10 年にもなるのに。)
業務ロジックも書けなくはないが、.NET プラットホームや DB 実装などへの依存性が強すぎて、かなり工夫する必要があり、汎用性がなくなってしまう。
Select, Where (, OrderBy, Take, FirstOrDefault, Join)くらいしかまともに使えないと思っていた方が無難だと思う。となると DB アクセス回数と無駄なデータ取得が増えることになり、性能が出ない。

また C# 9 あたりで予定されている Records がないとデータ変換ロジックが非常に書きにくい。

.NET 5 になれば期待できるのではないかと思うけど。
2019/11/10(日) 01:09:03.51ID:jJedryfu0
>>557
おっしゃる通り、LINQ は Reduce 系処理の効率性がよくない。そこは工夫する必要あり。

ただ、Aggregate を使えば、一回の走査で Max, Min 両方同時に取れると思うよ。
2019/11/10(日) 12:04:37.46ID:FrBSq/JS0
>>550
やめた方がいいよ
2019/11/10(日) 12:51:05.83ID:Q+o0EoEH0
いいからアプリ作れよ初心者
2019/11/10(日) 14:15:34.99ID:j17ZnuaO0
標準のLINQでは効率的に処理できないなら
効率的に処理できる拡張メソッドを定義してそれを使うべき

流れの中でforやらforeachを使われると可読性が落ちるしテストもしにくくなる
2019/11/10(日) 14:48:47.97ID:Vkpd4679M
そういうオナニーされるとそれこそ読みづらい
フレームワーク作ってるんでない限り、チーム開発で拡張メソッドを自作するのは本当にやめてくれ
2019/11/10(日) 15:27:29.24ID:Fk6O1w1g0
開発組織のコード管理能力やチームメンバーのリテラシーに合わせて判断することだとは思うが
拡張メソッド作れないって縛りプレイはできれば勘弁して欲しいな
2019/11/10(日) 15:45:16.03ID:VGQLXxaqd
拡張メソッド無しはさすがにしんどい
そら上位のnamespaceにstringやらintのextension大量に作るとかやられるのは勘弁してほしいがちゃんと整理されてるなら問題ないじゃん
2019/11/10(日) 16:04:31.99ID:cwUfzKNl0
拡張メソッドを使わないというオナニーではないのだろうか。
2019/11/10(日) 19:59:11.47ID:osonYbcZ0
Linqの構文を本家のSQLに逆輸入すれば良いのに
581デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/10(日) 23:41:53.75ID:Xa0PWm0+0
そういや、Max、Min句が対象とした個別要素を返すってのは酷い気がするな
IEnumerable<T>に対して使った時にT型で返すように何故しなかったのか全く理解できん
2019/11/11(月) 00:31:18.41ID:gP2AYUUm0
多少非効率でもなるべくもともと用意されてる機能や関数を使うのが分かりやすい派です
2019/11/11(月) 02:22:50.36ID:U14XuieM0
MoreLINQ使えばMinBy/MaxByがある
(複数返すからTじゃなくIEnumerable<T>的なのが返される)

リスト埋めるやつもMoreLINQ使えば比較的読みやすい
var labels = new List<Label>().Pad(10, _ => new Label());
2019/11/11(月) 06:43:42.02ID:Ndyau4keM
>>581
そりゃ欲しいのは最大値や最小値なのに複数の要素が返ってきても面倒なだけだし
2019/11/11(月) 08:24:51.18ID:k+N9opvZ0
>>584
ま、その通りなんだけど、581 が言いたかったのは、該当要素 T を返す拡張があってもいいよね、インデックス付き Select とかあるんだからさ、ってことでは?

>>583
有益な情報ありがとう。
2019/11/11(月) 09:41:13.10ID:Ndyau4keM
>>585
そういう拡張があってもいいなと言うならわかるが
> Max、Min句が対象とした個別要素を返すってのは酷い気がするな
と言うのは思慮が浅すぎ
2019/11/11(月) 12:40:24.59ID:bjD92kdR0
generics, trait だろ。
has-a, interface, duck typing など、継承じゃなくて包含

Ruby では、<=> 宇宙船演算子があれば比較できる。Comparable
588デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/11(月) 12:41:25.30ID:W7OxtIUea
どうかな
個人的にはどちらか一つだけしか選べないとしたら>>581の実装の方が合理的だと思うけど

単純にそっちの方が需要多いと思うし、二度手間にはなるが現状の実装は
>>581的実装で代替できる(変換結果の最大値は変換関数から求められる)のに対して
逆はどうやっても不可能だから
2019/11/11(月) 12:47:13.66ID:k+N9opvZ0
>>588
上位互換の方がいいっていうのはわかる。でもそれは LINQ to Object だけを考えた場合ね。

LINQ は LINQ to Entities という OR マッパーも強く意識しているから、標準 SQL 互換の機能も大事であり、どちらか一つという選択を強いるなら現状になる。
2019/11/11(月) 12:47:47.01ID:pQGjPoV1d
別に難しいもんじゃないんだし作りゃいいんだよ
どういうのがベストかが状況によってたやすく変化する処理だと思う
値が欲しいのか要素が欲しいのか、一つで良いのか全部列挙するのか
だから標準としては1回走査で済んでsum等の算術系と同じような入出力になる現仕様を選んだんじゃない?
591デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/11(月) 18:08:06.42ID:FT34EqpP0
なんかよくわからないけど、SQLとの互換性ならTが返ってきた方が遥かにSQLに近いでしょ
2019/11/11(月) 18:48:51.85ID:/nYlZGiNd
??SQLで集計関数使ったら元のレコードはわからんめえ
2019/11/11(月) 18:53:21.43ID:k+N9opvZ0
>>591
わからないなら無理に噛み付かなくていいから。
LINQ to Entities の設計思想と実際の実装がどうなってるのかある程度理解できるようになってから出直して。
2019/11/11(月) 18:57:02.20ID:Xp4ki1TGM
Tを返すと戻り値がIEnumerable<T>になる
流石にそれをMax関数と呼ぶのは抵抗がある
2019/11/11(月) 19:00:34.90ID:oQXr0vGEr
まず最大値を取る
その値を持つ要素の集合をselectする

確かに無駄だな
SQLはどこかで最適化してるのかな?
2019/11/11(月) 19:02:33.34ID:oQXr0vGEr
MAXはMAXだけどそういう用途の関数?があってもいいかもね
というかすでにあるんだろうか?
2019/11/11(月) 19:42:55.85ID:rlOgmRK80
>>596
標準ではない
使ったこと無いけど583が紹介してるものか自作するか
自作しても数行だしググればコードは転がってるよ

個人的にはこういうやつは上げだすとキリがないんで現状で十分かなと思ってる
標準で山ほど用意されても何があって何を自作しなきゃならんかがわからなくなるんで本当に基本的なものだけあればいいかなと思う
2019/11/11(月) 19:55:30.29ID:oQXr0vGEr
LINQじゃなかったら作るのは簡単
599デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/11(月) 20:48:49.06ID:FT34EqpP0
SQLで書けるものはだいたい書けるようなってないと使いづらいよやっぱ
2019/11/11(月) 20:52:24.25ID:S9KO9pzP0
SQLだとストアドあるけど、LINQで書けるの?
インラインビューとかも
601デフォルトの名無しさん (ワッチョイ df2d-tdZI)
垢版 |
2019/11/11(月) 20:54:23.36ID:FT34EqpP0
それは流石にLinqのせいじゃなく、例の変な人が言ってるフレームワーク等で吸収する部分じゃないか?
2019/11/11(月) 21:13:49.74ID:U14XuieM0
>>595
SQLの場合はインデックスがあるから一般的にO(log n)で最大値のキーが取得できる

LINQ標準でMaxByと同じことをやる場合はちょっと効率悪いけどOrderBy使う
O(n)にするためだけにAggregate使った拡張メソッド作るよりも
走査する件数を減らすことを考えたほうがよかったりする
2019/11/11(月) 21:39:19.76ID:ouAhYYgiM
LinqとSqlは根本的に別物なので使い分けろ
当たり前のことだな
2019/11/11(月) 21:40:04.42ID:Ndyau4keM
>>600
DDLもLINQで書けるようにしろとか言いそうな勢いだなw
2019/11/11(月) 21:46:03.84ID:S9KO9pzP0
出来ればやってくる欲しいけどw
■ このスレッドは過去ログ倉庫に格納されています