VisualStudio2008より追加された便利で強力な機能
統合言語クエリ (LINQ : Language Integrated Query)
ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。
探検
【VB.NET】LINQ友の会【C#, C♯, C#】
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2008/02/09(土) 23:51:3410395
2008/02/23(土) 02:36:28 >>99
あー、ごめん、関数型言語とごっちゃになってた。
C#なら95の最初の手順を
・sum、factあたりを通常の関数で書く
でいいな。確かに再帰とかいらない。
蛇足ですが、あなたの対象とする「初心者」像がいまいちわからないのが
少し気になります。
あー、ごめん、関数型言語とごっちゃになってた。
C#なら95の最初の手順を
・sum、factあたりを通常の関数で書く
でいいな。確かに再帰とかいらない。
蛇足ですが、あなたの対象とする「初心者」像がいまいちわからないのが
少し気になります。
104デフォルトの名無しさん
2008/02/23(土) 03:22:34105デフォルトの名無しさん
2008/02/23(土) 10:15:51 Selectが X->Y のマップになってるのはちょっと名前がわかり辛くて見つけられなかったな
duck typing(?)とかいう手法で Map :: X[] -> (X -> Y) -> Y[] を作っちゃった
拡張性も結構あるしガクジュツ的ではなくちゃんと実務に沿って開発しやすくなるような言語拡張だからLINQは流行ると思う
duck typing(?)とかいう手法で Map :: X[] -> (X -> Y) -> Y[] を作っちゃった
拡張性も結構あるしガクジュツ的ではなくちゃんと実務に沿って開発しやすくなるような言語拡張だからLINQは流行ると思う
106デフォルトの名無しさん
2008/02/23(土) 13:41:16 Enumerable.ForEachがほしい
107デフォルトの名無しさん
2008/02/23(土) 14:51:39 要望出してSP1に入れさせようぜ
108デフォルトの名無しさん
2008/02/23(土) 14:52:38 >>106 自分で作りなはれ。自分は作った。
109デフォルトの名無しさん
2008/02/23(土) 14:56:38 晒して
110デフォルトの名無しさん
2008/02/23(土) 15:10:50 void ForEach<T>(this IEnumerable<T> source, Action<T> action) {
foreach(T item in source) action(item);
}
ただこれだけのことだけど
こんなことしちゃうとコード全体がガラッと変わるから非公式にやるのは抵抗がある
foreach(T item in source) action(item);
}
ただこれだけのことだけど
こんなことしちゃうとコード全体がガラッと変わるから非公式にやるのは抵抗がある
111デフォルトの名無しさん
2008/02/23(土) 15:17:25 なんでもかんでも一行でやろうとするのはC#的じゃないだろ
foreachぐらい分けて書こうぜ
foreachぐらい分けて書こうぜ
112デフォルトの名無しさん
2008/02/23(土) 15:42:04113デフォルトの名無しさん
2008/02/23(土) 16:44:36 foreachのみで簡潔に書けるものはforeachのみで良いと思います
foreach( var row in table ) 文 ;
これ以上何かをする必要はないだろうと思う、逆にややこしいだけだし。
はなしは変わって、http://ufcpp.net/study/csharp/sp3_stdqueryo.html#aggregate によると
> でも、メソッド提供だけでは、 join や let などがどうしてもきれいに表現できなかったので、
<やむなく SQL 風のクエリ式を導入したそうです。
>(プログラミング言語の中に別に言語を埋め込むというのはデメリットも大きくて、
>言語制作者にとっては結構ためらわれる行為。)
>(join や let をきれいに書くためには、どうしても透過識別子のような考え方が必要だった。)
という事らしいのですが、私は、むしろ逆で、これを見た瞬間λ式消滅、これは素晴らしい!!
と思ったものなんですが……
"Language Integrated" Query というぐらいですから、最初こちらがあったのだと想像していのですが逆だったんですね。
foreach にはλ式は登場しないので十分だと思っています。
foreach( var row in table ) 文 ;
これ以上何かをする必要はないだろうと思う、逆にややこしいだけだし。
はなしは変わって、http://ufcpp.net/study/csharp/sp3_stdqueryo.html#aggregate によると
> でも、メソッド提供だけでは、 join や let などがどうしてもきれいに表現できなかったので、
<やむなく SQL 風のクエリ式を導入したそうです。
>(プログラミング言語の中に別に言語を埋め込むというのはデメリットも大きくて、
>言語制作者にとっては結構ためらわれる行為。)
>(join や let をきれいに書くためには、どうしても透過識別子のような考え方が必要だった。)
という事らしいのですが、私は、むしろ逆で、これを見た瞬間λ式消滅、これは素晴らしい!!
と思ったものなんですが……
"Language Integrated" Query というぐらいですから、最初こちらがあったのだと想像していのですが逆だったんですね。
foreach にはλ式は登場しないので十分だと思っています。
114デフォルトの名無しさん
2008/02/23(土) 16:47:27 デザイナを使っているとdelegateやeventなんて全然意識しやいじゃないですか
ダブルクリックすれば勝手にコード登場となって、こういうややこしいものは後回しにして使い方を最初に知ることができる。
これがC#の良い点だと思うんですよ。
ダブルクリックすれば勝手にコード登場となって、こういうややこしいものは後回しにして使い方を最初に知ることができる。
これがC#の良い点だと思うんですよ。
115デフォルトの名無しさん
2008/02/23(土) 16:50:49 List<T>やArrayにはForEachがあるだろ
匿名メソッドよりも,普通のメソッドを直接渡すときに気持ちいいんだよね
list.ForEach(Console.WriteLine);みたいに
初めてみたときはびっくりしたけど
匿名メソッドよりも,普通のメソッドを直接渡すときに気持ちいいんだよね
list.ForEach(Console.WriteLine);みたいに
初めてみたときはびっくりしたけど
116デフォルトの名無しさん
2008/02/23(土) 16:59:23 普通にプログラミングしててもSelectやWhereは腐る程出てきて
それらを書くぶんにはクエリ式でなく拡張メソッド+ラムダ式の方がシンプルに書ける
ラムダ式は他にもプログラミングのあらゆる局面で使うと便利なことが多い
対してクエリ式はSelectManyやJoinなんかで使うとシンプルに書けるけど
そんなん滅多に使わん
それらを書くぶんにはクエリ式でなく拡張メソッド+ラムダ式の方がシンプルに書ける
ラムダ式は他にもプログラミングのあらゆる局面で使うと便利なことが多い
対してクエリ式はSelectManyやJoinなんかで使うとシンプルに書けるけど
そんなん滅多に使わん
117デフォルトの名無しさん
2008/02/23(土) 17:43:25 遅延評価のせいで,一旦必要な部分を評価しないといけないのか・・・
new[] { 1, 2, 3, 4, 5 }.Select(
x => {
Console.WriteLine(x);
return x;
}
).ToArray();
new[] { 1, 2, 3, 4, 5 }.Select(
x => {
Console.WriteLine(x);
return x;
}
).ToArray();
118デフォルトの名無しさん
2008/02/23(土) 18:06:36 遅延評価の問題すっかり忘れてた、あんまり意識する必要無いとおもったけど、デバッグ時にも面倒が起りますね。
あなたがその値を見るまでは値は計算されていませんって、まるでシュレディンガーの猫のような現象がありました。
あなたがその値を見るまでは値は計算されていませんって、まるでシュレディンガーの猫のような現象がありました。
119デフォルトの名無しさん
2008/02/23(土) 18:24:47 普通に書いたらええがな
120デフォルトの名無しさん
2008/02/23(土) 18:29:18 .ToList().ForEach(Console.WriteLine) でいいじゃん
121デフォルトの名無しさん
2008/02/23(土) 18:30:33 ToList超きもい
122デフォルトの名無しさん
2008/02/23(土) 18:32:42 遅延評価はLINQだと実態があいまいになりがちだがHaskellを使うと、なんというかテツガクしたくなる。
ものすごく面白いが、万人にお勧めではない。
ものすごく面白いが、万人にお勧めではない。
123デフォルトの名無しさん
2008/02/23(土) 18:35:44 IEnumerable<>でforeachするときの例っぽいの書こうとした^p^
124デフォルトの名無しさん
2008/02/27(水) 19:00:07 >>1 です
ちょっとスタイル変更、くだすれC#だと、配列よりも List クラスの方が需要ありそうだったので。
実際、実用上は配列って事はありえない気がしますし。
名前は全部漢字にして、型名には末尾に"型" と付けてみました。
ちょっとスタイル変更、くだすれC#だと、配列よりも List クラスの方が需要ありそうだったので。
実際、実用上は配列って事はありえない気がしますし。
名前は全部漢字にして、型名には末尾に"型" と付けてみました。
125デフォルトの名無しさん
2008/02/27(水) 19:00:49 Q.売上表で小計をもとめるような計算をしたい(1)
Aggregate が便利です。
以下の例では、合計原価と合計売価を求めます。解りやすさ優先で、型をすべて書ききったバージョンです。
System.Collections.Generic.List<売上帳の行型> 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// お試し表示
dataGridView1.DataSource = 売上帳;
// 合計の計算方法
合計型 合計の初期値 = new 合計型() { 合計原価 = 0, 合計売価 = 0 };
合計型 合計表 = 売上帳.Aggregate(
合計の初期値,
(合計型 直前の合計, 売上帳の行型 行) => new 合計型() { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 }
);
dataGridView2.DataSource = new 合計型[] { 合計表 };
public class 売上帳の行型 {
public string 品名 { get; set; }
public int 数量 { get; set; }
public int 原価 { get; set; }
public int 売価 { get; set; }
}
public struct 合計型 {
public int 合計原価 { get; set; }
public int 合計売価 { get; set; }
}
Aggregate が便利です。
以下の例では、合計原価と合計売価を求めます。解りやすさ優先で、型をすべて書ききったバージョンです。
System.Collections.Generic.List<売上帳の行型> 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// お試し表示
dataGridView1.DataSource = 売上帳;
// 合計の計算方法
合計型 合計の初期値 = new 合計型() { 合計原価 = 0, 合計売価 = 0 };
合計型 合計表 = 売上帳.Aggregate(
合計の初期値,
(合計型 直前の合計, 売上帳の行型 行) => new 合計型() { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 }
);
dataGridView2.DataSource = new 合計型[] { 合計表 };
public class 売上帳の行型 {
public string 品名 { get; set; }
public int 数量 { get; set; }
public int 原価 { get; set; }
public int 売価 { get; set; }
}
public struct 合計型 {
public int 合計原価 { get; set; }
public int 合計売価 { get; set; }
}
126デフォルトの名無しさん
2008/02/27(水) 19:01:50 >>125の続き 売上表で小計をもとめるような計算をしたい(2)
省けそうな型名は省略したバージョンです
var 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// お試し表示
dataGridView1.DataSource = 売上帳;
// 合計の計算方法
var 合計表 = 売上帳.Aggregate(
new { 合計原価 = 0, 合計売価 = 0 },
(直前の合計, 行) => new { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 }
);
dataGridView2.DataSource = new[] { 合計表 };
省けそうな型名は省略したバージョンです
var 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// お試し表示
dataGridView1.DataSource = 売上帳;
// 合計の計算方法
var 合計表 = 売上帳.Aggregate(
new { 合計原価 = 0, 合計売価 = 0 },
(直前の合計, 行) => new { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 }
);
dataGridView2.DataSource = new[] { 合計表 };
127デフォルトの名無しさん
2008/02/27(水) 19:03:01 >>126の続き 売上表で小計をもとめるような計算をしたい(3)
上記のコードが何をしているのかといいますと、以下のコードのような処理をしています。
var 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// お試し表示
dataGridView1.DataSource = 売上帳;
// 合計の計算方法
var 直前の合計 = new { 合計原価 = 0, 合計売価 = 0 };
foreach (売上帳の行型 行 in 売上帳)
{
直前の合計 = new { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 };
}
dataGridView2.DataSource = new[] { 直前の合計 };
上記のコードが何をしているのかといいますと、以下のコードのような処理をしています。
var 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// お試し表示
dataGridView1.DataSource = 売上帳;
// 合計の計算方法
var 直前の合計 = new { 合計原価 = 0, 合計売価 = 0 };
foreach (売上帳の行型 行 in 売上帳)
{
直前の合計 = new { 合計原価 = 直前の合計.合計原価 + 行.数量 * 行.原価, 合計売価 = 直前の合計.合計売価 + 行.数量 * 行.売価 };
}
dataGridView2.DataSource = new[] { 直前の合計 };
128デフォルトの名無しさん
2008/02/27(水) 19:04:24 >>127の続き 売上表で小計をもとめるような計算をしたい(4)
これを使うと簡単になるケース
合計型と売上帳の行型が同じなら、コードは単純になります
var 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// 合計の計算
var 合計行 = 売上帳.Aggregate((直前の合計, 現在の行) => new 売上帳の行型() { 原価 = 直前の合計.原価 + 現在の行.数量 * 現在の行.原価, 売価 = 直前の合計.売価 + 現在の行.数量 * 現在の行.売価, 品名 = "合計" });
売上帳.Add(合計行);
// お試し表示
dataGridView1.DataSource = 売上帳;
これを使うと簡単になるケース
合計型と売上帳の行型が同じなら、コードは単純になります
var 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// 合計の計算
var 合計行 = 売上帳.Aggregate((直前の合計, 現在の行) => new 売上帳の行型() { 原価 = 直前の合計.原価 + 現在の行.数量 * 現在の行.原価, 売価 = 直前の合計.売価 + 現在の行.数量 * 現在の行.売価, 品名 = "合計" });
売上帳.Add(合計行);
// お試し表示
dataGridView1.DataSource = 売上帳;
129デフォルトの名無しさん
2008/02/27(水) 19:05:23 まとめ
駄目だ、どうあがいても単純になりません。
3 番目を書いてみたら、foreach で書いたほうが見通しがよさそうな感じすらしてきます。
綺麗になるのは、アキュムレーターの型とコンテナ要素の型が一致しているとき
もしくはアキュムレーターの型が int のような単純型で有る場合に限られます。
メソッド方式にはやはり何かが足りない感じがします。
LINQの新規キーワードとして、それも foreach をイメージできるような構文にして
"aggregate 売上帳" と書いたら、型名、その他をインテリセンスがズバズバッと書き出して、
作る側は中身をを書くだけといった具合になれば使えそうな気がするのですが……
もしくは Excel の、式のコピーのようなイメージができれば、やる事は一番上の式を書く事となるのですが。
駄目だ、どうあがいても単純になりません。
3 番目を書いてみたら、foreach で書いたほうが見通しがよさそうな感じすらしてきます。
綺麗になるのは、アキュムレーターの型とコンテナ要素の型が一致しているとき
もしくはアキュムレーターの型が int のような単純型で有る場合に限られます。
メソッド方式にはやはり何かが足りない感じがします。
LINQの新規キーワードとして、それも foreach をイメージできるような構文にして
"aggregate 売上帳" と書いたら、型名、その他をインテリセンスがズバズバッと書き出して、
作る側は中身をを書くだけといった具合になれば使えそうな気がするのですが……
もしくは Excel の、式のコピーのようなイメージができれば、やる事は一番上の式を書く事となるのですが。
130デフォルトの名無しさん
2008/02/28(木) 02:02:30 ところでこのコードってVB?
131デフォルトの名無しさん
2008/02/28(木) 11:52:14 驚くべきことに今まで一行もVBのコードは出てきていないんだ
132デフォルトの名無しさん
2008/02/28(木) 12:47:55 ほいじゃVB版Linq for XML
XMLリテラルが売りですのじゃ
Dim xm = <AAA>
<BBB id="1">aaaaacxzc</BBB>
<BBB id="2">aaaaaxczx</BBB>
<BBB id="3">aaaaaxcxz</BBB>
<BBB id="4">aaaaaxczx</BBB>
<BBB id="5">aaaaaxxxx</BBB>
<BBB id="6">aaaaazzzz</BBB>
<BBB id="7">aaaaacccc</BBB>
<BBB id="5">aaaaaxxxx</BBB>
<BBB id="6">aaaaazzzz</BBB>
<BBB id="7">aaaaacccc</BBB>
</AAA>
Dim rs = From x In xm...<BBB> _
Where x.@id > 2 _
Distinct Skip 1 Take 3 _
Order By x.@id Descending _
Select ID = x.@id, x
For Each r In rs
Console.WriteLine(r)
Next
XMLリテラルが売りですのじゃ
Dim xm = <AAA>
<BBB id="1">aaaaacxzc</BBB>
<BBB id="2">aaaaaxczx</BBB>
<BBB id="3">aaaaaxcxz</BBB>
<BBB id="4">aaaaaxczx</BBB>
<BBB id="5">aaaaaxxxx</BBB>
<BBB id="6">aaaaazzzz</BBB>
<BBB id="7">aaaaacccc</BBB>
<BBB id="5">aaaaaxxxx</BBB>
<BBB id="6">aaaaazzzz</BBB>
<BBB id="7">aaaaacccc</BBB>
</AAA>
Dim rs = From x In xm...<BBB> _
Where x.@id > 2 _
Distinct Skip 1 Take 3 _
Order By x.@id Descending _
Select ID = x.@id, x
For Each r In rs
Console.WriteLine(r)
Next
133デフォルトの名無しさん
2008/02/28(木) 13:15:08 クエリ式はC#よりVBの方が馴染んでるよなあ
VBのラムダ式は糞だけど
VBのラムダ式は糞だけど
134デフォルトの名無しさん
2008/02/28(木) 17:54:04 >>129
AggregateはSumやMaxと同じで集合関数として使うように設計されてるので
group by と組み合わせて使うのが普通なのだと思う。
この例だとSumが使えるのだがAggregateを使ってみた。
var 合計表 = (
from uri in 売上帳
group uri by 1 into g
select new 合計型(){
合計原価 = g.Sum(o => o.原価 * o.数量),
合計売価 = g.Aggregate(0, (t,o) => t + o.売価 * o.数量)
}).First();
Console.WriteLine("{0}, {1}", 合計表.合計原価, 合計表.合計売価);
AggregateはSumやMaxと同じで集合関数として使うように設計されてるので
group by と組み合わせて使うのが普通なのだと思う。
この例だとSumが使えるのだがAggregateを使ってみた。
var 合計表 = (
from uri in 売上帳
group uri by 1 into g
select new 合計型(){
合計原価 = g.Sum(o => o.原価 * o.数量),
合計売価 = g.Aggregate(0, (t,o) => t + o.売価 * o.数量)
}).First();
Console.WriteLine("{0}, {1}", 合計表.合計原価, 合計表.合計売価);
135デフォルトの名無しさん
2008/03/07(金) 01:17:17 C#なんだから大概の物は関数型チックにかくより普通に書いた方が
見やすいのは当たり前
見やすいのは当たり前
136デフォルトの名無しさん
2008/03/07(金) 11:55:15 Expression Treeってフィールドの値を変更できないのか
できたらおかしいのはわかるけどDynamicMethodの簡易版として使うには貧弱だな
できたらおかしいのはわかるけどDynamicMethodの簡易版として使うには貧弱だな
137デフォルトの名無しさん
2008/03/07(金) 12:01:30 >>136
そういう用途だと、LINQ の Expression から DLR の AST Expression に変換してしまうのがいいかも。
そういう用途だと、LINQ の Expression から DLR の AST Expression に変換してしまうのがいいかも。
138デフォルトの名無しさん
2008/03/07(金) 17:40:05 LINQってDataTableに対してグループ化をしてDataGridViewに表示したり出来るんですかね?
現在、DataTableに対してグループ化ってかなり無理矢理やらないと出来ないと思うんですが、
これができると、DataTableがかなり使いやすくなりそうです。
.NET3.5をインストールさせる動機になりそうなくらい・・・
現在、DataTableに対してグループ化ってかなり無理矢理やらないと出来ないと思うんですが、
これができると、DataTableがかなり使いやすくなりそうです。
.NET3.5をインストールさせる動機になりそうなくらい・・・
139デフォルトの名無しさん
2008/03/12(水) 12:24:53 みんな小難しいことばっかやってて、なんとなくLinq避けてたが、
実際に使ってみるとなかなかスイーツ(笑)な簡単さじゃないか。
List<T>なんか作って追加していって最後にToArray()してるようなのも
Linqで書き換えたら全部一行に出来そうだ。
実際に使ってみるとなかなかスイーツ(笑)な簡単さじゃないか。
List<T>なんか作って追加していって最後にToArray()してるようなのも
Linqで書き換えたら全部一行に出来そうだ。
140デフォルトの名無しさん
2008/03/13(木) 01:52:23 あれ?出勤、昼だか夜だかわからなくね?
141デフォルトの名無しさん
2008/03/13(木) 11:30:56 VB.NETもスレタイの仲間に入れてあげてください。
142デフォルトの名無しさん
2008/03/13(木) 13:24:30 VB.NETは新機能が全く話題にならないよな
143デフォルトの名無しさん
2008/03/13(木) 15:06:20144デフォルトの名無しさん
2008/03/13(木) 15:07:51 宣言時の型推論,ラムダ式とか?
145デフォルトの名無しさん
2008/03/13(木) 15:16:04 Xmlリテラルとか。
146デフォルトの名無しさん
2008/03/13(木) 15:18:19 C#2.0+C#3.0+αだな
147デフォルトの名無しさん
2008/03/13(木) 16:24:25 ぶっちゃけXML生書き出来るようになったからって・・・
使う奴っている?
今一歩使い道が見つからん・・・
使う奴っている?
今一歩使い道が見つからん・・・
148デフォルトの名無しさん
2008/03/13(木) 21:19:44 >Xmlリテラル
タイミング良くっつーかこんな記事がでてるね。
.NETプログラマーにとって、XSLTは終焉なのか?
ttp://www.infoq.com/jp/news/2008/03/XML-Literals
>XML Literalsは最初Haskell向けに開拓され、
>のちにMicrosoftにおいてC#で使用するために開発された。
>どちらの言語においてもうまく いかないことが判明したので、
>Visual Basicチームが飛び付いて、VB 9の礎石にした。
>これはそれほどまでに驚くことではない。
>というのもHaskell構文がVBScriptのインラインHTML表記の影響を
>もろに受けて いたからである。
まあヘジたんなら拒否るだろし、事実拒否ったんだろうなぁ。
タイミング良くっつーかこんな記事がでてるね。
.NETプログラマーにとって、XSLTは終焉なのか?
ttp://www.infoq.com/jp/news/2008/03/XML-Literals
>XML Literalsは最初Haskell向けに開拓され、
>のちにMicrosoftにおいてC#で使用するために開発された。
>どちらの言語においてもうまく いかないことが判明したので、
>Visual Basicチームが飛び付いて、VB 9の礎石にした。
>これはそれほどまでに驚くことではない。
>というのもHaskell構文がVBScriptのインラインHTML表記の影響を
>もろに受けて いたからである。
まあヘジたんなら拒否るだろし、事実拒否ったんだろうなぁ。
149デフォルトの名無しさん
2008/03/14(金) 22:40:14 テーブル値関数をLinq to SQLで利用しようとしてるんだけど、
実行したら、
ストアド プロシージャはクエリ内では使用できない。ってエラーになるんだよ。
これバグじゃないかな。
実行したら、
ストアド プロシージャはクエリ内では使用できない。ってエラーになるんだよ。
これバグじゃないかな。
150デフォルトの名無しさん
2008/03/15(土) 00:46:01 自己解決しました。ノシ
IsComposable=true がなかったのが原因みたいです。
なんだかなあ。
IsComposable=true がなかったのが原因みたいです。
なんだかなあ。
151デフォルトの名無しさん
2008/04/06(日) 03:35:46 保守
152sage
2008/04/13(日) 01:33:35 LINQでのサブクエリの書き方が分からん。どう書くの?
SELECT
A.KEY1, A.COL1, B.COL2
FROM
(
(SELECT * FROM TBL1) A
INNER JOIN
(SELECT * FROM TBL1) B
ON B.KEY1 = A.KEY1
)
SELECT
A.KEY1, A.COL1, B.COL2
FROM
(
(SELECT * FROM TBL1) A
INNER JOIN
(SELECT * FROM TBL1) B
ON B.KEY1 = A.KEY1
)
153デフォルトの名無しさん
2008/04/13(日) 02:32:31 そのままlinqに置き換えれば
var r =
from i in
(from a in TBL1
from b in TBL2
where a.KEY1 == b.KEY2
select new { A = a , B = b })
select new { KEY1 = i.A.KEY1 , COL1 = i.A.COL1 , COL2 = i.B.COL2 };
こんな感じだけど、この例だとサブクエリ必要なくね?
var r =
from i in
(from a in TBL1
from b in TBL2
where a.KEY1 == b.KEY2
select new { A = a , B = b })
select new { KEY1 = i.A.KEY1 , COL1 = i.A.COL1 , COL2 = i.B.COL2 };
こんな感じだけど、この例だとサブクエリ必要なくね?
154デフォルトの名無しさん
2008/04/13(日) 02:36:53 >>152
それ、LINQ だとサブクエリ要らない。
var q =
from a in tbl1
join b in tbl2 on a.Key equals b.Key
select new { a.Key, a.Col1, b.Col2 };
サブクエリは普通に ↓ みたいに書ける。
from a in
from b in list
select b.SomeProperty
select a.SomeProperty
それ、LINQ だとサブクエリ要らない。
var q =
from a in tbl1
join b in tbl2 on a.Key equals b.Key
select new { a.Key, a.Col1, b.Col2 };
サブクエリは普通に ↓ みたいに書ける。
from a in
from b in list
select b.SomeProperty
select a.SomeProperty
155デフォルトの名無しさん
2008/04/13(日) 14:50:18 そんなことしなくても
保守が容易な綺麗なコードを書けるから
(゚听)イラネ
保守が容易な綺麗なコードを書けるから
(゚听)イラネ
156デフォルトの名無しさん
2008/04/13(日) 16:44:19 最近LINQ初めて>>22見たんだけど、
コードが見通しよく整理されていく中盤からの展開は見てて痛快だなぁ
コードが見通しよく整理されていく中盤からの展開は見てて痛快だなぁ
157デフォルトの名無しさん
2008/04/24(木) 21:22:23158デフォルトの名無しさん
2008/04/24(木) 21:41:48159デフォルトの名無しさん
2008/05/24(土) 20:45:08 Linqで書くと速くならないなら需要ないんじゃない
SQLでおなかいっぱいで
SQLでおなかいっぱいで
160デフォルトの名無しさん
2008/05/24(土) 21:01:08161デフォルトの名無しさん
2008/05/24(土) 23:11:23 パラ?
お母さんが子供に教えるように教えてください
お母さんが子供に教えるように教えてください
162デフォルトの名無しさん
2008/05/24(土) 23:23:16163デフォルトの名無しさん
2008/05/25(日) 00:22:26 最初は書き方に戸惑うが、だいたいの書き方がわかってくればインテリセンス使えるのがとても大きい
164デフォルトの名無しさん
2008/05/25(日) 04:39:07 コンパイラによる構文チェックが行われるというのも大きい。
条件次第で内容が大きく変わるようなクエリを構成するときに、文字列の連結を間違えて
バグを作り込んでしまうような、つまらないミスを防げる。
DataContextの定義にあわせて自動でCREATE DATABASEしてくれるとか、生産性の向上に
つながる要素がいろいろあるよ。
俺もほとんど把握してないけどさ。
条件次第で内容が大きく変わるようなクエリを構成するときに、文字列の連結を間違えて
バグを作り込んでしまうような、つまらないミスを防げる。
DataContextの定義にあわせて自動でCREATE DATABASEしてくれるとか、生産性の向上に
つながる要素がいろいろあるよ。
俺もほとんど把握してないけどさ。
165デフォルトの名無しさん
2008/05/25(日) 09:04:21 SQLって、汎用コレクションデータ処理エンジンだね。
C/C++やらで何らかのデータ処理を行う場合、その度毎にアルゴリズムを考え、設計し、
コードを作りこまなくちゃいけないけど。
RDBだと、ちょこっとSQLを定義するだけで実際の処理はRDBのエンジンがやってくれる。
例えるなら文字列の正規表現みたいな感じで。
それが言語組み込みの文法として、RDBだとDBサーバを立て、テーブルを作り、データをインポートして
からじゃないと使えないのが、RDBに限らずC#言語上の任意のコレクションデータで使えてしまう
ってのは便利。
C/C++やらで何らかのデータ処理を行う場合、その度毎にアルゴリズムを考え、設計し、
コードを作りこまなくちゃいけないけど。
RDBだと、ちょこっとSQLを定義するだけで実際の処理はRDBのエンジンがやってくれる。
例えるなら文字列の正規表現みたいな感じで。
それが言語組み込みの文法として、RDBだとDBサーバを立て、テーブルを作り、データをインポートして
からじゃないと使えないのが、RDBに限らずC#言語上の任意のコレクションデータで使えてしまう
ってのは便利。
166デフォルトの名無しさん
2008/05/25(日) 09:41:44 >>161
インピーダンスミスマッチでぐぐれ
インピーダンスミスマッチでぐぐれ
167デフォルトの名無しさん
2008/05/25(日) 11:12:57 SQLMetalってすでにあるテーブルのオブジェクト定義のXMLを生成するものだよね?
逆に今あるオブジェクトからテーブルとかを生成するツールってあったっけ?
逆に今あるオブジェクトからテーブルとかを生成するツールってあったっけ?
168デフォルトの名無しさん
2008/05/25(日) 14:02:32169デフォルトの名無しさん
2008/05/25(日) 14:39:10170デフォルトの名無しさん
2008/06/02(月) 22:49:47 Linq人気ないから救済でAgeてやる
感謝しろビル
感謝しろビル
171デフォルトの名無しさん
2008/06/04(水) 08:38:01 PL/SQLですね。
172デフォルトの名無しさん
2008/06/09(月) 11:06:00173デフォルトの名無しさん
2008/06/15(日) 19:33:30 えーい
Linqも人気ないけど
ダメ技術のかほりがすっぞ
Linqも人気ないけど
ダメ技術のかほりがすっぞ
174デフォルトの名無しさん
2008/06/17(火) 02:07:55 使ったからといって、別に何かが楽になったりすっきりしたりするように見えないんだよな。
175デフォルトの名無しさん
2008/06/17(火) 07:25:18 ちょっとしたDBアプリ作るの楽になるが。
XMLとかにもいいと思うよ。
XMLとかにもいいと思うよ。
176デフォルトの名無しさん
2008/06/17(火) 21:00:53 メソッド形式は手軽に使えてすごく便利だよね
クエリ形式は「さあLINQ使っちゃうぞー」って感じになっちゃって好きじゃない
クエリ形式は「さあLINQ使っちゃうぞー」って感じになっちゃって好きじゃない
177デフォルトの名無しさん
2008/06/17(火) 22:19:07 未だにクエリ式だとpとかqとかのスコープがよくわかってない俺。
178デフォルトの名無しさん
2008/06/18(水) 03:55:30 fromやletが沢山必要になる場合は
クエリ式を使ってる
けど、それ以外ではクエリ式は全然使ってない
クエリ式を使ってる
けど、それ以外ではクエリ式は全然使ってない
179デフォルトの名無しさん
2008/06/19(木) 22:35:19 使い方も確立されてない未知のもんだからな。
ポテンシャルは高い気がする。
ポテンシャルは高い気がする。
180デフォルトの名無しさん
2008/06/20(金) 00:55:26 LINQきれいにかけるけれど、特にObjectLINQだと効率的にはだめな場合もあるからなぁ。
微妙なところだ。
PLINQとかになるとまた話は違うだろうけれど。
微妙なところだ。
PLINQとかになるとまた話は違うだろうけれど。
181デフォルトの名無しさん
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 の問題は解消しない。
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デフォルトの名無しさん
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年半ぐらいかかったし。
出荷までの時間短縮はお金じゃ解決しづらいんだろうな。
DryadLINQみたいにExpressionを直接扱う計算エンジンが要るね。
PLINQは所詮IEnumerableベースだし。
ttp://research.microsoft.com/research/sv/DryadLINQ/
ポテンシャルはDryadLINQ>>>>>PLINQなんだろうけど、
出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。
C# 3.0もお披露目から1年半ぐらいかかったし。
出荷までの時間短縮はお金じゃ解決しづらいんだろうな。
183デフォルトの名無しさん
2008/06/20(金) 09:07:06 >出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。
不等号逆だった……
ポテンシャル: DryadLINQ>>>>>PLINQ
出荷までにかかる時間: PLINQ<<<DryadLINQ
不等号逆だった……
ポテンシャル: DryadLINQ>>>>>PLINQ
出荷までにかかる時間: PLINQ<<<DryadLINQ
184デフォルトの名無しさん
2008/06/20(金) 09:10:04 >C# 3.0もお披露目から1年半ぐらいかかったし。
あとこれもお披露目から2年半の間違い。
あとこれもお披露目から2年半の間違い。
185デフォルトの名無しさん
2008/06/21(土) 10:41:48 もうちょっと落ち着いて!
186デフォルトの名無しさん
2008/06/26(木) 01:03:41 いや、勢いあったほうがよい
187デフォルトの名無しさん
2008/07/07(月) 22:42:17 複雑なXMLファイルの読み込みはXmlTextReaderよりLINQ to Xmlを使ったほうが簡潔に書けそうですか?
188デフォルトの名無しさん
2008/07/07(月) 22:53:07 書いてみろ
189デフォルトの名無しさん
2008/07/07(月) 23:23:38 >>188
一言レスって周りにも意図伝わらないからヤメレ
一言レスって周りにも意図伝わらないからヤメレ
190デフォルトの名無しさん
2008/07/07(月) 23:26:55 最近、勉強ついでにLINQtoSQL使ってるけどクラスとして扱えるだけで便利すぎ。
リレーション張っても参照のプロパティでアクセス出来るのも簡単すぎて涙が出る。
長ったらしいデータセットのクラス名で変数宣言してたら、varで省略できるのにも涙が出た。
リレーション張っても参照のプロパティでアクセス出来るのも簡単すぎて涙が出る。
長ったらしいデータセットのクラス名で変数宣言してたら、varで省略できるのにも涙が出た。
191>>188 じゃないよ
2008/07/07(月) 23:30:39192デフォルトの名無しさん
2008/07/08(火) 10:10:04 XmlElementとXElementの違いを問うならわかるが、
XmlReaderと比べるあたり自分では何も調べずに
思いつきで書き込んだと証明してるようなものだ。
XmlReaderと比べるあたり自分では何も調べずに
思いつきで書き込んだと証明してるようなものだ。
193デフォルトの名無しさん
2008/07/08(火) 23:25:23194デフォルトの名無しさん
2008/07/08(火) 23:47:33 なんか俺のせいで荒れてるみたいだな
ごめんなさい
>>192
違いの話なんかしてないっすよ?
あれからbuilderってサイトのサンプルを読んで勉強してみてる。
ちょっと興奮で震えてます。
皆ありがとう
ごめんなさい
>>192
違いの話なんかしてないっすよ?
あれからbuilderってサイトのサンプルを読んで勉強してみてる。
ちょっと興奮で震えてます。
皆ありがとう
195デフォルトの名無しさん
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も対応できる。
扱いは当然ややこしい。
Linq for XMLで使うXElement系のクラスはDTDやXMLスキーマをサポートしない。
構造の検査、実体やデフォルトの属性を展開することが必要という意味で複雑なXMLだったら手も足も出ない。
XDocument/XElementはXMLパーサーとしての機能をしぼっている。
簡単なXMLの読み書き加工は簡単にかつスマートに書ける、Linq for XMLはその為のもの。
XmlDocment/ElementはDOMとしてのすべての機能をもつ。多機能ではあるが何をするにも大掛かり。
XmlReader/Writerは StAX型の前方参照型で高速。
使用メモリが少なくてすみ全部メモリに読み込むのが問題になるような大きなXMLも対応できる。
扱いは当然ややこしい。
196デフォルトの名無しさん
2008/07/11(金) 13:29:59 意外に使いやすいよねXmlReader/Writer
197デフォルトの名無しさん
2008/07/19(土) 20:38:17 マイクロソフト公式解説書としてLINQ本が出るってよ
LINQテクノロジ入門
http://ec.nikkeibp.co.jp/item/books/A04100.html
・07/22発売 3,360円(税込み) B5変 280P
LINQテクノロジ入門
http://ec.nikkeibp.co.jp/item/books/A04100.html
・07/22発売 3,360円(税込み) B5変 280P
198197
2008/07/27(日) 00:32:31 届いたんでぼちぼち読み始め
図表を多く使っていて、C#/VBのサンプルコードも多いのは○
内容的には結構踏み込んで丁寧に解説されていて、実際に発行されるT-SQLまで触れられてたりする。
・C#/VB・SQLに関する基本的な理解は必須。
・開発経験のない初心者が読むには少し難しい。
・何となくLINQを使っているが、使いこなせていないと感じてる人 にはおすすめ。
図表を多く使っていて、C#/VBのサンプルコードも多いのは○
内容的には結構踏み込んで丁寧に解説されていて、実際に発行されるT-SQLまで触れられてたりする。
・C#/VB・SQLに関する基本的な理解は必須。
・開発経験のない初心者が読むには少し難しい。
・何となくLINQを使っているが、使いこなせていないと感じてる人 にはおすすめ。
199デフォルトの名無しさん
2008/07/27(日) 01:55:18 LINQのProviderでしたっけ?クエリーとかを実装する側の作業についてまとまってるarticleとかってありますかね?(´・ω・`)
200デフォルトの名無しさん
2008/07/27(日) 11:06:25 >>199
単に .Select メソッド(あるいは拡張メソッド)とか実装するだけ。
LINQ to SQL みたいなことしたければ、
LINQ の勉強というよりは、Expression Trees の勉強が必要。
で、LINQ がらみの記事は結構おおいけど、
Expression Trees はあんまり見ないなぁ。
単に .Select メソッド(あるいは拡張メソッド)とか実装するだけ。
LINQ to SQL みたいなことしたければ、
LINQ の勉強というよりは、Expression Trees の勉強が必要。
で、LINQ がらみの記事は結構おおいけど、
Expression Trees はあんまり見ないなぁ。
201デフォルトの名無しさん
2008/07/27(日) 12:23:14202デフォルトの名無しさん
2008/07/27(日) 12:55:38 Expression Trees の方は、↓に多少サンプルあり。
http://ufcpp.net/study/csharp/sp3_linqreconstruct.html
LINQ to SQL みたいなことしたければ、IQueryable でググってみるといいんじゃないかと。
http://ufcpp.net/study/csharp/sp3_linqreconstruct.html
LINQ to SQL みたいなことしたければ、IQueryable でググってみるといいんじゃないかと。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- なぜリベラルは人気がないのか 斎藤幸平さんが指し示す未来への道筋:朝日新聞 [少考さん★]
- 【日本人の旅行離れ】国内旅行すら行けなくなった……オーバーツーリズムだけじゃない 旅行者減少の異常事態 ★2 [ぐれ★]
- “ひとり焼肉”でおなじみ「焼肉ライク」が閉店ラッシュ。なぜ「コスパが悪い」と言われてしまうのか [Gecko★]
- ベトナムのバイク「脱ガソリン」、シェア8割のホンダに打撃…政府が電動二輪普及を主導 [煮卵★]
- なぜ安っぽく見えてしまうのか…? ダウンジャケット姿が垢抜けない人の"意外な盲点" (ビジネスマンのためのスタイリスト) [少考さん★]
- 【日中】経団連会長、1月の北京訪問に暗雲 中国は受け入れ是非明らかにせず 関係「政冷経冷」に [煮卵★]
- 【実況】博衣こよりのえちえちドラクエ1&2リメイク🧪
- 「SCORE」←これなんて読むんや?🙋🏡
- 【高市朗報】鈴木大臣「嫌儲のデマに騙されないで。お米券の使い勝手は悪くない。卵味噌醤油も買えます。現金と変わりません」 [517459952]
- 今日一日を忘れられないほど大切な一日にしろ
- エロ画像を見ると死ぬ病になったからお前ら絶対貼るなよ
- 【悲報】東京40代「生活苦しい!戸建てなんて絶対無理…」地方20代「家と車買って子供できた~今日は家族でモールで買い物」 [732289945]
