[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 05/09 20:16 / Filesize : 142 KB / Number-of Response : 443
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【VB.NET】LINQ友の会【C#, C♯, C#】



1 名前:デフォルトの名無しさん [2008/02/09(土) 23:51:34 ]
VisualStudio2008より追加された便利で強力な機能

  統合言語クエリ (LINQ : Language Integrated Query)

ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。


159 名前:デフォルトの名無しさん [2008/05/24(土) 20:45:08 ]
Linqで書くと速くならないなら需要ないんじゃない
SQLでおなかいっぱいで

160 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 21:01:08 ]
>>159
LINQ の価値は速度じゃなくて、
OOP パラダイムと RDB パラダイムの懸け橋になること。
SQL でおなかいっぱいって人にこそ LINQ がいいんじゃないか。

161 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 23:11:23 ]
パラ?
お母さんが子供に教えるように教えてください

162 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 23:23:16 ]
>>161
C# の中で、オブジェクト指向言語の感覚からあまり外れることなく、
データベース問い合わせが書けるってことが大事。

163 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 00:22:26 ]
最初は書き方に戸惑うが、だいたいの書き方がわかってくればインテリセンス使えるのがとても大きい

164 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 04:39:07 ]
コンパイラによる構文チェックが行われるというのも大きい。
条件次第で内容が大きく変わるようなクエリを構成するときに、文字列の連結を間違えて
バグを作り込んでしまうような、つまらないミスを防げる。
DataContextの定義にあわせて自動でCREATE DATABASEしてくれるとか、生産性の向上に
つながる要素がいろいろあるよ。
俺もほとんど把握してないけどさ。

165 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 09:04:21 ]
SQLって、汎用コレクションデータ処理エンジンだね。
C/C++やらで何らかのデータ処理を行う場合、その度毎にアルゴリズムを考え、設計し、
コードを作りこまなくちゃいけないけど。
RDBだと、ちょこっとSQLを定義するだけで実際の処理はRDBのエンジンがやってくれる。
例えるなら文字列の正規表現みたいな感じで。

それが言語組み込みの文法として、RDBだとDBサーバを立て、テーブルを作り、データをインポートして
からじゃないと使えないのが、RDBに限らずC#言語上の任意のコレクションデータで使えてしまう
ってのは便利。

166 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 09:41:44 ]
>>161
インピーダンスミスマッチでぐぐれ

167 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 11:12:57 ]
SQLMetalってすでにあるテーブルのオブジェクト定義のXMLを生成するものだよね?
逆に今あるオブジェクトからテーブルとかを生成するツールってあったっけ?



168 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 14:02:32 ]
>>167
方法 : データベースを動的に作成する (LINQ to SQL)
msdn.microsoft.com/ja-jp/library/bb399420.aspx

169 名前:デフォルトの名無しさん mailto:sage [2008/05/25(日) 14:39:10 ]
>>161
これでも読め
www.microsoft.com/japan/msdn/net/bb425822.aspx

170 名前:デフォルトの名無しさん [2008/06/02(月) 22:49:47 ]
Linq人気ないから救済でAgeてやる
感謝しろビル

171 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 08:38:01 ]
PL/SQLですね。

172 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 11:06:00 ]
pc11.2ch.net/test/read.cgi/tech/1212972014/

173 名前:デフォルトの名無しさん [2008/06/15(日) 19:33:30 ]
えーい
Linqも人気ないけど
ダメ技術のかほりがすっぞ

174 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:07:55 ]
使ったからといって、別に何かが楽になったりすっきりしたりするように見えないんだよな。

175 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 07:25:18 ]
ちょっとしたDBアプリ作るの楽になるが。
XMLとかにもいいと思うよ。

176 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 21:00:53 ]
メソッド形式は手軽に使えてすごく便利だよね
クエリ形式は「さあLINQ使っちゃうぞー」って感じになっちゃって好きじゃない

177 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 22:19:07 ]
未だにクエリ式だとpとかqとかのスコープがよくわかってない俺。



178 名前:デフォルトの名無しさん mailto:sage [2008/06/18(水) 03:55:30 ]
fromやletが沢山必要になる場合は
クエリ式を使ってる

けど、それ以外ではクエリ式は全然使ってない

179 名前:デフォルトの名無しさん mailto:sage [2008/06/19(木) 22:35:19 ]
使い方も確立されてない未知のもんだからな。
ポテンシャルは高い気がする。

180 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 00:55:26 ]
LINQきれいにかけるけれど、特にObjectLINQだと効率的にはだめな場合もあるからなぁ。
微妙なところだ。
PLINQとかになるとまた話は違うだろうけれど。

181 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 08:43:29 ]
>>180
from x in a select x; みたいなのを foreach(var x in a) yield return x; に変えるような
最適化だとせいぜい5%くらいしかスピード変わらない。
5%を気にしないといけない場面はそれほど多くないと思う。

ただ、a.Max(), a.Min(), a.Count() を同時に求めたいような場合、
自前で for まわして同時に求めた方が圧倒的に早い。

Parallel Extensions にはParallel.Forとかもついてるしなぁ。
PLINQでもやっぱり Max, Min, Count の問題は解消しない。

182 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 09:05:06 ]
>>181
DryadLINQみたいにExpressionを直接扱う計算エンジンが要るね。
PLINQは所詮IEnumerableベースだし。
ttp://research.microsoft.com/research/sv/DryadLINQ/

ポテンシャルはDryadLINQ>>>>>PLINQなんだろうけど、
出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。

C# 3.0もお披露目から1年半ぐらいかかったし。
出荷までの時間短縮はお金じゃ解決しづらいんだろうな。

183 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 09:07:06 ]
>出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。

不等号逆だった……
ポテンシャル: DryadLINQ>>>>>PLINQ
出荷までにかかる時間: PLINQ<<<DryadLINQ

184 名前:デフォルトの名無しさん mailto:sage [2008/06/20(金) 09:10:04 ]
>C# 3.0もお披露目から1年半ぐらいかかったし。

あとこれもお披露目から2年半の間違い。

185 名前:デフォルトの名無しさん mailto:sage [2008/06/21(土) 10:41:48 ]
もうちょっと落ち着いて!

186 名前:デフォルトの名無しさん mailto:sage [2008/06/26(木) 01:03:41 ]
いや、勢いあったほうがよい

187 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 22:42:17 ]
複雑なXMLファイルの読み込みはXmlTextReaderよりLINQ to Xmlを使ったほうが簡潔に書けそうですか?



188 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 22:53:07 ]
書いてみろ

189 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:23:38 ]
>>188
一言レスって周りにも意図伝わらないからヤメレ

190 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 23:26:55 ]
最近、勉強ついでにLINQtoSQL使ってるけどクラスとして扱えるだけで便利すぎ。
リレーション張っても参照のプロパティでアクセス出来るのも簡単すぎて涙が出る。
長ったらしいデータセットのクラス名で変数宣言してたら、varで省略できるのにも涙が出た。

191 名前:>>188 じゃないよ mailto:sage [2008/07/07(月) 23:30:39 ]
>>189
自分で書けばわかるって事だろ?

意図理解できないのは君だけだと思うが。

192 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 10:10:04 ]
XmlElementとXElementの違いを問うならわかるが、
XmlReaderと比べるあたり自分では何も調べずに
思いつきで書き込んだと証明してるようなものだ。

193 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 23:25:23 ]
>>191
二つコードを書けということですね、わかります



194 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 23:47:33 ]
なんか俺のせいで荒れてるみたいだな
ごめんなさい

>>192
違いの話なんかしてないっすよ?




あれからbuilderってサイトのサンプルを読んで勉強してみてる。
ちょっと興奮で震えてます。
皆ありがとう


195 名前:デフォルトの名無しさん mailto:sage [2008/07/09(水) 03:40:44 ]
複雑なXMLファイルの定義によるかな。
Linq for XMLで使うXElement系のクラスはDTDやXMLスキーマをサポートしない。
構造の検査、実体やデフォルトの属性を展開することが必要という意味で複雑なXMLだったら手も足も出ない。
XDocument/XElementはXMLパーサーとしての機能をしぼっている。
簡単なXMLの読み書き加工は簡単にかつスマートに書ける、Linq for XMLはその為のもの。

XmlDocment/ElementはDOMとしてのすべての機能をもつ。多機能ではあるが何をするにも大掛かり。

XmlReader/Writerは StAX型の前方参照型で高速。
使用メモリが少なくてすみ全部メモリに読み込むのが問題になるような大きなXMLも対応できる。
扱いは当然ややこしい。





196 名前:デフォルトの名無しさん mailto:sage [2008/07/11(金) 13:29:59 ]
意外に使いやすいよねXmlReader/Writer

197 名前:デフォルトの名無しさん mailto:sage [2008/07/19(土) 20:38:17 ]
マイクロソフト公式解説書としてLINQ本が出るってよ

LINQテクノロジ入門
ec.nikkeibp.co.jp/item/books/A04100.html
・07/22発売 3,360円(税込み) B5変 280P



198 名前:197 mailto:sage [2008/07/27(日) 00:32:31 ]
届いたんでぼちぼち読み始め

図表を多く使っていて、C#/VBのサンプルコードも多いのは○
内容的には結構踏み込んで丁寧に解説されていて、実際に発行されるT-SQLまで触れられてたりする。

・C#/VB・SQLに関する基本的な理解は必須。
・開発経験のない初心者が読むには少し難しい。
・何となくLINQを使っているが、使いこなせていないと感じてる人 にはおすすめ。

199 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 01:55:18 ]
LINQのProviderでしたっけ?クエリーとかを実装する側の作業についてまとまってるarticleとかってありますかね?(´・ω・`)

200 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 11:06:25 ]
>>199
単に .Select メソッド(あるいは拡張メソッド)とか実装するだけ。
LINQ to SQL みたいなことしたければ、
LINQ の勉強というよりは、Expression Trees の勉強が必要。

で、LINQ がらみの記事は結構おおいけど、
Expression Trees はあんまり見ないなぁ。

201 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:23:14 ]
>>200
それです、それ。
具体的にどこまでのExpressionTreeをどんな風に実装したらいいのかが・・・



202 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 12:55:38 ]
Expression Trees の方は、↓に多少サンプルあり。
ufcpp.net/study/csharp/sp3_linqreconstruct.html

LINQ to SQL みたいなことしたければ、IQueryable でググってみるといいんじゃないかと。

203 名前:デフォルトの名無しさん mailto:sage [2008/07/27(日) 13:14:37 ]
MSDNのこれも読んでおくといいかも。
ttp://msdn.microsoft.com/ja-jp/library/bb546158.aspx
ttp://msdn.microsoft.com/ja-jp/library/bb882640.aspx

204 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 11:34:15 ]
>>198
LINQの本が少ない中、この本はお薦め。
LINQを構成する基礎や、現在のバージョンで、できる事できない事、
やってはダメな事が書かれている。
.netとSQLを使って仕事している人ならLINQがどういう物か理解できる。
少なくともこの本レベルの事を理解していないと知らずに地雷を埋め込むことになる。

205 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 18:22:46 ]
LINQは、VSに付いてくるC#のサンプルコードだけで十分理解できるでしょ。

206 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 23:44:43 ]
LINQがこれから他のテクノロジとどう統合されてくのかよくわからん(´・ω・`)

207 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 00:10:28 ]
> どう統合されてくのか

消えていくと言う運命もあるから、俺はもう少し様子見。



208 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 00:59:30 ]
これだけ言語に食いこんだものが消えるというのはありえないと思うが。

209 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 06:48:16 ]
いや、互換性のために機能としてはずっと残るかもしれないけど
新規には誰も使わなくなって結局放置と言うこと。

まあ、特攻する人も必要だから、>>208 は頑張ってくれ。

210 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 09:00:39 ]
小手先の道具として便利なLINQ to objectsくらいは残るでしょ
そのほかはともかく

211 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 21:35:34 ]
別に「残らない」なんて断定してるわけじゃないよ。
俺はなくてもあまり困ってないし、「残らない可能性もある」ので
ちょっと様子見してるだげ。

いいと思う人はどしどし使って広めてくれ。

212 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:25:27 ]
LINQ便利ざんすよ?
特にLINQtoSQL。XMLはしらんがたぶん便利だろう。
今のだと出来ないこともあるけれど、出来るところのはかなり楽だ。

213 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:38:08 ]
LINQ の意義の1つに、コレクションに対する操作がらみのメソッド名を統一したってのがあるから、
今後、LINQ to SQL とか LINQ to XML が廃れるようになろうとも、
コレクションとかサーバ問い合わせ系のライブラリ書く人は
おそらくほぼ LINQ の規約に従ってメソッド名を付けると思う。

そういう意味では、廃れないと思うんだが。
クエリ式とか、IQueryable を介したサーバ問い合わせとかが廃れようとも、
命名規約の部分に関しては絶対残る。

214 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 23:43:37 ]
MS の技術が「なくても困らない」と感じるのは、
MS がエンタープライズ相手の商売してるから、
個人で趣味で開発してる人へのアピール弱いせい。
あんまりホビープログラムでDBアプリとか書かないし。

215 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 00:10:13 ]
LINQはEntity Frameworkなんかと密接に関わるからねー
まだまだこれからの技術。

216 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 00:23:39 ]
group by ... into g select new {value1 => g.hoge, value2 => g.fuga }
みたいなLINQ書くとselect newの部分でvalue1とvalue2を生成するためにSQLサブクエリが生成されるんだけど、
これってgroup byだけで上手く書き直す方法ないんかなぁ。

というより、生成したクエリを最適化してくれる関数みたいなものはないんだろうか。

217 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:19:42 ]
LINQ to SQL 自体、Entity Framework までの繋ぎの過渡技術だし、
今後 Entity Fx の側がよっぽど大ごけしないと
LINQ to SQL のグレードアップは見込めない気もする。

LINQ とは別に、SQL 文の最適化ライブラリみたいなの探す方が早いかも。



218 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:25:31 ]
EntityFWのクエリーインターフェースとして、LINQ使われるんじゃないの?(´・ω・`)
今のLINQのEntityうんたらがもっとしっかりしたものになるということ?

219 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:44:14 ]
裏側の最適化の話ね。

同じ LINQ クエリ式を書いたときに、
実際にどういう SQL 文が発行されるかという、
実装上の最適化の部分に関して、
LINQ to SQL の今後にはあんまり期待しない方がいいんじゃないかってこと。

まだ手をつけてる人が少なくて情報少ないけども、
将来を期待したいなら LINQ to Entity Framework の方使うこと考えるのがいいんじゃないかと。

220 名前:デフォルトの名無しさん mailto:sage [2008/09/03(水) 08:46:06 ]
LINQtoSQLがせいじゅくされてLINQtoEntityになるのかとおもっとった

221 名前:デフォルトの名無しさん mailto:sage [2008/09/11(木) 20:45:39 ]
りんきゅー><

222 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 20:13:37 ]
↓をメソッド形式で書きたいのですが、OrderByメソッドで複数のプロパティで
ソートするのははどうすればいいですか?

var v = from e in GetFoo() orderby e.Age, e.Name select e

OrderBy二回せずに一回でさくっと書きたいです。

223 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 22:32:24 ]
>>222
OrderBy(1つ目の条件).ThenBy(2つ目の条件)

OrderBy 1回というのは無理。

224 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 20:14:01 ]
>>223
ThenByって知らなかった。ありがと。

225 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 01:50:55 ]
つか、そんなの条件式を二つ持つOrderByを自分で実装するがよろし


226 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 03:17:06 ]
引数可変にしてOrderBy〜ThenByに丸投げで、1分とかからずに実装できるな

227 名前:デフォルトの名無しさん [2008/09/19(金) 07:24:56 ]
こうして車輪は四角に変容しバグを抱擁した後に再輸出されるのであった...



228 名前:デフォルトの名無しさん [2008/09/28(日) 23:54:29 ]
LINQの遅延実行と即時実行は正直いらない気がする。
Aggreegate戻り値はIntegerだし、クエリ機能あれば十分なのでは。

LINQ TO XMLとか開発の現場でまず使うのは小数だろうし、可用性が低いよ。
VBチームの自己満足だね。いつものことだけど。

229 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 12:49:16 ]
>>228
VBのAggregate構文のことかEnumerable.Aggregateのことを言ってるのかわからない。
Integerってどういう意味だろう、集計対象の型で集計されると思うけど。

VBのLinqは使いやすくしようと、文法やキーワードを増やしすぎて
収集がつかなくなってるという感じはする。C#と同じにしておけば良かったような。


230 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:30:31 ]
VBはラムダ式が冗長だから拡張メソッドでクエリ書くと悲惨なことになる

231 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 14:54:49 ]
遅延実行と即時評価ってやたら強調されてるけど
やっぱりC#のyield知らないとわかりにくいのかな

232 名前:デフォルトの名無しさん mailto:sage [2008/09/29(月) 23:02:22 ]
言われてみるとyieldを知らない(あまり使った事がない)とすれば
即時実行でないのに違和感を感じるのも分かるな。

233 名前:デフォルトの名無しさん [2008/09/30(火) 11:58:27 ]
いまさらだけど、yield Returnつう名前がややこすいよ!!

234 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:43:43 ]
yield とかってどこからきたん?関数型?

235 名前:デフォルトの名無しさん mailto:sage [2008/09/30(火) 23:47:50 ]
Rubyのはクロージャ呼び出しだからPythonかなぁ。
Windows2x時代のAPIは関係ないと思う。


236 名前:デフォルトの名無しさん [2008/10/01(水) 02:17:48 ]
ICONからきていると予想
Fiberはいつのまにか消えていたってオチかな

237 名前:[Fn]+[名無しさん] [2008/10/02(木) 00:00:54 ]
てかDTDとかXMLスキーマサポートしてない段階でLINQ廃レは確定ぽ。。



238 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:06:53 ]
それは LINQ to XML の問題であって、LINQ の問題じゃないのでは。

239 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:54:39 ]
LINQ to XMLはもともとXmlDOMやXmlReaderの代替を狙ったものじゃなく、
standaloneのXMLや部分的なXMLを簡単に扱えることを目指したもの。
はじめからDTDやXMLSchemaはサポートしないことになっていた。
もっともnamespaceを中途半端なサポートはチトいただけないから改良は欲しい。
いっそなくすか、もっと充実させるかどちらかで。

240 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 08:21:03 ]
スキーマはサポートしない、って確かにそうなんだけど
ぶっちゃけあれ下層に XmlReader が使えるからでは
ないのかと

241 名前:デフォルトの名無しさん [2008/10/02(木) 13:10:43 ]
LINQはすんばらしい
FOR EACH書かなくてすむし、べた書きのXMLもコードとして扱える。


242 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 00:46:47 ]
C#だとエディットコンティニューが使えないのは結構痛い

243 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 10:10:47 ]
エディットコンティニュかあ、x64だと使えないんだよなあ。
まあx86にすりゃいいんだけど、デフォがAnyCPUだからなあ。

244 名前:デフォルトの名無しさん [2008/10/11(土) 23:59:11 ]
てかLINQってORACLEとかポスグレでも使えるのね。

245 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 00:58:14 ]
>>244
LINQ to Entity の出た今となってはね。
MS SQL Server でしか使えないって言われてたのは、
SP1 入る前、LINQ to SQL の時代の話。


246 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 02:57:11 ]
別に Linq to SQL でも別データベースサポート可能だよ。
でも Linq -> Entity SQL がサポートされたから、Entity SQL ->
ネイティブ SQL だけでいいじゃん=皆やる気ナスなだけで。


247 名前:デフォルトの名無しさん [2008/10/12(日) 20:47:40 ]
Linq to Entityが生成する生のSQLを確認する方法を教えてください。



248 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:46:17 ]
それは実行される前に?恒常的に?
そうじゃないならログ見りゃいいと思うけど・・・

249 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:15:00 ]
>>248
実行時でかまいません。
Linq to SQLのようのDataContext.Logプロパティにあたるものが見当たらないようです。
またSystem.DiagnosticsのTraceやDebugでも確認できませんでした。
探し方が悪いのかもしれませんがSQLのログを出力する方法を教えてください。

250 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:39:14 ]
だから SQL Server なら確かプロファイラ起動してトレースの開始で…
と記憶を頼りにぐぐって気づいたんだが Express にはないのか
このツール。おおう。それとごめんトレースだった

2005 ならこんなの見つけたけど
ttp://code.google.com/p/sqlexpressprofiler/


251 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 03:19:46 ]
タイプセーフなデータベースプログラミング
ttp://d.hatena.ne.jp/higayasuo/20081014/1223969275

拡張メソッドとラムダ式と式木と匿名型とvarとあって良かったと思える瞬間。

252 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 17:46:42 ]
Entity FrameworkをLinqなしで使うと2番目の例っぽくなるね。

253 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 19:35:37 ]
多言語でLinqのパクリを作ろうと思っても、言語仕様のサポートが無いと
ああいう風にせざるをえないんだよな。

254 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 22:35:24 ]
まあ、だからC# 3.0がああなったわけで。

255 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 22:53:01 ]
その辺Booなら自分で言語使用作れるかと

256 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 10:13:17 ]
実際に動くものを作ってから言え

257 名前:デフォルトの名無しさん [2008/10/27(月) 22:19:23 ]
時間ができたので久しぶりの >>1 です、だんだん慣れてきた、半年続けた結果分かったことLINQスゲー使えます
という訳でみんなこれ勉強しろ!!
とりあえずアドバイス、まずは yield return / yield break が自在に使いこなせるようになるといいです。

使い方のコツ

 1.シーケンス( IEnumerable<T> 、データベースで言えばテーブル)の生成
 2.from ... または System.Linq.Enumerable で加工(繰り返し)
 3.ToArray() , ToList() , ToDictionary() , All() , Any() 等で結果生成。

これが標準パターン

 元の列を作る → 加工 → 加工 ・・・ → 加工 → 配列化

基本的にこればっかりです。
ちなみに LINQ が真の力を発揮するのはデータベースではなく、日常的に使う配列やオブジェクトです。
いままではデータベースではクエリで簡単に実行できても、プログラム中ではできずと
やむなくデータベースに一旦突っ込んでやるか、フルスクラッチで同等機能を作り出すかと、
無意味なプログラム実行環境の大規模化を引き起こしていました、これが無くなります。



258 名前:1 [2008/10/27(月) 22:20:21 ]
とにかく『加工元が簡単に作れない』事には、LINQ は使い物になりません。
という訳でシーケンスの作り方のコツ
配列やList等は、IEnumerable<T> 持ちなのでそのまんまシーケンスその物である、これは当たり前。

*.バラバラな物をシーケンスにするコツ、『適当』に yield return をばらまく
 このあまりに馬鹿らしく単純な使い方になかなか気付けなかったw
 例
 class Test {
  int A;
  string B;
  // メンバーを片っ端からシーケンスにする
  IEnumerable<object> Members() {
   yield return A;
   yield return B;
  }
  public override bool Equals(object obj) {
   Test obj2 = obj as Test;
   if(obj2==null) return false;
   return this.Members().SequenceEqual(obj2.Members());
  }
  public override int GetHashCode() {
   return this.Members().Aggregate(0, (acc, element) => acc ^ element.GetHashCode());
  }
 }

*.IEnumerable<T> を持っていないライブラリの古い糞クラス用にアダプターやヘルパー関数をたっぷり作っておくこと!!
 例
 IEnumerable<T> CreateEnumerable<T>(Func<int> getCount, Func<int, T> getItem) {
  for (int i = 0; i < getCount(); ++i) yield return getItem(i);
 } 標準で .Net Framework に準備して欲しい・・・


259 名前:1 [2008/10/27(月) 22:21:21 ]
二以上のシーケンスを同時に加工するときのコツ
1.ToArray() , ToList() 等で、一旦配列にする。
2.Enumerable.Range( 0 , seq.Count() ) で配列の添え字を列挙して使う(なかなか気付けなかったw)

 例
 var tmp1 = 元シーケンス1.ToList();
 var tmp2 = 元シーケンス2.ToList();
 var tmp3 = from index in Enumerable.Range(0,tmp1.Count-1)
       select new { tmp1[index] , tmp2[index] };

3.ToDictionary や ToLookup を使って連想配列を経由するとさらに色々な事が簡単に
4.他にも色々便利なコンテナもあるので To○○ を拡張を沢山作っておくのがコツ
 標準で .Net Framework に準備して欲しい・・・

260 名前:1 [2008/10/27(月) 22:22:05 ]
ありそうで実は無くて意外不便なもの

1.Excelを使うと良く登場するパータンで、前後の要素にアクセスしながら新しい列を作るような手段が実はない
 [ ][0]
 [3][=A2]
 [4][=B2+A3]
 [6][=B3+A4]
 [2][=B4+A5]
 [5][=B5+A6]
 左の列を元に、右の列のようなシーケンスを作る関数を作っておくと便利、汎用関数も簡単につくれる。
 これなかった頃よく似た関数をあたりにぶちまけてしまった .Net Framework に準備して欲しい・・・

2.ツリー構造の全要素列挙、汎用関数も簡単につくれる。
 これなかった頃よく似た関数をあたりにぶちまけてしまった .Net Framework に準備して欲しい・・・

3.コントロールブレイク(コボラーの必殺技)も作っておくと便利。
 COBOLは実は触ったことが一度もないのですが、どうも色々便利ノウハウが彼らにはあるようです。
 現在鋭意開拓中

261 名前:デフォルトの名無しさん [2008/10/27(月) 22:22:31 ]
Enumerableにある関数は、全部使い込みましょう、特に重要なのは

シーケンスを混ぜて一つのシーケンスを作る系
 Enumerable.Concat()
 Enumerable.Intersect()
 Enumerable.Union()
 Enumerable.Except()

シーケンスの先頭や部分を取得する系
 Enumerable.First()
 Enumerable.FirstOrDefault()
 Enumerable.Take()
 Enumerable.Skip()

全シーケンスのチェック、これ以上複雑な物は foreach の方がかえって分かりやすい気がする。
 Enumerable.All()
 Enumerable.Any()
 Enumerable.SequenceEqual()

要素の型変換、指定型のみ抽出
 Enumerable.Cast()
 Enumerable.OfType()

マニュアルが余りに理解不能な文書なので、動作を確かめながら自分の言葉で整理しておくと便利です。
生成用関数、加工用関数、結果生成用関数の三つに分類してみると、すっきりしてきます。

262 名前:デフォルトの名無しさん [2008/10/27(月) 23:24:32 ]
サンプル通りにやってもAddの定義が無いのですが‥‥
www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46703&forum=7&2
ぶっちゃけ、この常連しんさんと全く同じ質問なのですが、
この人、質問して、自己解決して、回答書いてないので‥‥

263 名前:デフォルトの名無しさん [2008/10/27(月) 23:38:24 ]
関数型プログラム言語触れば別に驚くことでもない

264 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 01:43:36 ]
Firstも使うけどSingleもよく使う

265 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 03:14:06 ]
>>261
最も基本の Select, SelectMany が抜けてる

>>262
多分、LINQ to SQLだよな
Add がどこから出てきたのか知らんが、対象がTable<T>なら
データ操作にはInsert〜とかDelete〜あたりをつかう


266 名前:262 mailto:sage [2008/10/28(火) 13:58:59 ]
>>265
どうもありがとうございます。>>262のサイトからさらっと試し始めたので‥‥
InsertOnSubmitを使うんだと分りました。
たぶん、あのサイトは記述が古いんですね。
とっても面白いので、本でも買って真面目に勉強します‥‥

267 名前:デフォルトの名無しさん mailto:sage [2008/10/28(火) 17:52:37 ]
>>265
基本といえば Where もないね

クエリ式で書けるものは入れてないのかな?



268 名前:デフォルトの名無しさん [2008/10/31(金) 16:20:09 ]
これってORマッピングツールみたいなものか?

269 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 19:53:08 ]
>>267
ラムダで書くと見た目が不必要に複雑になるからな

270 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 19:59:39 ]
C#の方は XML to LINQ を無理やりC#構文で書かせるのはなんとかしてほしい。
データ操作まで無理やりオブジェクト指向にするとかえって記述がグダグダになるんだよ。
データ操作は特化した記述がいい。

271 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:27:08 ]
同じ記述でXMLが扱える所が利点なのに?
わざわざ特化した記述作って、新しく覚えないといけなかったら魅力感じないな

272 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 20:35:02 ]
もしかして関数型構築のこと?

273 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 22:23:22 ]
>>269
全部クエリ式で書けない場合は,joinとかletとか使わない限りは全部拡張メソッドで俺は書いちゃうな

274 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 02:17:30 ]
クエリ式みたいなものを自由に拡張できるようにして欲しいお(´・ω・`)

275 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 02:29:34 ]
そんなことしたらカオスになるじゃないか

276 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 09:41:51 ]
クエリ式は抽象化の度合いを下げないまま、
foreachをネストさせた時の様に変数を扱えるのが便利だね。

これを拡張可能にすると・・・関数型っぽくなる気がする。

277 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 09:50:56 ]
>>275
しかしそれがいい・
>>276
調子に乗ってクエリ式つなげてくと遅くなるらしいからなぁ・・・
記述方法は大好きなんだが。




278 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 10:45:55 ]
>>277
遅くなるってのは意外と平気。
かなりバカに書かない限りはforeach書くのと比べて1割くらいしかパフォーマンス落ちない。

279 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 11:38:48 ]
遅延評価を繋げるだけならほとんど遅くはならないはず

280 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 11:49:52 ]
遅い速いは相対的なものだからどのレベルで遅いといってるのか示さないと議論にならない。
非常に細かいパフォーマンスを気にしているなら、
ラムダ式(デリゲート)を使うので関数の呼び出しがインライン化されないとか、
SumやMaxなど集計系メソッドを複数使った場合にちょっと効率の悪いことをしているとか
そんなところだね。

281 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:18:38 ]
Reverseってバッファ使うから即時実行だと思ってたんだけど、Reverseの呼び出し時じゃなくて
最初のMoveNextの呼び出しの時点ですべての結果が決まるから遅延実行になるのか
速い遅い気にするならどういう実装になってるか気にしないといけないね

282 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:31:55 ]
3.0出始めの時に誰かが、foreachで条件とか変換とか並べて書いたのと、クエリ式とか並べて頴田の比べて結構違いがあったような。


283 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:37:47 ]
Linq to ObjectとLinq to SQLは分けないと話が食い違うから要注意。

284 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:44:36 ]
この文脈でどう読んだらto SQLになるのか

285 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:50:21 ]
4.0の紹介ビデオみてるが、よいなぁこれ・・・
来年早々にも出してくれんかな・・・

286 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 13:11:04 ]
PLINQとか並列化関係いいなぁ・・

287 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:04:48 ]
4.0の紹介ビデオってmsdnにある?



288 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:12:26 ]
channel9.msdn.com/pdc2008/TL16/

ちなみに、パスを1段削って、
channel9.msdn.com/pdc2008/
にするとPDCのセッションの一覧が出てくる。

289 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 00:31:16 ]
thx

290 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 01:31:48 ]
C#インタプリタ、すげぇ!

291 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 09:38:50 ]
>>282
ufcpp.net/study/csharp/sp3_linqreconstruct.html#iterator
これ?

foreach で置き換えるだけじゃたいして性能変わらない。
ここで違いが出てるのはそれの次の節の話で、
「if をループの外に出せ」と同じ原理で
「可能な限り where を from の上に」ってやるとパフォーマンス結構変わる。

292 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:16:15 ]
LINQのクエリ式とSQLの一番の違いがプランナの有無。
クエリ式は書いた順番どおりに処理していくが、
SQLはプランナが最適な実行計画を立てる。

293 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:39:15 ]
LinqtoObjectも気合い入れてプロバイダ書けばプランナ相当のもの記述可能?
いや書く気毛頭無いですが

294 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 12:26:24 ]
やろうとおもえばLINQでスクリプト言語書けるよ

295 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 21:52:31 ]
>> 294
出だしだけでもKWSK

296 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 17:07:42 ]
LINQ to SQLって無くなるの?
なんつーか、ぶちまければ良いってもんじゃねぇだろ。
そんなのはオプソ系に任せとけよ。


297 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 18:08:39 ]
何で無くなると思ったのさ?



298 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 18:35:18 ]
なくなるっつーかLinq to Entityに置き換えでしょ。
別に今のところは対して書き方が違うわけじゃないし
Linq to Entity完成までの代打的存在として十分用を果たしたような。

299 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 22:44:48 ]
うむ。かなりの部分でSQLの開発楽にしてくれた。
ストーリーにちゃんと沿わないと痛い目あうがなwww

300 名前:デフォルトの名無しさん mailto:sage [2008/11/11(火) 23:18:07 ]
>>296
開発が止まるだけで今後も当面は.NET Frameworkに標準搭載が続くんじゃないの?

301 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:12:05 ]
Entity Frameworkは絶対こける。
間違いない。

302 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 00:44:11 ]
>>301
まあVer.3ぐらいになるまでは毎回大変更の嵐だろうな。

303 名前:デフォルトの名無しさん mailto:sage [2008/11/12(水) 17:23:24 ]
Entity FrameworkはLinq to SQLの問題点が色々と解決されてるんだけど
デザイナが使いにくすぎる。

RailsのActiveRecordみたいに
ちょこちょこっとクラスに属性を付ければモデル完成、
ってのフレームワークだったらよかったのに。

304 名前:デフォルトの名無しさん [2008/11/20(木) 12:30:10 ]
LINQ to SQLってADO.NETより目茶苦茶いいな。
更新系では、生のSQL文に完全なWHERE句を入れてくれるし、
非接続型・楽観的制御(←赤間さん流)では文句なし。
あと、生SQLのサブクエリ相当の組み合わせを段階を踏んで書けるのもいい。
デバッグも迅速になりそう。

305 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 15:06:45 ]
俺、LINQ to P2P で当てたら結婚すんだ。

306 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:51:19 ]
>>304
消える運命にあるが

307 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:15:10 ]
なんらかの形で残るよ。使ってみれば、この方向性で進化していくんだろうと判る。
今のはちょっとSQL Serverに特化しすぎてるからディスコンかもしれないけどさ。



308 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:16:56 ]
>>307
この方向性で進化した結果がLinq to Entityなんだけど、今のところいまいちの出来。

309 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:32:43 ]
>>308
Entity Framework自体まだ手を付けてないのだが、どういまいち?

310 名前:デフォルトの名無しさん [2009/01/04(日) 23:25:17 ]
例えば、
Select Sum(col1),Sum(col2),Sum(col3) from Table1
なSQLだとLINQではどう書くの?

311 名前:デフォルトの名無しさん [2009/01/04(日) 23:46:52 ]
>>310
そんな質問はつい最近掲示板で見た事あるな

312 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:59:48 ]
これか。ググったら一発で出てきたw
ttp://bbs.wankuma.com/index.cgi?mode=all&namber=30713

313 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:53:25 ]
ただのマルチじゃねーかw

314 名前:デフォルトの名無しさん [2009/01/07(水) 02:50:59 ]
>>311 >>312 >>313
ケチは付けられても結局答えられる奴いねぇんだな
暇なカス野郎だけかよ

315 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 03:06:42 ]
var result =
from item in Table1
select new {Sum1 = item.col1.Sum(), Sum2 = item.col2.Sum(), Sum3 = item.col3.Sum(), }

でいいんじゃね?

316 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 04:16:09 ]
いや、良くない。範囲変数itemは単なる1レコードで、item.col?はスカラー
1回のループで計算したいなら、アキュムレータ使うしかないはず

var sum = Table1.Aggregate(new[] { 0, 0, 0 }, (y, x) => {
  y[0] += x.col1;
  y[1] += x.col2;
  y[2] += x.col3;
  return y;
});

317 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 05:35:25 ]
>>316
それはクエリプロバイダ次第じゃなかろうか。

確かにLINQ to Objectのみなら>>316の書き方の方が速い。

しかしTable1.Aggregateのオーバーロード解決次第によっては
クエリプロバイダの提供する最適なクエリ演算子ではなく
LINQ to Objectの低速なパスで実行されるため>>316はかえって遅くなる。

式木的に
Select Sum(col1),Sum(col2),Sum(col3) from Table1
というSQLに対応するのが何かと聞かれれば>>315を推したい。

あとは>>310が何を期待して聞いたか次第かな。
LINQ to SQLでの書き方を期待していたなら>>315でも最適化されたと思うが。



318 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 08:09:53 ]
LINQ to SQL、生成されたSQLクエリがどんなのか見れるから試してみればいいんでは。


319 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 08:21:29 ]
いつもながらLinq to ほにゃららを明記しないと話がこじれるな。
Linq to Entityかもしれない。


320 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 10:45:44 ]
マルチに答えるとつけあがるからやめとけ

321 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 12:34:27 ]
>>317
考え方はいいとして、>>315のコードが間違っているのは無視か

var sum1 = Table1.Sum(item => item.col1);
var sum2 = Table1.Sum(item => item.col2);
var sum3 = Table1.Sum(item => item.col3);

やるならこうだろ

322 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 14:07:35 ]
>>321
確かに間違ってるな。
1クエリで書こうと思うとティマイザに期待しつつこう書くしかないか。

var result =
from _ in Table1
new
{
sum1 = Table1.Sum(item => item.col1),
sum2 = Table1.Sum(item => item.col2),
sum3 = Table1.Sum(item => item.col3)
}).Take(1).First();

323 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 14:08:38 ]
ティマイザ→オプティマイザ

324 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 19:41:18 ]
>>310
初心者なりに考えてみた。
全然スマートじゃないけど勘弁してね。

var result = table.Select((t, x) => new
{
seq = x + 1,
col1 = t.col1,
col2 = t.col2
}).GroupBy(t2 => t2.seq).Select(g=>new
{
sum1 = g.Sum(t2=>t2.col1),
sum2=g.Sum(t2=>t2.col2)
});



325 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:05:19 ]

var result = table.Select(t => new
{
col1 = t.col1,
col2 = t.col2
}).GroupBy(t2 => 1).Select(g => new
{
sum1 = g.Sum(t2 => t2.col1),
sum2 = g.Sum(t2 => t2.col2)
});

326 名前:デフォルトの名無しさん [2009/02/17(火) 18:54:14 ]
初めまして、よろしくお願いいたします。
どうかアドバイスを下さい。

Visual Studio 2008を使っていて、1台の自宅PCにインストールしています。
インストールしているのは、SQLServer2005 developper edtion + VB 2008です。
この環境でC/Sアプリを作り始めました。

経緯としましては、VBアプリを作るのにVSを起動して、プロジェクトの種類でVB、テンプレートで
Windowsフォームアプリケーション、をクリックして進み、プロジェクト名をjob_testにしてOKをクリックしました。

VSが起動し、左にサーバーペイン、右にデータソースペインが表示されました。

ここからが問題なのですが、データソースペインがうまく機能しないのです。 
1. 「ペインの「新しいデータソースの追加」をクリック
米データソース構成ウィザードが軌道します。
2.「データソースの種類」で「データベース」を選択して「次へ」をクリックして進みます。
3.「データ接続の選択」で「・・・使用するデータ接続」で既存の接続を選択して、
 ラジオボタン「はい、重要情報を接続文字列に含みます。」を選択してクリックして進みます。
4.「接続文字列をアプリケーション構成ファイルに保存しますか?」で「次へ」をクリックして進みます。
5.ここ(データベースオブジェクトの選択)でエラーが発生します。メッセージは、「データベースから
情報を取り出すときに、エラーが発生しました。MicrosohutoVisualStudio.datadesignsync.
designersync.Facedsync,TableConfigManager のタイプ初期化
子が例外をスローしました」と表示され先へ進めません。 

どうか解決方法を教えて下さい。

それと境い目の現象なのでDBのスレにもレスさせて頂きます。ご了承くださいませ。




327 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 07:06:29 ]
>>326
マルチ乙



328 名前:デフォルトの名無しさん mailto:sage [2009/02/20(金) 18:50:07 ]
Microsohuto社製品なんて使うからだな

329 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 04:59:59 ]
>Microsohuto社
中国のばったものの会社?

330 名前:デフォルトの名無しさん mailto:sage [2009/02/21(土) 21:28:41 ]
株式会社精密工具

331 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 00:42:52 ]
Linq to Xmlでちょっと質問

<root>
<data>
<ID>1</ID>
</data>
<data>
<ID>3</ID>
</data>
<data>
<ID>4</ID>
</data>
</root>
というのを
<root>
<data>
<ID>1</ID>
</data>
<data>
<ID>2</ID>
</data>
<data>
<ID>3</ID>
</data>
</root>
に変換するにはどうすれば良いんでしょうか?
イメージとしては、IDを指定して<data>ごと削除、でもIDの値は1から順番になるように保つ、という感じです

332 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 00:53:41 ]
データが何個あるか調べて、XMLを作り直したほうが早いと思わんかね?

333 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 02:38:35 ]
いまひとつイメージがつかめないから、こうゆう解釈で行くよ〜
<data><ID>1</ID><ext at=""true"">hoge1</ext></data> 
<data><ID>2</ID><ext at=""false"">hoge2</ext></data> 
<data><ID>3</ID><ext at=""true"">hoge3</ext></data>
<data><ID>4</ID><ext at=""false"">hoge4</ext></data>
ID=3の行を削除でIDが繰り上がる
<data><ID>1</ID><ext at=""true"">hoge1</ext></data> 
<data><ID>2</ID><ext at=""false"">hoge2</ext></data> 
<data><ID>3</ID><ext at=""false"">hoge4</ext></data>

334 名前:デフォルトの名無しさん mailto:sage [2009/02/23(月) 02:42:54 ]
string xml = @"<root>
 <data><ID>1</ID><ext at=""true"">hoge1</ext></data> 
 <data><ID>2</ID><ext at=""false"">hoge2</ext></data> 
 <data><ID>3</ID><ext at=""true"">hoge3</ext></data>
 <data><ID>4</ID><ext at=""false"">hoge4</ext></data></root>";
var doc = XDocument.Parse(xml);
var rs = doc.Elements("root").Elements("data").Where(x => x.Element("ID").Value != "3")
 .Select((x, cnt) => { 
  var nx = new XElement(x);
  nx.Element("ID").Value = (cnt+1).ToString();
  return nx;} );
var el2 = new XElement("root2");
foreach (var s in rs) el2.Add(s);
var doc2 = new XDocument(el2);
Console.WriteLine(doc2);
今回は読み込んだXdocumentをいじらないようにしたが、いじっていいなら
Linqは使わず最初に読み込んだXDocumentを直接変更してもいいと思う。

335 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:27:35 ]
WPF の UIElementCollection に対して、
Linq の機能(Where メソッドとか)を使いたいのですが、
UIElementCollection にはそのメソッドがありません。

どうすれば Linq の機能が使えるでしょうか?

336 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:34:03 ]
あー、non-generic な IEnumerable に対する Where とかないのか・・・
いったん、 .OfType<UIElement>() っての通すと使える気がする。


337 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 11:49:27 ]
OfTypeじゃなくて,元のコレクションに違う型が入ってないことを仮定するCastのほうがベター
※foreach(UIElement item in collection)相当
OfTypeを使うのはOfType<Button>みたいに意図的に型をフィルタリングするときだけ



338 名前:335 mailto:sage [2009/04/16(木) 21:20:12 ]
>>336 >>337
ありがとうございました。


339 名前:デフォルトの名無しさん [2009/04/19(日) 23:45:46 ]
良スレなのに過疎ってて残念。

340 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 12:48:21 ]
SQLは糞

341 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 18:09:58 ]
何をもって糞と判断してるのか

342 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 20:08:48 ]
互換領域の文字だからだな

343 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 22:24:47 ]
 int[] a = new int[] { 1, 2, 3 };
 a.ToList().ForEach(i => Trace.WriteLine(i) );

ForEach するために毎回 ToList() してるんだけど、
ToList() しなくてすむ方法ないの?


344 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 22:33:14 ]
>>343
素直に foreach (var i in a) するか、自分で IEnumerable 用の ForEach 拡張メソッド書くか。

345 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 22:35:22 ]
ttp://neue.cc/2009/04/04_145.html

346 名前:デフォルトの名無しさん mailto:sage [2009/04/20(月) 22:59:17 ]
DataTrigger で特定の Rectangle だけ色を変えようと思って、
TargetName を指定したら、Style では TargetName は指定できないという
エラーが出てしまいました。

回避する方法はありますか?

347 名前:346 mailto:sage [2009/04/21(火) 06:16:25 ]
すんません、誤爆です。



348 名前:デフォルトの名無しさん mailto:sage [2009/04/25(土) 15:04:39 ]
from age in

349 名前:デフォルトの名無しさん [2009/04/25(土) 15:04:53 ]
.

350 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 20:23:27 ]
実際はLINQ to SQLなのですが、

class Order
{
string syohin;
DateTime transactTime;
}

class SpecialInterval
{
string syohin;
DateTime applyDayFrom;
DateTime applyDayTo;
}

で、Orderは数万件以上、SpecialIntervalは数十件以上あります。

これで、Orderの中から、syohinが一致してなおかつtransactTimeがapplyDayFrom〜
applyDayToの間にあるOrderだけを取得したいのですが、どうしたら
いいでしょうか?

351 名前:デフォルトの名無しさん mailto:sage [2009/04/30(木) 20:46:13 ]
from order in context.Order
join si in context.Special on order.shyohin equals si.syohin
where si.applyDayFrom < order.transactTime && order.transactTime < si.applyDayTo
select order

ではダメ?

352 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 21:21:06 ]
.NETとVisual Studioってどういう関係ですか?
.NETの後継??

353 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 21:32:08 ]
.NETは.NET
Visual StudioはVisual Studio

354 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:07:37 ]
パイナップルと酢豚みたいなもんだな

355 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:08:10 ]
>>354
それだと、.NETは要らない子になっちまうじゃないか。

356 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 22:59:46 ]
>>354
吹いたww

357 名前:デフォルトの名無しさん mailto:sage [2009/05/21(木) 23:13:02 ]
パイナップルのない酢豚なんて・・・



358 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 13:52:09 ]
オレも邪魔だと思ってたが、無いと寂しいw

359 名前:デフォルトの名無しさん mailto:sage [2009/05/22(金) 14:38:39 ]
で、

.NET = パイナップル
VS = 酢豚

っていう結論でいいのか?w

360 名前:デフォルトの名無しさん mailto:sage [2009/05/30(土) 17:03:50 ]
.NET = フレームワーク
VS = IDE



361 名前:デフォルトの名無しさん mailto:sage [2009/06/01(月) 13:49:45 ]
>>360

ありがと!謎が解けました!!

362 名前:デフォルトの名無しさん mailto:sage [2009/06/24(水) 16:09:02 ]
>>244-246って他社製のプロバイダ使ってってこと?

363 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:18:41 ]
LINQ to Object やyield returnを使っていて
ふと「これ、何のために使っているんだろう」と思ってしまう。
旧.netと互換性がなくなる上に、実行速度は条件次第(そして多くの場合)落ちるし。

これらの目的は「可読性を上げる」って認識でおk?

364 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:31:05 ]
yield return は 2.0 からあるぞ。それより前となると
Generics もないので互換性気にするだけアレというか・・・

Linq to Objects は遅くなるのは確かだけどスケーラビリティは
あるんだよなぁ。Linq がといったほうがいいかもしれないけど

365 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:35:58 ]
とりあえず書いて楽になったとおもわんか?
思わないなら別に使わなくていいだろ。
自分はIEnumerable<T>系を自分のライブラリでも多用してるし、yield使わないでIEnumerable返すコードなんか書きたくもないが。

366 名前:デフォルトの名無しさん [2009/07/08(水) 22:36:57 ]
MSはyield使いまくってるよ
yieldはフレームワークを作る人のための機能、LINQは使う人のための機能だな

367 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:38:09 ]
.NET 4.0 のPLINQに期待。
CTPで試したけど、お手軽並列化はかなり便利だった。



368 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:38:59 ]
トン。なるほど。
確かに非常に楽にはなるし、拡張も楽だし、バグも入りにくいと思う。

でも、コードレビューに速度至上主義者がいるとそれが理解されないのよね。

369 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 22:48:23 ]
実際にボトルネックになるような場所でlinq使って叱られるのは当然だが
「なんか遅そうなコード」を見ただけで騒ぐのは
速度至上主義者じゃなくてただの阿呆や

370 名前:デフォルトの名無しさん [2009/07/08(水) 22:49:54 ]
別にそれ自身遅いもんじゃないよ
IEnumerableを返すメソッドを手で書いたところでyieldより効率のいいものができるとは考えにくい
LINQは素直すぎるだけだ

371 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:08:48 ]
妄想で語っている人多い気はするね、LINQは初回の実行の時はコンパイルが入るから遅いのは分かるが
一度実行されると、二回目からは高速化する構造になっているしね。
LINQを使わない場合は、平均して中速になる。
ある意味LINQを使わないというのはパフォーマンス的には使いやすいかもしれないが、コーディングの楽さとそこそこのパフォーマンスの両得確保を目指すなら
LINQは外せないはず


372 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:14:43 ]
そういうパフォーマンス厨いるけど、実行速度に影響するのはそういう部分じゃなくデータ構造とか効率的なアルゴリズムとか。
LINQでのパフォーマンスの劣化なんてよっぽどの所でないと誤差の範囲。

373 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:20:03 ]
>>371
式木とクエリ式混同してない?

少なくとも、LINQ to object は動的生成一切ないよ。
foreach でコレクション操作するのに比べて、
静的メソッド呼び出しがちょっと増えて、その分のパフォーマンス落ちる程度。
静的メソッド呼び出しのコストなんてほんとたかが知れてて、
ほんの数%の最適化が必要な超クリティカルな場面以外は気にする必要ない。


374 名前:デフォルトの名無しさん [2009/07/08(水) 23:24:03 ]
パフォーマンスについては間違ってる
クエリ演算子を繋げることによってネストされた列挙子ができて、列挙自体のコストがちょっとだけ増えるんだよ

375 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:26:16 ]
ああ、そか。
かかるコストは静的メソッド呼び出し分じゃなくて、
仮想メソッド分になるか<列挙子のネスト。

376 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:27:55 ]
なんか適当な事書かれているような気がするぞ
foreachなどでやる場合は、連続したシーケンス操作では計算した値を何処かに確保して
また計算してというのが繰り返されているのに対して、クエリをバシバシつなげた場合は、中間データが作られないで処理される。
データ処理が縦に輪切りで処理するか横に輪切りで処理するかが変わる
この時決定的な差として、キャッシュの使用量がLINQを使った場合の方が小さくなって結果的に高速化するケースは多い。
オレはこっちの効果を重要視している

377 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:29:27 ]
>キャッシュの使用量
CPUのデータキャッシュの事ね、今のプロセッサではこれが決定的なパフォーマンスを決める



378 名前:デフォルトの名無しさん [2009/07/08(水) 23:36:57 ]
LINQ使うときは最後まで列挙や評価を行わせないのが重要
Reverseみたいに、遅延実行の演算子の中にも危ないのがあるので注意

379 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:37:56 ]
yieldは結構便利なことに気付いた。
配列を返させてたところはこれに変えられる。

380 名前:デフォルトの名無しさん mailto:sage [2009/07/08(水) 23:38:06 ]
>>378
気にしなくていいと思うけどね、よほどの問題が発生しない限り

381 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 00:00:11 ]
>>376
実際のところ、測ってみたら速くならなくない?
1段ラッパーされてる分のペナルティの方が大きくて。

そういうレベルの話よりは、
データ列の処理ってのを1段階抽象化してるから、
LINQ to SQL/Entity みたいなクエリ化もできるし、
PLINQ みたいな並列化もできるしって辺りの
もっと抽象度高い話しないと LINQ の価値出ない気も。


382 名前:デフォルトの名無しさん [2009/07/09(木) 00:09:58 ]
デリゲート呼び出しのコストがやっぱり大きいんじゃないかな
使い方を変えずにExpressionTreeで一つの大きな列挙子に展開することだって可能なわけで、
そういうところがLINQのポテンシャルなんだろうな

383 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 06:19:38 ]
Linqというよりデリゲート単独のパフォーマンスを調べたことがある。
サイズの小さい関数の呼び出しはJIT時にインライン化されるが、
デリゲートで呼び出された関数はどんなに小さいものでもインライン化されないようだった。
関数のサイズを大きなものに変えた場合はどちらもほぼ同じ結果になった。

こういう関数があった場合、
int Hoge1(int x) { return x * x; } // こっちはインライン化されるコード
インライン化されない関数の作り方としては、xは-10000以下にならないという前提で
int Hoge2(int x) {
  if (x > -10000) return x * x;
  : 実際には実行されない大量のコード
}


384 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 08:40:19 ]
くだらない事やらずに分かりやすく書けやクズ

385 名前:デフォルトの名無しさん [2009/07/09(木) 08:44:04 ]
インライン展開はMethodImpl属性で抑制できるぞ

386 名前:383 mailto:sage [2009/07/09(木) 09:18:21 ]
すまん、すまん。糞したり飯食ったりしてて続きを書くのを忘れていた。

Enumerable.Whereで条件を指定するところなどLinqの随所にdelegateが使われているわけだ。
その部分をdelegateを使わない形に書き直せば、yieldや拡張メソッドを使っていても、
多重ループで書いたのとそう変わらない結果がでる。

>>382
>デリゲート呼び出しのコストがやっぱり大きいんじゃないかな 
に同意と言いたかった。

>>385 おおありがとう。インラインの抑制はそのほうがスマートですな。

387 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 09:36:21 ]
デリゲート呼び出しは通常の関数呼び出しの一割り増しぐらいだと外人の誰かがブログでグラフ付きでかいとったな。
ああいうページいつもどこ行ったか忘れちゃうんだよな・・・




388 名前:デフォルトの名無しさん [2009/07/09(木) 09:50:59 ]
いかにデリゲート呼び出しが速かろうとベタに書くよりはそりゃ遅くなるに決まってる
最適化できなくなるんだから

389 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 10:00:52 ]
だから遅くても許容範囲なんじゃねーのって話だろ。
そんだけ速いの欲しかったらアセンブラで書いとけよ。

390 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:22:47 ]
それでも・・・僕はLINQを使うんだ!

391 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:06:06 ]
LINQで要素に連番をふりたいなーと思ったけど
 int index = 0;
 var numbered =
   from p in source
   let gomi = (++index)
   select new { Index = index, Data = p };
と、アホまっしぐらなコードに。

そもそも副作用のある式を入れている時点でマズイとは思うけど
これ以外に手はあるんでしょうか?

392 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:26:45 ]
クエリ式に固執しなければいいんじゃね?

393 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 05:27:16 ]
source.Select((Data, i) => new { Index = i + 1, Data });
クエリ構文だとやれることが少ないことに気づくと、だんだメソッド構文ばかり使うようになる

394 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 08:19:37 ]
トン
こんな便利なバージョンがあったとは。

395 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 16:21:58 ]
C#のLINQは大事なものはほとんど拡張メソッド版になっているよ
ムキになってメソッドでやるのもどうかと思うんだが……
VBのXMLリテラルなんぞを見ていると、やっぱ便利だし読みやすいし。
あんまり拡張メソッドに拘って欲しくないんだけどな

396 名前:デフォルトの名無しさん [2009/07/10(金) 22:45:31 ]
XMLリテラルってXLINQだろ
XLINQ自体は良いものだとは思うけどそんな普及するかどうかもわからない
実験的なものをいきなり言語に組み込むとか

397 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 23:20:37 ]
全然違うような



398 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 00:00:36 ]
VBは使ったことはなかったけど…イコールではないよね。
XMLリテラルはXDocumentやXElementといった
LINQ to XMLのクラスを使っているだけで。

って、LINQ to Schema for VB SUGEEEE!!こりゃ楽だわ。C#じゃ使えないのか。

399 名前:デフォルトの名無しさん [2009/07/11(土) 00:09:02 ]
だからLINQ to SQLみたいにLINQ to XMLがコケたらどうしようもないだろ
言語仕様レベルで依存してるんだから
それくらいしないとVBユーザーは新しいものを使おうとしないだろうとか考えたのかな

400 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 00:16:09 ]
Linq to Xmlは別にこけるこけないって次元の中身ではないと思うけど。
使ったことないで言ってるでしょ。

401 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 01:13:05 ]
Linq to XMLはC#では言語構文の拡張は何もやってない。
使ってるのはLinq to Objectの構文だけで、拡張はクラスライブラリだけ。
VBでは言語構文の拡張もやってて、XMLリテラルもその一種。


402 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 18:58:43 ]
この流れを見て、LINQ to XML触ってみた
書き方はすごく楽だね、こりゃ。

…けど、これってLINQ to XMLで書いてしまうと
XMLでデータの不整合や値のレンジ外が見つかった時に
XMLのエラー箇所を通知するのが難しい気がする。
例外できないんじゃ実用性って…

403 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 22:02:46 ]
あるある。
LoadOptions.SetLineInfoを活用しようとして、
ToDictionaryの代わりにToLookup+重複のないことの検査したり、
Count != 1なら自前の例外を投げてから、Single呼んだりする羽目になっている。

404 名前:デフォルトの名無しさん mailto:sage [2009/07/15(水) 22:18:29 ]
>>402
スキーマ検証周りならベースにまず XmlReader を使え。
XmlReaderSettings で XmlSchemaSet が指定できる

XLinq 上でもエラー処理したいときは、読み込み周りのオプ
ションで XmlReaderSettings の指定とさらに LoadOptions の
SetBaseUri や SetLineInfo オプションも忘れずに


405 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 00:18:20 ]
トン、とても参考になった。SetLineInfoはかなり便利そう

>>403
後、フィルタ以外を全部取り除いておいて最低限にしておいて
データ一個だけ処理する関数を作ってその中で処理したり
 return from p in hoge.Elements("Hoge")
   where (int?)p.Value < 0
   select CreateHogeInstance(p); ←この中で整合性チェックして例外を投げる
結構マヌケな作りな気がする。

406 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 00:20:28 ]
C#なら拡張メソッドがんがん作ってそういうのをチェックしながらのWhereとか例外メッセージつきのSelectとかいろいろ作りゃいいんじゃねーの。
0スタートのindexがくっついてくるSelectWithCountとか自分的に便利。

407 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 04:16:14 ]
>>406
それって標準のと何が違うの?
msdn.microsoft.com/ja-jp/library/bb534869.aspx



408 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 08:01:45 ]
index 付きの Select、みんなが意外知らない便利機能だけど、
まったく同じ機能を再発明しちゃった人までいるのか。

409 名前:406 mailto:sage [2009/07/16(木) 08:29:31 ]
・・・(´・ω・`)
WhereWithCountとか色々作ったのに・・・

410 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 10:22:56 ]
引数なしのAny()とかも影薄いよな
Count() > 0とかやっちゃってる人も多そう

411 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 14:36:23 ]
作ってみると意外と簡単でつい自前で作ってしまう。
デバッグ用に意外と役に立ったり。
public static void ToVoid<T>(this IEnumerable<T> src) {
  foreach (var s in src) {};
}
public static void ToVoid<T>(this IEnumerable<T> src, Action<T> act) {
 foreach (var s in src) act(s);
}


412 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 14:51:15 ]
手軽に作れるのが魅力の1つだよな

413 名前:407 mailto:sage [2009/07/16(木) 17:27:01 ]
>>410
> Count() > 0とかやっちゃってる人
……、ごめんなさい。私です。

>>411
それ、自分はC++から来たからForEachって名前にしたい、特に後者。

414 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 17:42:57 ]
List<T>との整合性を考えても、ForEachの方がしっくりくるな

415 名前:デフォルトの名無しさん mailto:sage [2009/07/16(木) 19:36:16 ]
>>413
Count使うと最後まで読まないといけないからパフォーマンスが悪いはず
Anyは一件あるかないかだから速いはず

416 名前:デフォルトの名無しさん mailto:sage [2009/07/29(水) 01:05:17 ]
ttp://www.infoq.com/jp/news/2009/07/Reactive-Framework-LINQ-Events

417 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 18:41:51 ]
ヌルポ



418 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 19:39:22 ]
LINQと例外処理ってどうやって組み合わせている?

IEnumerableを参照する全ての場所で例外が起こるかもしれない、
となると例外安全の確保をしなきゃならない範囲が滅茶苦茶広くなるし、
任意のtry-catchで捕まえることもできない。
自分は「LINQ中に例外を外に投げる処理は入れるな」で対応している。

419 名前:デフォルトの名無しさん mailto:sage [2009/09/12(土) 23:31:27 ]
LINQからIEnum処理するところすべてtry-catch(´・ω・`)


420 名前:デフォルトの名無しさん mailto:sage [2009/09/13(日) 00:16:47 ]
それは、不毛過ぎるw

421 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 20:55:08 ]
配列の要素を2個ずつ処理したいときにはどうすればいいでしょうか?

ruby の each_slice みたいなのがやりたいのですが。

422 名前:デフォルトの名無しさん mailto:sage [2009/09/14(月) 21:12:59 ]
static IEnumerable<IEnumerable<TSource>> Slice<TSource>(this IEnumerable<TSource> source, int n)
{
  var buf = new TSource[n];
  int i = 0;
  foreach (var item in source) { buf[i++] = item; if (i == n) { i = 0; yield return buf; } }
  if (i != 0) { yield return buf.Take(i); }
}

423 名前:421 mailto:sage [2009/09/15(火) 15:00:48 ]
>>422
ありがとう。

424 名前:デフォルトの名無しさん mailto:sage [2009/09/15(火) 21:59:43 ]
LINQらしさを追求してみた

source.Select((x, i) => new { Key = i / n, Element = x })
    .GroupBy(x => x.Key, x => x.Element)
    .Cast<IEnumerable<TSource>>();


425 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 06:48:18 ]
まあどっちでもいいんじゃない?
拡張メソッドはガンガン使うべきなのかは迷うところ。

426 名前:デフォルトの名無しさん mailto:sage [2009/09/16(水) 21:47:09 ]
イベントをLINQっぽく操れるリアクティブフレームワークってのを最近知ってからというもの
.NET4.0とラブプラスのことで頭が一杯です。


427 名前:422 mailto:sage [2009/09/17(木) 11:04:44 ]
今更だけど>>422は使われ方によっては問題があるかも
static IEnumerable<IEnumerable<TSource>> Slice<TSource>(this IEnumerable<TSource> source, int n) {
var buf = source.ToArray();
for (int i = 0; i < buf.Length; i += n) yield return buf.Skip(i).Take(n);
}
メモリは食うけどこっちの方が確実



428 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 11:22:16 ]
いやSkipやTake使ったらbufの意味がないな
こんなの用意して代わりに使うか
static IEnumerable<TSource> SkipTake<TSource>(TSource[] source, int skip, int take) {
for (int i = 0; i < take; i++) yield return source[i + skip];
}

429 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 17:10:47 ]
次はforをForEach()にするんですね

430 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 19:00:29 ]
427のはあまり良くないと思う。
422のyield return bufを
yield return buf.ToArray()に変えるだけで良いかと。
あと最後はbuf.Take(i)でいいかな。

431 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 19:07:12 ]
sourceがIList<TSource>を実装しているか否かで場合分けするのが効率的か

432 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:20:03 ]
条件に合うものと合わないものを分けるために、

bar = foo.Select(i=>Baz(i) );
foo = foo.Select(i=>!Baz(i));

みたいに2回Selectしてるんですが、
1回で済む方法ないですか?

433 名前:432 mailto:sage [2009/09/27(日) 19:23:15 ]
間違いました。 where を2回です。

434 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:24:56 ]
欲しいのはどっちなの?
両方ほしいなら2回しないといけないと思うけど。
やりたいことが見えない。

435 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:37:47 ]
両方欲しい場合、自前でループを廻せばワンパスで振り分けできるけど、
Linqで同じようにできないか、っていう質問だろうね。
気持ちは分かるけど多分できないんだろうなあ。

Linqの想定用途はあくまで選択や射影の簡略化だろうし、振り分け処理で
無理矢理Linq使う必要無いんじゃない?と思う。foreachでいいじゃん。

436 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 19:49:14 ]
そういうメソッドを自作すればいい。
IEnumerable<T>受け取ってTuple<IEnumerable<T>, IEnumearble<T>>でもを返すようにしてさ。

437 名前:432 mailto:sage [2009/09/27(日) 19:58:37 ]
優先度のある条件を集合に適用する処理を
以下のように書きました。

foreach(var 条件 in 条件リスト){
var マッチしたもの = 集合.Where(条件)
集合 = 集合.Where(!条件)
 (マッチしたものに対する処理)
}

というループを書いていたのですが、
ruby の partition メソッドみたいなのがあれば
一回ですむじゃん。
と思ったのですが、ヘルプをみてもわからず、
ググってもわからず、なので質問させていただきました。

処理が重いので1パスにしたいというわけではないので、
2回 Where するままにしておきます。

レスありがとうございました。



438 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 20:11:24 ]
やりたいのはこういうこと?

Func<int, bool> cond = x => x % 2 == 0;
var q =
from x in new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, }
let b = cond(x)
group x by b;

var even = q.First(x => x.Key);
var odd = q.First(x => !x.Key);


439 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 21:04:04 ]
だね。
ruby の partition メソッドはズバりGroupBy。
ToLookupはその即時評価版。

440 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 02:41:06 ]
ToLookupなんてあるんだな。
おもしろそうだからこれを使ってFizzBuzzをといてみた。


var nums = Enumerable.Range(1, 100);

var fizzbuzz = nums.ToLookup(num => (num % 15 == 0 ? "fizzBuzz" : (num % 5 == 0 ? "Buzz" : (num % 3 == 0 ? "fizz" : "Other"))), arg => arg);

foreach (var group in fizzbuzz)
{
Console.WriteLine("*****" + group.Key + "*****");
foreach (var num in group)
Console.WriteLine(num.ToString());
}

441 名前:デフォルトの名無しさん [2009/10/10(土) 19:43:10 ]
プログラミングC#でLINQの項目をちょっと読んでみたが、
C#のコード中に普通にselectとかfromとか書くのは違和感あるなぁ。
C#の予約語になってんのかね?


442 名前:デフォルトの名無しさん mailto:sage [2009/10/10(土) 19:44:40 ]
>>441
文脈キーワード






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<142KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef