VisualStudio2008より追加された便利で強力な機能
統合言語クエリ (LINQ : Language Integrated Query)
ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。
【VB.NET】LINQ友の会【C#, C♯, C#】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2008/02/09(土) 23:51:34422デフォルトの名無しさん
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); }
}
{
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); }
}
424デフォルトの名無しさん
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>>();
source.Select((x, i) => new { Key = i / n, Element = x })
.GroupBy(x => x.Key, x => x.Element)
.Cast<IEnumerable<TSource>>();
425デフォルトの名無しさん
2009/09/16(水) 06:48:18 まあどっちでもいいんじゃない?
拡張メソッドはガンガン使うべきなのかは迷うところ。
拡張メソッドはガンガン使うべきなのかは迷うところ。
426デフォルトの名無しさん
2009/09/16(水) 21:47:09 イベントをLINQっぽく操れるリアクティブフレームワークってのを最近知ってからというもの
.NET4.0とラブプラスのことで頭が一杯です。
.NET4.0とラブプラスのことで頭が一杯です。
427422
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);
}
メモリは食うけどこっちの方が確実
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デフォルトの名無しさん
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];
}
こんなの用意して代わりに使うか
static IEnumerable<TSource> SkipTake<TSource>(TSource[] source, int skip, int take) {
for (int i = 0; i < take; i++) yield return source[i + skip];
}
429デフォルトの名無しさん
2009/09/17(木) 17:10:47 次はforをForEach()にするんですね
430デフォルトの名無しさん
2009/09/17(木) 19:00:29 427のはあまり良くないと思う。
422のyield return bufを
yield return buf.ToArray()に変えるだけで良いかと。
あと最後はbuf.Take(i)でいいかな。
422のyield return bufを
yield return buf.ToArray()に変えるだけで良いかと。
あと最後はbuf.Take(i)でいいかな。
431デフォルトの名無しさん
2009/09/17(木) 19:07:12 sourceがIList<TSource>を実装しているか否かで場合分けするのが効率的か
432デフォルトの名無しさん
2009/09/27(日) 19:20:03 条件に合うものと合わないものを分けるために、
bar = foo.Select(i=>Baz(i) );
foo = foo.Select(i=>!Baz(i));
みたいに2回Selectしてるんですが、
1回で済む方法ないですか?
bar = foo.Select(i=>Baz(i) );
foo = foo.Select(i=>!Baz(i));
みたいに2回Selectしてるんですが、
1回で済む方法ないですか?
433432
2009/09/27(日) 19:23:15 間違いました。 where を2回です。
434デフォルトの名無しさん
2009/09/27(日) 19:24:56 欲しいのはどっちなの?
両方ほしいなら2回しないといけないと思うけど。
やりたいことが見えない。
両方ほしいなら2回しないといけないと思うけど。
やりたいことが見えない。
435デフォルトの名無しさん
2009/09/27(日) 19:37:47 両方欲しい場合、自前でループを廻せばワンパスで振り分けできるけど、
Linqで同じようにできないか、っていう質問だろうね。
気持ちは分かるけど多分できないんだろうなあ。
Linqの想定用途はあくまで選択や射影の簡略化だろうし、振り分け処理で
無理矢理Linq使う必要無いんじゃない?と思う。foreachでいいじゃん。
Linqで同じようにできないか、っていう質問だろうね。
気持ちは分かるけど多分できないんだろうなあ。
Linqの想定用途はあくまで選択や射影の簡略化だろうし、振り分け処理で
無理矢理Linq使う必要無いんじゃない?と思う。foreachでいいじゃん。
436デフォルトの名無しさん
2009/09/27(日) 19:49:14 そういうメソッドを自作すればいい。
IEnumerable<T>受け取ってTuple<IEnumerable<T>, IEnumearble<T>>でもを返すようにしてさ。
IEnumerable<T>受け取ってTuple<IEnumerable<T>, IEnumearble<T>>でもを返すようにしてさ。
437432
2009/09/27(日) 19:58:37 優先度のある条件を集合に適用する処理を
以下のように書きました。
foreach(var 条件 in 条件リスト){
var マッチしたもの = 集合.Where(条件)
集合 = 集合.Where(!条件)
(マッチしたものに対する処理)
}
というループを書いていたのですが、
ruby の partition メソッドみたいなのがあれば
一回ですむじゃん。
と思ったのですが、ヘルプをみてもわからず、
ググってもわからず、なので質問させていただきました。
処理が重いので1パスにしたいというわけではないので、
2回 Where するままにしておきます。
レスありがとうございました。
以下のように書きました。
foreach(var 条件 in 条件リスト){
var マッチしたもの = 集合.Where(条件)
集合 = 集合.Where(!条件)
(マッチしたものに対する処理)
}
というループを書いていたのですが、
ruby の partition メソッドみたいなのがあれば
一回ですむじゃん。
と思ったのですが、ヘルプをみてもわからず、
ググってもわからず、なので質問させていただきました。
処理が重いので1パスにしたいというわけではないので、
2回 Where するままにしておきます。
レスありがとうございました。
438デフォルトの名無しさん
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);
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デフォルトの名無しさん
2009/09/27(日) 21:04:04 だね。
ruby の partition メソッドはズバりGroupBy。
ToLookupはその即時評価版。
ruby の partition メソッドはズバりGroupBy。
ToLookupはその即時評価版。
440デフォルトの名無しさん
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());
}
おもしろそうだからこれを使って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#の予約語になってんのかね?
C#のコード中に普通にselectとかfromとか書くのは違和感あるなぁ。
C#の予約語になってんのかね?
442デフォルトの名無しさん
2009/10/10(土) 19:44:40 >>441
文脈キーワード
文脈キーワード
443デフォルトの名無しさん
2009/10/13(火) 12:02:58 LINQって別に最適プランとか計算しないんでしょ?
ほんのちょっと前までデータベースからデータを「SELECT * FROM TABLE」で持ってきて
コード内でデータの取捨を行うなんて、やっちゃだめの最右翼だったのに、すんげえ
富豪的プログラミングだなあ…。
ほんのちょっと前までデータベースからデータを「SELECT * FROM TABLE」で持ってきて
コード内でデータの取捨を行うなんて、やっちゃだめの最右翼だったのに、すんげえ
富豪的プログラミングだなあ…。
444デフォルトの名無しさん
2009/10/13(火) 12:30:06 WHERE句はあるには有るけど
内部で式評価を最適化しているわけではない
内部で式評価を最適化しているわけではない
445デフォルトの名無しさん
2009/10/13(火) 12:54:50 Linq to Objectにはプランナはない。命令の順番で処理される。
Linq to SQLやEntity Frameworkの場合はDBMSのSQLに翻訳されるから、
DBMSのプランナが機能する。
Linq to SQLやEntity Frameworkの場合はDBMSのSQLに翻訳されるから、
DBMSのプランナが機能する。
446デフォルトの名無しさん
2009/10/13(火) 19:08:08 LINQ to SQLって、要するに式ツリーからSQLを生成するORMという理解でOK?
447デフォルトの名無しさん
2009/10/13(火) 19:17:58 LINQ to SQLの中身がわかってない奴が多いのな。
とりあえずDataContext.Logで吐かれるSQLを確認するところから
はじめたらどうだ?
とりあえずDataContext.Logで吐かれるSQLを確認するところから
はじめたらどうだ?
448デフォルトの名無しさん
2009/10/13(火) 20:29:13 ですな。
>>443 のような酷い勘違いは初めて見たけど。
>>443 のような酷い勘違いは初めて見たけど。
449デフォルトの名無しさん
2009/10/13(火) 20:40:37 LINQ to Objectsを最適化するとしたら,DynamicMethodでインライン展開かなあ
コード生成のコストが高いからあんまり意味なさそう
コード生成のコストが高いからあんまり意味なさそう
450デフォルトの名無しさん
2009/10/13(火) 21:37:17451デフォルトの名無しさん
2009/10/13(火) 23:25:35 >>446
そう。ただ実行の度に発行される。ToList()すりゃ1回ですむけども。
そう。ただ実行の度に発行される。ToList()すりゃ1回ですむけども。
452デフォルトの名無しさん
2009/10/26(月) 18:34:12 /)
///) ノ´⌒`ヽ
/,.=゛''"/γ⌒´ \
/ i f ,.r='"-‐'つ ""´ ⌒\ )
/ / _,.-‐'~ \ / i ) こまけぇことはいいんだよ!!
/ ,i ,二ニ⊃ (・ )` ´( ・) i,/
/ ノ il゛フl (__人_). |
,イ「ト、 ,!,! \ `ー' /
/ iトヾヽ_/ィ" `7 〈
///) ノ´⌒`ヽ
/,.=゛''"/γ⌒´ \
/ i f ,.r='"-‐'つ ""´ ⌒\ )
/ / _,.-‐'~ \ / i ) こまけぇことはいいんだよ!!
/ ,i ,二ニ⊃ (・ )` ´( ・) i,/
/ ノ il゛フl (__人_). |
,イ「ト、 ,!,! \ `ー' /
/ iトヾヽ_/ィ" `7 〈
453デフォルトの名無しさん
2009/11/07(土) 12:28:38 データは作成する回数よりも参照される回数の方が多いわけで、
キャッシュがないから遅延されても重くなるだけじゃないか?
結局はToList()しまくるハメになっている気がする。
キャッシュがないから遅延されても重くなるだけじゃないか?
結局はToList()しまくるハメになっている気がする。
454デフォルトの名無しさん
2009/11/07(土) 13:04:29 SQLはちゃらっと書く分には楽だな。
最適化とか考えてくとだんだんめんどくさくなりそうだけど。
つーかいい加減データアクセスモデルはナイスな奴一つにまとめてくれ。
Oslo?
最適化とか考えてくとだんだんめんどくさくなりそうだけど。
つーかいい加減データアクセスモデルはナイスな奴一つにまとめてくれ。
Oslo?
455デフォルトの名無しさん
2009/11/07(土) 19:58:09 確かにMSは昔からデータアクセスの新方式を乱発しすぎなんだよな。
456デフォルトの名無しさん
2009/11/09(月) 14:02:34 遅延評価も即時評価も都合に合わせて選択できるってことで
今のモデルで悪くないと思うがな。
そもそも本当にチューニングが必要な場所ならLinqは使わないだろ。
性能云々うるさいやつ向けに..Optimize()あたりを追加してみるか?
今のモデルで悪くないと思うがな。
そもそも本当にチューニングが必要な場所ならLinqは使わないだろ。
性能云々うるさいやつ向けに..Optimize()あたりを追加してみるか?
457デフォルトの名無しさん
2009/11/09(月) 17:37:01 手段がいろいろ用意されて軽く破綻してるC++の二の舞ですね
パラダイムを混ぜこぜにするとよく起こる
パラダイムを混ぜこぜにするとよく起こる
458デフォルトの名無しさん
2009/11/10(火) 17:39:44 結局のところ記述性と性能はトレードオフなんだよ
459デフォルトの名無しさん
2009/11/13(金) 00:55:32 え、いや、Linq の遅延評価は記述性って言うか
スケーラビリティ?だべ。要素数がドカーンって
なっても使えるという意味での。
スケーラビリティ?だべ。要素数がドカーンって
なっても使えるという意味での。
460デフォルトの名無しさん
2009/11/15(日) 02:05:16 SelectMany の戻り値に一つだけ要素を足したいです。
今は、
var list = new List<T>();
list.Add(item);
list.AddRange(foo.SelectMany(i => bar(i)));
のように書いてますが、なんか
冗長な気がします。
1個要素を足すためだけに List のインスタンスを
生成するのは無駄な気がするんですが、
避ける方法ないでしょうか?
今は、
var list = new List<T>();
list.Add(item);
list.AddRange(foo.SelectMany(i => bar(i)));
のように書いてますが、なんか
冗長な気がします。
1個要素を足すためだけに List のインスタンスを
生成するのは無駄な気がするんですが、
避ける方法ないでしょうか?
461460
2009/11/15(日) 02:16:19 すまん、Concat を見つけた。
foo.SelectMany(i=>bar(i)).Concat(new[]{ item });
と書けた。
でも、配列生成してんのが無駄な気がするが、
回避する方法ないよね?
( new List<T>(){ item } とかは無しでw)
foo.SelectMany(i=>bar(i)).Concat(new[]{ item });
と書けた。
でも、配列生成してんのが無駄な気がするが、
回避する方法ないよね?
( new List<T>(){ item } とかは無しでw)
462デフォルトの名無しさん
2009/11/15(日) 03:02:15 () => { yield return item; }
463デフォルトの名無しさん
2009/11/15(日) 10:18:15 ラムダ内をイテレーターブロックにはできないよ。
やるなら、拡張メソッド追加して、
public static IEnumerable<T> Concat(this T x, IEnumerable<T> list)
{
yield return x; foreach(var i in list) yield return i;
}
public static IEnumerable<T> Concat(this IEnumerable<T> list, T x)
{
foreach(var i in list) yield return i; yield return x;
}
やるなら、拡張メソッド追加して、
public static IEnumerable<T> Concat(this T x, IEnumerable<T> list)
{
yield return x; foreach(var i in list) yield return i;
}
public static IEnumerable<T> Concat(this IEnumerable<T> list, T x)
{
foreach(var i in list) yield return i; yield return x;
}
464デフォルトの名無しさん
2009/11/15(日) 11:46:45 >>461
Enumerable.Repeat(item, 1) で回避。
Enumerable.Repeat(item, 1) で回避。
465デフォルトの名無しさん
2009/11/15(日) 12:01:40 拡張メソッドにT使えたっけ?
466デフォルトの名無しさん
2009/11/15(日) 12:17:35 Concat<T>が正解ね
467デフォルトの名無しさん
2009/11/15(日) 16:28:58468467
2009/11/15(日) 16:30:40 間違えたRepeatか
469デフォルトの名無しさん
2009/12/11(金) 00:11:22 Linq to Object で List 内のデータを取り出した時に、そのデータを変更することはできるのでしょうか?
Linq to Object では、抽出するだけなのでしょうか?
Linq to Object では、抽出するだけなのでしょうか?
470デフォルトの名無しさん
2009/12/11(金) 00:17:14 >>469
List 自体の更新?
LINQ 以前に、GetEnumerator で列挙してる最中にリストのアップデートかけちゃダメ。
list[i] = xxx; 的なことがしたいって場合も、GetEnumerator じゃ無理。
list[i].Property = xxx; 的なことなら、
foreach (var x in list.Select(xxx)) x.Property = xxx; で可能。
List 自体の更新?
LINQ 以前に、GetEnumerator で列挙してる最中にリストのアップデートかけちゃダメ。
list[i] = xxx; 的なことがしたいって場合も、GetEnumerator じゃ無理。
list[i].Property = xxx; 的なことなら、
foreach (var x in list.Select(xxx)) x.Property = xxx; で可能。
471469
2009/12/11(金) 23:15:10472デフォルトの名無しさん
2009/12/12(土) 14:18:30 ちなみに、標準では Foreach メソッドみたいなのないけど、
それを認めると LINQ 中で副作用起こすのを推奨しちゃうことになるから避けたらしい。
list.Select(x => xxx).Foreach(x => x.Property = xxx);
みたいなのは邪道。
LINQ 中では副作用は起こさないこと推奨。
それを認めると LINQ 中で副作用起こすのを推奨しちゃうことになるから避けたらしい。
list.Select(x => xxx).Foreach(x => x.Property = xxx);
みたいなのは邪道。
LINQ 中では副作用は起こさないこと推奨。
473デフォルトの名無しさん
2009/12/12(土) 14:47:28 なれていない人って偶に
int count = 0; var distList = from i in srcList select new { Val=i, Index=++count };
みたいな事をやっちゃうよねw
そういうノウハウってどこかにまとまっていないのだろうか?
MSDNにLINQの使い方ガイドラインってないよね?
int count = 0; var distList = from i in srcList select new { Val=i, Index=++count };
みたいな事をやっちゃうよねw
そういうノウハウってどこかにまとまっていないのだろうか?
MSDNにLINQの使い方ガイドラインってないよね?
474デフォルトの名無しさん
2009/12/12(土) 15:48:41 外部スコープの変数を書き換えるといろいろ副作用が怖いね。
よほど理解して使わないと。
よほど理解して使わないと。
475デフォルトの名無しさん
2009/12/12(土) 18:32:10 副作用?そんな表現はじめて聞いた。
msが言ってるの?
msが言ってるの?
476デフォルトの名無しさん
2009/12/12(土) 18:45:02 一般的な言葉じゃないか?
「ifの中に副作用のある式を書くな」なんて昔から言われているし
「ifの中に副作用のある式を書くな」なんて昔から言われているし
477デフォルトの名無しさん
2009/12/12(土) 18:50:51 Linqというよりそこで使われてる静的クロージャの問題。
.NET2.0でクロージャが実装されたとき有名になったプログラム。
i, j がどんな値になるか想像つく?
using System;
using System.Collections.Generic;
delegate void F();
class Test {
static void Main() {
List<F> actionList = new List<F>();
for(int i = 0; i < 10; ++i) {
int j = i;
actionList.Add(delegate(){Console.WriteLine("i={0}, j={1}",i, j);});
}
foreach (F f in actionList) f();
}
}
.NET2.0でクロージャが実装されたとき有名になったプログラム。
i, j がどんな値になるか想像つく?
using System;
using System.Collections.Generic;
delegate void F();
class Test {
static void Main() {
List<F> actionList = new List<F>();
for(int i = 0; i < 10; ++i) {
int j = i;
actionList.Add(delegate(){Console.WriteLine("i={0}, j={1}",i, j);});
}
foreach (F f in actionList) f();
}
}
478デフォルトの名無しさん
2009/12/12(土) 20:20:23 LINQの副作用関連でのエンバグは、>>477以外に遅延評価に原因しているものもあると思う
標準的な使い方である「LINQ中でselect new」すら副作用のある式なわけで
(戻り値を使う場所も含め)ちゃんとその挙動まで把握しないと不味い。
var hoges = from p in hoge select new Hoge(p);
foreach(var hoge in hoges) { hoge.ValueChanged += Hoge_OnValueChanged(); }
foreach(var hoge in hoges) { hoge.Value = 3; } // Hoge_OnValueChanged………?
そこまで考慮している保証のないクラスや関数に
値を渡す/返す場合は常にToArray/ToListするのが正解か
標準的な使い方である「LINQ中でselect new」すら副作用のある式なわけで
(戻り値を使う場所も含め)ちゃんとその挙動まで把握しないと不味い。
var hoges = from p in hoge select new Hoge(p);
foreach(var hoge in hoges) { hoge.ValueChanged += Hoge_OnValueChanged(); }
foreach(var hoge in hoges) { hoge.Value = 3; } // Hoge_OnValueChanged………?
そこまで考慮している保証のないクラスや関数に
値を渡す/返す場合は常にToArray/ToListするのが正解か
479デフォルトの名無しさん
2009/12/13(日) 03:24:35 そりゃそうだろw
何言ってんのw
何言ってんのw
480デフォルトの名無しさん
2009/12/13(日) 03:41:07 >477
のは気をつけないと忘れてて、あれうごかねぇとかたまにやるw最近は体が覚えてきたが。
>478
うちのバカエンジニアとかでもおなじようなことしてそうでこえぇ。
のは気をつけないと忘れてて、あれうごかねぇとかたまにやるw最近は体が覚えてきたが。
>478
うちのバカエンジニアとかでもおなじようなことしてそうでこえぇ。
481デフォルトの名無しさん
2009/12/13(日) 19:31:28 >>479
自分一人ならこういうノウハウもすぐに納得して「そりゃそうだ」で済ませれるが、
仕事でチームでやっていると全員がLINQを理解しているわけじゃないから、そうもいかないのよね。
気がつくと新人がコメントに「//なぜかこのToListを外すとぬるぽ」とか書いてたりするw
自分一人ならこういうノウハウもすぐに納得して「そりゃそうだ」で済ませれるが、
仕事でチームでやっていると全員がLINQを理解しているわけじゃないから、そうもいかないのよね。
気がつくと新人がコメントに「//なぜかこのToListを外すとぬるぽ」とか書いてたりするw
482デフォルトの名無しさん
2009/12/14(月) 13:13:04 そんなこと言ってたら新しいことなんもできんやろ
未熟な人間にあわせてどうすんねんw
未熟な人間にあわせてどうすんねんw
483デフォルトの名無しさん
2009/12/14(月) 17:16:24 まともな業務アプリの開発だと、LINQでDBアクセスなんてしないから(つーか、したらバカ)
そんなに大して問題にはならない。
クライアントサイドでリスト形式の一時データを参照をする場合になら使える程度だと思う。
そんなに大して問題にはならない。
クライアントサイドでリスト形式の一時データを参照をする場合になら使える程度だと思う。
484デフォルトの名無しさん
2009/12/14(月) 17:30:49 そうは言ってもLinqなしでEntityFrameworkを使うのはつらいぞ(笑
自分の理解できないものを嫌う気持ちもわからんではないがね。
そういう人はLinq以前にORMも使えないのだろう。
自分の理解できないものを嫌う気持ちもわからんではないがね。
そういう人はLinq以前にORMも使えないのだろう。
485デフォルトの名無しさん
2009/12/14(月) 22:08:07486デフォルトの名無しさん
2009/12/15(火) 06:45:06 LINQ漬けになるとトランザクションを意識しない楽観的な思考になりやすい。
そしてDB更新系で落とし穴に。。。
そしてDB更新系で落とし穴に。。。
487デフォルトの名無しさん
2009/12/15(火) 22:32:42 TransactionScope 使えるんだし大丈夫じゃね?
488デフォルトの名無しさん
2010/01/15(金) 22:13:23 ・意味不明な所で例外が起こってトラブったら、LINQの遅延評価が原因だったでござる。
・想定外の値が返ってくると思ったら、LINQの遅延評価+キャプチャが原因だったでござる。
・新人が遅延評価+ソースの値の変更を前提としたコードを作っていたでござる
コードの各所に見えない依存関係ができてもうやだ…
自分のコードは副作用のないようにしているが、他人のコードはどこまで追っかけても分からん…
・想定外の値が返ってくると思ったら、LINQの遅延評価+キャプチャが原因だったでござる。
・新人が遅延評価+ソースの値の変更を前提としたコードを作っていたでござる
コードの各所に見えない依存関係ができてもうやだ…
自分のコードは副作用のないようにしているが、他人のコードはどこまで追っかけても分からん…
489デフォルトの名無しさん
2010/01/16(土) 01:16:01 .Selectで検索して全部ToList()すれば?w
490デフォルトの名無しさん
2010/01/16(土) 01:49:49 遅延評価前提ってのは別にいいんじゃないの?
後段に更に条件を繋げられるようになるのだから、指針としては悪くない。
キャプチャのほうは本当に注意深くやらなきゃいけないのに、無頓着な人いるよね……
後段に更に条件を繋げられるようになるのだから、指針としては悪くない。
キャプチャのほうは本当に注意深くやらなきゃいけないのに、無頓着な人いるよね……
491デフォルトの名無しさん
2010/01/16(土) 10:37:33 チーム規約で、ToList 必須にしちまえば?
492デフォルトの名無しさん
2010/01/16(土) 10:40:55 キャプチャってどういう意味?
わからないから聞いちゃう><
わからないから聞いちゃう><
493デフォルトの名無しさん
2010/01/16(土) 14:50:19 頼み方が悪いから教えない
494デフォルトの名無しさん
2010/01/16(土) 14:50:23 クロージャで外のローカル変数を取り込むやつかな
それを利用して長く状態持たせたりすると凶悪
それを利用して長く状態持たせたりすると凶悪
495デフォルトの名無しさん
2010/01/16(土) 14:55:39 それでもGCがなんとかしてくれるんでしょ?
もしかしてunsafeがらみの話?
もしかしてunsafeがらみの話?
496デフォルトの名無しさん
2010/01/16(土) 15:05:45 そういう話じゃなくてさ
int i = 0;
otherClass.Items = source..Where(x=>x.Value == i++);
こんなことされるともうどうなるか分からないだろ
OtherClassのItemsの評価回数に依存することになる
int i = 0;
otherClass.Items = source..Where(x=>x.Value == i++);
こんなことされるともうどうなるか分からないだろ
OtherClassのItemsの評価回数に依存することになる
497デフォルトの名無しさん
2010/01/16(土) 21:53:13498デフォルトの名無しさん
2010/02/04(木) 18:12:53 すみません、質問です。
LINQには、バージョンはあるのでしょうか?
VS等のバージョンはどんどんとあがっていっていますが、
コードが同じもので動かなくなるかどうかを知りたいです。
例えば、CLRに完全依存の構造なので、CLRバージョンが変わる時に
注意が必要、など
LINQには、バージョンはあるのでしょうか?
VS等のバージョンはどんどんとあがっていっていますが、
コードが同じもので動かなくなるかどうかを知りたいです。
例えば、CLRに完全依存の構造なので、CLRバージョンが変わる時に
注意が必要、など
499デフォルトの名無しさん
2010/02/04(木) 20:54:49 基本的に上位互換だから気にしなくていい
500デフォルトの名無しさん
2010/02/05(金) 13:27:50 すみません、質問です。
LINQで更新や削除は行えるのでしょうか?
たとえ行えたとしても、細かい制御が出来ないからADO.NETで
ExecuteNonQuery使った方が楽っていう結論になってたりするのかな?
LINQで更新や削除は行えるのでしょうか?
たとえ行えたとしても、細かい制御が出来ないからADO.NETで
ExecuteNonQuery使った方が楽っていう結論になってたりするのかな?
501デフォルトの名無しさん
2010/02/05(金) 13:29:30 Linq to SQL
Linq to Entity
両方ともORMだから可能。
Linq to Entity
両方ともORMだから可能。
502デフォルトの名無しさん
2010/02/05(金) 13:52:18 いったんエンティティに読み込むから大域処理には向いてないな。
503デフォルトの名無しさん
2010/02/05(金) 19:05:38 一括更新用の拡張メソッドを作っている人達もいるな。
504デフォルトの名無しさん
2010/02/05(金) 19:26:15 テーブルは第3正規化がされているのが普通だし、多数の表の集合演算が入るから
結局はエンティティと対になるストアドプロシージャを組んでしまう。LINQ気持ち悪い。
結局はエンティティと対になるストアドプロシージャを組んでしまう。LINQ気持ち悪い。
505デフォルトの名無しさん
2010/02/05(金) 21:36:19 LINQは排他制御がきちい
506デフォルトの名無しさん
2010/02/07(日) 17:03:06 L2Sは更新がちょっとという人は、DataContext.GetCommand(query).CommandTextで取得した
WHERE句を元にUPDATE句やDELETE句を組み立てて、DataContext.ExecuteCommand()を実行する
ような拡張メソッドを用意するのが良いと思うよ。
そうすれば、更新処理はADO.NETを使ってベタでとかやらずに、トランザクションや排他に
ついてはExecuteNonQueryと同じ考え方で設計出来るから。
っで、それ以上の事をやりたくなったらストアドで。
WHERE句を元にUPDATE句やDELETE句を組み立てて、DataContext.ExecuteCommand()を実行する
ような拡張メソッドを用意するのが良いと思うよ。
そうすれば、更新処理はADO.NETを使ってベタでとかやらずに、トランザクションや排他に
ついてはExecuteNonQueryと同じ考え方で設計出来るから。
っで、それ以上の事をやりたくなったらストアドで。
507デフォルトの名無しさん
2010/02/08(月) 01:17:13 >>506
結局はSQLを書くってこと?LINQの意味なくない?
結局はSQLを書くってこと?LINQの意味なくない?
508デフォルトの名無しさん
2010/02/08(月) 06:55:49 この辺を参考に。
ttp://weblogs.asp.net/jeffreyzhao/archive/2008/03/06/linq-to-sql-extension-batch-deletion-by-lambda-expression.aspx
ttp://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx
ttp://weblogs.asp.net/jeffreyzhao/archive/2008/03/06/linq-to-sql-extension-batch-deletion-by-lambda-expression.aspx
ttp://www.aneyfamily.com/terryandann/post/2008/04/Batch-Updates-and-Deletes-with-LINQ-to-SQL.aspx
509デフォルトの名無しさん
2010/02/13(土) 17:28:02 Distinct重複は取り除けるけど、重複しているものだけを
取り出すには、どうすればいい
取り出すには、どうすればいい
510デフォルトの名無しさん
2010/02/13(土) 17:48:11 groupbyしてwhere count>2って感じ。
511デフォルトの名無しさん
2010/02/13(土) 18:48:06 >>510 サンクス
int[] numbers = { 5, 4, 1, 3, 9, 5, 8, 4, 6, 7, 2, 5, 0 };
var Nums = numbers.GroupBy(num => num).Where(num => num.Count() >= 2);
foreach (var x in Nums)
Console.WriteLine("{0}:{1}",x.Key,x.Count());
int[] numbers = { 5, 4, 1, 3, 9, 5, 8, 4, 6, 7, 2, 5, 0 };
var Nums = numbers.GroupBy(num => num).Where(num => num.Count() >= 2);
foreach (var x in Nums)
Console.WriteLine("{0}:{1}",x.Key,x.Count());
512デフォルトの名無しさん
2010/02/13(土) 19:27:29 そこらへんはLINQというよりSQLのセンスだよな。
513デフォルトの名無しさん
2010/02/13(土) 20:55:57 LINQ 初めて使ってみたけどなんか面白いね
ていうか拡張メソッドが面白いのか
ていうか拡張メソッドが面白いのか
514デフォルトの名無しさん
2010/02/13(土) 20:59:49 何も考えずに乱用すると破綻するけどねw
515デフォルトの名無しさん
2010/02/13(土) 21:50:24 基本DBはストアドを呼び出し。もし必要であればEntityの複合型データにLINQ。
という使い分け。テーブルには絶対にLINQでアクセスしない。
MVVMデザインアプローチで組んでいるが、まずLINQの出番はない。
という使い分け。テーブルには絶対にLINQでアクセスしない。
MVVMデザインアプローチで組んでいるが、まずLINQの出番はない。
516デフォルトの名無しさん
2010/02/13(土) 21:57:31 Linq to Object は使うわ
517デフォルトの名無しさん
2010/02/13(土) 22:22:07 >>514
やべえ調子に乗って使いまくるところだったww
やべえ調子に乗って使いまくるところだったww
518デフォルトの名無しさん
2010/02/13(土) 23:04:13 自分は、L2Sに関しては式ツリーからSQLを生成するライブラリだという捉え方。
他のLINQ to ホゲホゲについてはまた別の捉え方だけど。
他のLINQ to ホゲホゲについてはまた別の捉え方だけど。
519デフォルトの名無しさん
2010/02/13(土) 23:06:47 メソッド形式のto Objectsは普通に便利
メソッド形式で使ってる限りはループで書くのに比べて見づらくなることもまず無いし
メソッド形式で使ってる限りはループで書くのに比べて見づらくなることもまず無いし
520デフォルトの名無しさん
2010/02/13(土) 23:16:26 to IQueryableなものとto IEnumerableなものでは考え方は違うわな。
521デフォルトの名無しさん
2010/02/14(日) 00:03:10 LINQはCollectionデータだけを対象にして使う分にはいいね。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「おこめ券は米以外の食品も買える。効果的な活用を」 地元で農水相 [山形県] [少考さん★]
- 【速報】「女芸人No.1決定戦 THE W」9代目女王にニッチェ! 7年ぶり3度目で悲願の優勝 [牛丼★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- 今年の流行語大賞 『働いて働いて働いてまいります』が受賞で不快感… 過労自殺の遺族らが会見「家族にむち打つような行為だ」 [冬月記者★]
- 【東京】「家族で話題にして」 “世田谷一家殺害から25年 警視庁が呼びかけ [煮卵★]
- 【広島】ペルー女性の国保加入を誤って認め、福山市が医療費484万円を肩代わりするミス…入院して手術を受ける [ぐれ★]
