VisualStudio2008より追加された便利で強力な機能
統合言語クエリ (LINQ : Language Integrated Query)
ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。
【VB.NET】LINQ友の会【C#, C♯, C#】
レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん
2008/02/09(土) 23:51:342デフォルトの名無しさん
2008/02/09(土) 23:52:34 >>1 もこれから使い始めます、答えられそうな質問にはどんどん答えます、無理なのは……誰かお願い。
2008/02/10(日) 00:05:21
まずは一発目
LINQってなあに、という所で、これは以下のような事ができます。
このコードは配列から4以下の値を取り出します。
int [] data = new int[] { 3, 1, 4, 1, 5, 9, 2, 6 };
IEnumerable<int> x = from s in data where s <= 4 select s;
foreach (int ite in x)
System.Console.Write( "{0}," , ite);
3,1,4,1,2,
これを、ちょっと短くしてみる。
int [] data = new int[] { 3, 1, 4, 1, 5, 9, 2, 6 };
foreach (int ite in from s in data where s <= 4 select s)
System.Console.Write( "{0}," , ite);
とてもすっきりかけます。
LINQってなあに、という所で、これは以下のような事ができます。
このコードは配列から4以下の値を取り出します。
int [] data = new int[] { 3, 1, 4, 1, 5, 9, 2, 6 };
IEnumerable<int> x = from s in data where s <= 4 select s;
foreach (int ite in x)
System.Console.Write( "{0}," , ite);
3,1,4,1,2,
これを、ちょっと短くしてみる。
int [] data = new int[] { 3, 1, 4, 1, 5, 9, 2, 6 };
foreach (int ite in from s in data where s <= 4 select s)
System.Console.Write( "{0}," , ite);
とてもすっきりかけます。
2008/02/10(日) 00:20:06
部分的にSQLがかけますよ、って感じか
どーなんだろ、便利か?これ
どーなんだろ、便利か?これ
2008/02/10(日) 00:25:18
まあ、便利なんだろうけど、あまり優秀でないプログラマに使わせるとこんな記述が
そこらじゅうにばら撒かれたきわめて保守し辛いプログラムが量産されるような気が
する。
そこらじゅうにばら撒かれたきわめて保守し辛いプログラムが量産されるような気が
する。
2008/02/10(日) 00:34:33
もう全部の言語合体したのを作っちゃいなよw
CLR自体に新しい何かが加わったの?
.NET層のインターフェイス?
シンタックスシュガーにも見えなくもない。
全然c#に触れてないので見当違いなこと言ってたらごめんよ。
CLR自体に新しい何かが加わったの?
.NET層のインターフェイス?
シンタックスシュガーにも見えなくもない。
全然c#に触れてないので見当違いなこと言ってたらごめんよ。
2008/02/10(日) 00:53:14
>>6
ラムダ式のシンタックスシュガーですよ、かなりなんでも出来ます。
ラムダ式のシンタックスシュガーですよ、かなりなんでも出来ます。
2008/02/10(日) 00:55:57
明日は、とりあえず難しい事考えなくても、簡単に使えるサンプルでも考えてみるかな・・・
2008/02/10(日) 01:15:38
洋書だとC#3の本がかなり出てるらしいけど、日本語のはぜんぜんでないな。
2008/02/10(日) 07:20:46
何が便利かって、グループ化の機能が便利だ。
11762
2008/02/10(日) 12:42:26 static T Multiply<T>(T left, T right) {
var r = Expression.Parameter(typeof(T), "left");
var l = Expression.Parameter(typeof(T), "right");
return Expression.Lambda<Func<T, T, T>>(Expression.Multiply(r, l), l, r).Compile()(left, right);
}
Expression Treeで遊んでみた
var r = Expression.Parameter(typeof(T), "left");
var l = Expression.Parameter(typeof(T), "right");
return Expression.Lambda<Func<T, T, T>>(Expression.Multiply(r, l), l, r).Compile()(left, right);
}
Expression Treeで遊んでみた
2008/02/11(月) 15:15:26
データベースからデータを拾ってきて、LocationID が 10 未満の行を取り出すサンプル。
従来コードから徐々に LINQ に書き換えて行って見ました。
データは、Microsoft SQL Server 2005 に最初から入っているものです。
こちらの使用環境は Professional エデッションで、二枚付いているディスクはフルインストール
ウインドウズ認証でインストールして特に変わった設定がしてなければ、"貴方のPC" を自分のPC名に書き換えれば動くと思います、多分。
データベースは、最初から入っているサンプルデータ AdventureWorks の中の Location(Production) を使ってみました。
DataGridView コントロールを二つ貼り付けて、ボタンを一つ用意して、ボタンプッシュのイベントで実行しています。
従来コードから徐々に LINQ に書き換えて行って見ました。
データは、Microsoft SQL Server 2005 に最初から入っているものです。
こちらの使用環境は Professional エデッションで、二枚付いているディスクはフルインストール
ウインドウズ認証でインストールして特に変わった設定がしてなければ、"貴方のPC" を自分のPC名に書き換えれば動くと思います、多分。
データベースは、最初から入っているサンプルデータ AdventureWorks の中の Location(Production) を使ってみました。
DataGridView コントロールを二つ貼り付けて、ボタンを一つ用意して、ボタンプッシュのイベントで実行しています。
2008/02/11(月) 15:16:32
続き(>>12)
次のように変換されます。
1 Tool Crib 0.0000 0.00 1998/06/01
2 Sheet Metal Racks 0.0000 0.00 1998/06/01
3 Paint Shop 0.0000 0.00 1998/06/01
4 Paint Storage 0.0000 0.00 1998/06/01
5 Metal Storage 0.0000 0.00 1998/06/01
6 Miscellaneous Storage 0.0000 0.00 1998/06/01
7 Finished Goods Storage 0.0000 0.00 1998/06/01
10 Frame Forming 22.5000 96.00 1998/06/01
20 Frame Welding 25.0000 108.00 1998/06/01
30 Debur and Polish 14.5000 120.00 1998/06/01
40 Paint 15.7500 120.00 1998/06/01
45 Specialized Paint 18.0000 80.00 1998/06/01
50 Subassembly 12.2500 120.00 1998/06/01
60 Final Assembly 12.2500 120.00 1998/06/01
↓
1 Tool Crib 0.0000 0.00 1998/06/01
2 Sheet Metal Racks 0.0000 0.00 1998/06/01
3 Paint Shop 0.0000 0.00 1998/06/01
4 Paint Storage 0.0000 0.00 1998/06/01
5 Metal Storage 0.0000 0.00 1998/06/01
6 Miscellaneous Storage 0.0000 0.00 1998/06/01
7 Finished Goods Storage 0.0000 0.00 1998/06/01
次のように変換されます。
1 Tool Crib 0.0000 0.00 1998/06/01
2 Sheet Metal Racks 0.0000 0.00 1998/06/01
3 Paint Shop 0.0000 0.00 1998/06/01
4 Paint Storage 0.0000 0.00 1998/06/01
5 Metal Storage 0.0000 0.00 1998/06/01
6 Miscellaneous Storage 0.0000 0.00 1998/06/01
7 Finished Goods Storage 0.0000 0.00 1998/06/01
10 Frame Forming 22.5000 96.00 1998/06/01
20 Frame Welding 25.0000 108.00 1998/06/01
30 Debur and Polish 14.5000 120.00 1998/06/01
40 Paint 15.7500 120.00 1998/06/01
45 Specialized Paint 18.0000 80.00 1998/06/01
50 Subassembly 12.2500 120.00 1998/06/01
60 Final Assembly 12.2500 120.00 1998/06/01
↓
1 Tool Crib 0.0000 0.00 1998/06/01
2 Sheet Metal Racks 0.0000 0.00 1998/06/01
3 Paint Shop 0.0000 0.00 1998/06/01
4 Paint Storage 0.0000 0.00 1998/06/01
5 Metal Storage 0.0000 0.00 1998/06/01
6 Miscellaneous Storage 0.0000 0.00 1998/06/01
7 Finished Goods Storage 0.0000 0.00 1998/06/01
2008/02/11(月) 15:17:26
続き(>>13)
// 従来方式
private void Test4()
{
using (System.Data.SqlClient.SqlDataAdapter myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
System.Data.DataTable dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
System.Data.DataTable dataTable2 = dataTable1.Clone();
foreach (System.Data.DataRow tmp1 in dataTable1.Select("LocationID < 10"))
{
System.Data.DataRow tmp2 = dataTable2.NewRow();
tmp2.ItemArray = tmp1.ItemArray;
dataTable2.Rows.Add(tmp2);
}
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
// 従来方式
private void Test4()
{
using (System.Data.SqlClient.SqlDataAdapter myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
System.Data.DataTable dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
System.Data.DataTable dataTable2 = dataTable1.Clone();
foreach (System.Data.DataRow tmp1 in dataTable1.Select("LocationID < 10"))
{
System.Data.DataRow tmp2 = dataTable2.NewRow();
tmp2.ItemArray = tmp1.ItemArray;
dataTable2.Rows.Add(tmp2);
}
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
2008/02/11(月) 15:18:11
続き(>>14)
// var を使ったバージョン
private void test5()
{
using (var myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
var dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
var dataTable2 = dataTable1.Clone();
foreach (var tmp1 in dataTable1.Select("LocationID < 10"))
{
var tmp2 = dataTable2.NewRow();
tmp2.ItemArray = tmp1.ItemArray;
dataTable2.Rows.Add(tmp2);
}
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
// var を使ったバージョン
private void test5()
{
using (var myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
var dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
var dataTable2 = dataTable1.Clone();
foreach (var tmp1 in dataTable1.Select("LocationID < 10"))
{
var tmp2 = dataTable2.NewRow();
tmp2.ItemArray = tmp1.ItemArray;
dataTable2.Rows.Add(tmp2);
}
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
2008/02/11(月) 15:19:25
続き(>>15)
// LINQ を使ったバージョン(意味が解りやすいように型付き)
private void Test7()
{
using (System.Data.SqlClient.SqlDataAdapter myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
System.Data.DataTable dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
EnumerableRowCollection<System.Data.DataRow> query = from tmp2 in dataTable1.AsEnumerable() where tmp2.Field<short>("LocationID") < 10 select tmp2;
System.Data.DataTable dataTable2 = query.CopyToDataTable();
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
// LINQ を使ったバージョン(意味が解りやすいように型付き)
private void Test7()
{
using (System.Data.SqlClient.SqlDataAdapter myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
System.Data.DataTable dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
EnumerableRowCollection<System.Data.DataRow> query = from tmp2 in dataTable1.AsEnumerable() where tmp2.Field<short>("LocationID") < 10 select tmp2;
System.Data.DataTable dataTable2 = query.CopyToDataTable();
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
17デフォルトの名無しさん
2008/02/11(月) 15:25:03 続き(>>16) 最後
// LINQ を使ったバージョン
private void Test8()
{
using (var myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
var dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
var tmp1 = from tmp2 in dataTable1.AsEnumerable() where tmp2.Field<short>("LocationID") < 10 select tmp2;
var dataTable2 = tmp1.CopyToDataTable();
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
// LINQ を使ったバージョン
private void Test8()
{
using (var myDataAdapter = new System.Data.SqlClient.SqlDataAdapter("select * from Production.Location", "Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
var dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
var tmp1 = from tmp2 in dataTable1.AsEnumerable() where tmp2.Field<short>("LocationID") < 10 select tmp2;
var dataTable2 = tmp1.CopyToDataTable();
// ためしに表示
this.dataGridView1.DataSource = dataTable1;
this.dataGridView2.DataSource = dataTable2;
}
}
2008/02/11(月) 15:28:13
さて、次はLINQ to Sql にいくか、それともしょうもない内容にすべか
誰も来なければそろそろ諦めるかw
誰も来なければそろそろ諦めるかw
2008/02/11(月) 17:33:56
LINQ: .NET 統合言語クエリ
http://www.microsoft.com/japan/msdn/net/bb308959.aspx
Part4 LINQで変わるデータベース開発:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20080116/291140/?P=1&ST=develop
スレ立てるの早すぎだと思われ
然程使ってもいないのに意見の交換なんて出来ませぬ
http://www.microsoft.com/japan/msdn/net/bb308959.aspx
Part4 LINQで変わるデータベース開発:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20080116/291140/?P=1&ST=develop
スレ立てるの早すぎだと思われ
然程使ってもいないのに意見の交換なんて出来ませぬ
2008/02/11(月) 18:16:46
>>1-17
1行に詰め込まないでインデントしようよ。
1行に詰め込まないでインデントしようよ。
2008/02/11(月) 18:58:15
最後の一つだけインデント入れてみた
private void Test8() {
using (var myDataAdapter = new System.Data.SqlClient.SqlDataAdapter(
"select * from Production.Location",
"Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"
)
) {
// サンプルデータベースからデータを取り込む
var dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
var srcTable = dataTable1.AsEnumerable() ;
var dstTable =
from row in srcTable
where row.Field<short>("LocationID") < 10
select row;
// ためしに表示
dataGridView1.DataSource = dataTable1;
dataGridView2.DataSource = dstTable.CopyToDataTable();
}
}
private void Test8() {
using (var myDataAdapter = new System.Data.SqlClient.SqlDataAdapter(
"select * from Production.Location",
"Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"
)
) {
// サンプルデータベースからデータを取り込む
var dataTable1 = new System.Data.DataTable();
myDataAdapter.Fill(dataTable1);
// LocationIDが10以下の行のみのテーブルを作る
var srcTable = dataTable1.AsEnumerable() ;
var dstTable =
from row in srcTable
where row.Field<short>("LocationID") < 10
select row;
// ためしに表示
dataGridView1.DataSource = dataTable1;
dataGridView2.DataSource = dstTable.CopyToDataTable();
}
}
2008/02/11(月) 19:11:14
どんどんコードが短くなる気持のよいビデオです
http://www.microsoft.com/uk/msdn/nuggets/nugget/227/Decomposing-LINQ.aspx
http://www.microsoft.com/uk/msdn/nuggets/nugget/227/Decomposing-LINQ.aspx
2008/02/12(火) 16:11:50
続き(>>17)
今日は System.Data.Linq.DataContext を使ったさらなる単純な例。
データベースへのアクセスの高速化もやりたいと思ったんですが、そんなの興味無い人多いと思うので、思いとどまって簡単化の方のみとします。
まずテーブルと同じ形式を持つクラスを作成します。
中身の無い { get; set; } は、event に対するdelegateのように、自動的にその型のインスタンスを生成してアクセスできるようにする物です。
C#の言語仕様書を見てください。
今日は System.Data.Linq.DataContext を使ったさらなる単純な例。
データベースへのアクセスの高速化もやりたいと思ったんですが、そんなの興味無い人多いと思うので、思いとどまって簡単化の方のみとします。
まずテーブルと同じ形式を持つクラスを作成します。
中身の無い { get; set; } は、event に対するdelegateのように、自動的にその型のインスタンスを生成してアクセスできるようにする物です。
C#の言語仕様書を見てください。
2008/02/12(火) 16:12:29
続き(>>23)
// Name の後ろにはテーブルの名前
[System.Data.Linq.Mapping.Table(Name = "Production.Location")]
public class TableLocation
{
// 重要:項目名はデータベースのコラム名とあわせておく
// ここでは、さらにプライマリキーとして認識させる
[System.Data.Linq.Mapping.Column(IsPrimaryKey = true)]
public short LocationID { get; set; }
[System.Data.Linq.Mapping.Column]
public string Name { get; set; }
[System.Data.Linq.Mapping.Column]
public System.Decimal CostRate { get; set; }
[System.Data.Linq.Mapping.Column]
public System.Decimal Availability { get; set; }
[System.Data.Linq.Mapping.Column]
public System.DateTime ModifiedDate { get; set; }
}
// Name の後ろにはテーブルの名前
[System.Data.Linq.Mapping.Table(Name = "Production.Location")]
public class TableLocation
{
// 重要:項目名はデータベースのコラム名とあわせておく
// ここでは、さらにプライマリキーとして認識させる
[System.Data.Linq.Mapping.Column(IsPrimaryKey = true)]
public short LocationID { get; set; }
[System.Data.Linq.Mapping.Column]
public string Name { get; set; }
[System.Data.Linq.Mapping.Column]
public System.Decimal CostRate { get; set; }
[System.Data.Linq.Mapping.Column]
public System.Decimal Availability { get; set; }
[System.Data.Linq.Mapping.Column]
public System.DateTime ModifiedDate { get; set; }
}
2008/02/12(火) 16:13:13
続き(>>24)
private void Test9()
{
// DataContext を使ったバージョン
using (var myDataContext = new System.Data.Linq.DataContext("Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
System.Data.Linq.Table<TableLocation> orginalTable = myDataContext.GetTable<TableLocation>();
// LocationIDが10以下の行のみのテーブルを作る
var lessThan10Table = from row in orginalTable where row.LocationID < 10 select row;
// ためしに表示
this.dataGridView1.DataSource = orginalTable;
this.dataGridView2.DataSource = lessThan10Table;
// *** 重要な特徴の紹介 ***
// キャストしなくても使えるのでミスが少なく便利である
foreach (TableLocation tmp in lessThan10Table)
{
System.Console.WriteLine("{0},{1},{2},{3},{4}"
, tmp.LocationID
, tmp.Name
, tmp.CostRate
, tmp.Availability
, tmp.ModifiedDate);
}
}
}
private void Test9()
{
// DataContext を使ったバージョン
using (var myDataContext = new System.Data.Linq.DataContext("Data Source=貴方のPC;Initial Catalog=AdventureWorks;Integrated Security=True"))
{
// サンプルデータベースからデータを取り込む
System.Data.Linq.Table<TableLocation> orginalTable = myDataContext.GetTable<TableLocation>();
// LocationIDが10以下の行のみのテーブルを作る
var lessThan10Table = from row in orginalTable where row.LocationID < 10 select row;
// ためしに表示
this.dataGridView1.DataSource = orginalTable;
this.dataGridView2.DataSource = lessThan10Table;
// *** 重要な特徴の紹介 ***
// キャストしなくても使えるのでミスが少なく便利である
foreach (TableLocation tmp in lessThan10Table)
{
System.Console.WriteLine("{0},{1},{2},{3},{4}"
, tmp.LocationID
, tmp.Name
, tmp.CostRate
, tmp.Availability
, tmp.ModifiedDate);
}
}
}
26デフォルトの名無しさん
2008/02/12(火) 16:14:20 今日はこれでおしまい
データベースを知らない人にも解りやすい、データベース不使用例もそのうち作ってみます。
データベースを知らない人にも解りやすい、データベース不使用例もそのうち作ってみます。
2008/02/12(火) 21:46:14
「プロジェクト」の「新しい項目の追加」で「LINQ to SQL クラス」のテンプレートが
追加されるけど知らない人多いよね。これで>>24のを自動生成してくれる。
追加されるけど知らない人多いよね。これで>>24のを自動生成してくれる。
28デフォルトの名無しさん
2008/02/13(水) 13:39:40 ども、>>1です、まだ始めたばかりで右も左もわかりませんがよろしくお願いします。
驚きました、プロジェクトから Linq To Sql を作成して、サーバーエクスプローラで必要なデータベースを接続したら、テーブルをドラックアンドドロップでポイだったんですね。
ちょっちょっと、これは何にもする事が無いです、いきなりこのスレ終了ですかぁ(^^;
せっかく建てたのだから何かネタ考えて続けて見ます・・・
private void Test10()
{
using (var dataContext = new TestTableDataContext())
{
var table = dataContext.GetTable<Location>();
this.dataGridView1.DataSource = table;
this.dataGridView2.DataSource = from row in table where row.LocationID < 10 select row;
}
}
驚きました、プロジェクトから Linq To Sql を作成して、サーバーエクスプローラで必要なデータベースを接続したら、テーブルをドラックアンドドロップでポイだったんですね。
ちょっちょっと、これは何にもする事が無いです、いきなりこのスレ終了ですかぁ(^^;
せっかく建てたのだから何かネタ考えて続けて見ます・・・
private void Test10()
{
using (var dataContext = new TestTableDataContext())
{
var table = dataContext.GetTable<Location>();
this.dataGridView1.DataSource = table;
this.dataGridView2.DataSource = from row in table where row.LocationID < 10 select row;
}
}
2008/02/13(水) 13:49:37
このデザイナは、細かい所まで完全に実装してくれますね
自前で動的にテーブルやDBを作成するにしても、一旦SqlSever上でダミーテーブルを作って
コードを生成しておいて、それをコピペで取ってきて変更する方が効率が良いように思えてきました。
自前で動的にテーブルやDBを作成するにしても、一旦SqlSever上でダミーテーブルを作って
コードを生成しておいて、それをコピペで取ってきて変更する方が効率が良いように思えてきました。
2008/02/13(水) 14:02:30
2008/02/13(水) 14:09:09
DB板は、あっちはアドミニの人ばかりです。
マの人がほとんど居ないから余計伸びないです。
プログラム的な事は聞いても答えが返ってくることまずないですし。
マの人がほとんど居ないから余計伸びないです。
プログラム的な事は聞いても答えが返ってくることまずないですし。
2008/02/15(金) 00:07:33
検索してからC#オブジェクトに変換する手間がとても万度くさい自分はLINQヽ(´ー`)ノマンセーです。
遅くても(・ε・)キニシナイ!!。
遅くても(・ε・)キニシナイ!!。
33デフォルトの名無しさん
2008/02/15(金) 03:30:14 IronLisp#早く作れよ
2008/02/15(金) 08:59:25
ググれカス
2008/02/15(金) 10:20:31
DBを使わなくてもLINQは便利なんだよ〜!ってことを布教するためw、
普通のコレクションに対してロジックを実行するクエリのサンプルを示してみます。
>>10が言うように、グループ化の処理をクエリ一発で書けるのは実に魅力的です。
ファイル名を格納したstring配列 files に対して処理を行います。
// 拡張子ごとにファイル名をグループ化するクエリ
var extGroupQuery = from filename in files
let ext = System.IO.Path.GetExtension(filename).ToLower()
group filename by ext into extGroup
select extGroup;
// グループ化したクエリは2重のIEnumerable<T>になってます
foreach (var extGroup in extGroupQuery)
{
Console.WriteLine("Extension: {0}, Count: {1}", extGroup.Key, extGroup.Count());
foreach (var filename in extGroup)
{
Console.WriteLine("\t{0}", filename);
}
}
普通のコレクションに対してロジックを実行するクエリのサンプルを示してみます。
>>10が言うように、グループ化の処理をクエリ一発で書けるのは実に魅力的です。
ファイル名を格納したstring配列 files に対して処理を行います。
// 拡張子ごとにファイル名をグループ化するクエリ
var extGroupQuery = from filename in files
let ext = System.IO.Path.GetExtension(filename).ToLower()
group filename by ext into extGroup
select extGroup;
// グループ化したクエリは2重のIEnumerable<T>になってます
foreach (var extGroup in extGroupQuery)
{
Console.WriteLine("Extension: {0}, Count: {1}", extGroup.Key, extGroup.Count());
foreach (var filename in extGroup)
{
Console.WriteLine("\t{0}", filename);
}
}
3635
2008/02/15(金) 10:24:47 さらに集計処理を行います
クエリの中でオブジェクトを生成し、集計処理に利用したりできます
// 拡張子ごとの合計サイズを取得する(foreachを使うとこんな感じ)
Dictionary<string, long> sizeDic = new Dictionary<string, long>();
foreach (var extGroup in extGroupQuery)
{
var sizeQuery1 = from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length;
long totalSize = sizeQuery1.Sum();
sizeDic[extGroup.Key] = totalSize;
}
// 拡張子ごとの合計サイズを取得する(サブクエリを使う)
// クエリ内でさらにクエリを定義できます(totalSizeQueryはsizeQuery1とまったく同じです)
var sizeQuery2 = from extGroup in extGroupQuery
let totalSizeQuery = (from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length)
select new { Extension = extGroup.Key, TotalSize = totalSizeQuery.Sum() };
クエリの中でオブジェクトを生成し、集計処理に利用したりできます
// 拡張子ごとの合計サイズを取得する(foreachを使うとこんな感じ)
Dictionary<string, long> sizeDic = new Dictionary<string, long>();
foreach (var extGroup in extGroupQuery)
{
var sizeQuery1 = from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length;
long totalSize = sizeQuery1.Sum();
sizeDic[extGroup.Key] = totalSize;
}
// 拡張子ごとの合計サイズを取得する(サブクエリを使う)
// クエリ内でさらにクエリを定義できます(totalSizeQueryはsizeQuery1とまったく同じです)
var sizeQuery2 = from extGroup in extGroupQuery
let totalSizeQuery = (from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length)
select new { Extension = extGroup.Key, TotalSize = totalSizeQuery.Sum() };
3735
2008/02/15(金) 10:26:11 // .Sum()の場所を変えてみる(結果はsizeQuery2と同じです)
var sizeQuery3 = from extGroup in extGroupQuery
let totalSize = (from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length).Sum()
select new { Extension = extGroup.Key, TotalSize = totalSize };
// サブクエリを拡張メソッドに変えてみる(場合によってはサブクエリよりもすっきり書けます)
var sizeQuery4 = from extGroup in extGroupQuery
let totalSize = extGroup.Select<string, long>(filename => new System.IO.FileInfo(filename).Length).Sum()
select new { Extension = extGroup.Key, TotalSize = totalSize };
// extGroupQuery, sizeQuery2をまとめてみる
var sizeQuery5 = from filename in files
let ext = System.IO.Path.GetExtension(filename).ToLower()
group filename by ext into extGroup
let totalSizeQuery = (from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length)
select new { Extension = extGroup.Key, TotalSize = totalSizeQuery };
とりあえず以上です。
もっと気の利いた例を作ったら、また書き込みます。
var sizeQuery3 = from extGroup in extGroupQuery
let totalSize = (from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length).Sum()
select new { Extension = extGroup.Key, TotalSize = totalSize };
// サブクエリを拡張メソッドに変えてみる(場合によってはサブクエリよりもすっきり書けます)
var sizeQuery4 = from extGroup in extGroupQuery
let totalSize = extGroup.Select<string, long>(filename => new System.IO.FileInfo(filename).Length).Sum()
select new { Extension = extGroup.Key, TotalSize = totalSize };
// extGroupQuery, sizeQuery2をまとめてみる
var sizeQuery5 = from filename in files
let ext = System.IO.Path.GetExtension(filename).ToLower()
group filename by ext into extGroup
let totalSizeQuery = (from filename in extGroup
let fileinfo = new System.IO.FileInfo(filename)
select fileinfo.Length)
select new { Extension = extGroup.Key, TotalSize = totalSizeQuery };
とりあえず以上です。
もっと気の利いた例を作ったら、また書き込みます。
3835
2008/02/15(金) 11:52:15 >>35-37の応用で、ファイルの重複を検出するコードをLINQでコンパクトに書いてみます。
次のメソッドが存在するという前提です。
static string GetMD5String(string filename)
{
using (System.Security.Cryptography.MD5CryptoServiceProvider md5
= new System.Security.Cryptography.MD5CryptoServiceProvider())
{
byte[] data = System.IO.File.ReadAllBytes(filename);
byte[] hash = md5.ComputeHash(data);
StringBuilder buf = new StringBuilder();
foreach (byte b in hash)
{
buf.AppendFormat("{0:x2}", b);
}
return buf.ToString();
}
}
次のメソッドが存在するという前提です。
static string GetMD5String(string filename)
{
using (System.Security.Cryptography.MD5CryptoServiceProvider md5
= new System.Security.Cryptography.MD5CryptoServiceProvider())
{
byte[] data = System.IO.File.ReadAllBytes(filename);
byte[] hash = md5.ComputeHash(data);
StringBuilder buf = new StringBuilder();
foreach (byte b in hash)
{
buf.AppendFormat("{0:x2}", b);
}
return buf.ToString();
}
}
3935
2008/02/15(金) 11:52:51 まずは単純だけど遅いバージョンから
// ファイルをハッシュ値でグループ化する
// 全ファイルを読み込んでハッシュ値を計算するので遅いです
var hashGroupQuery = from filehash in
(from filename in files
let hash = GetMD5String(filename)
select new { Filename = filename, Hash = hash })
group filehash by filehash.Hash into hashGroup
where hashGroup.Count() >= 2
select hashGroup;
foreach (var hashGroup in hashGroupQuery)
{
Console.WriteLine("Hash: {0}, Count: {1}", hashGroup.Key, hashGroup.Count());
foreach (var filehash in hashGroup)
{
Console.WriteLine("\t{0}", filehash.Filename);
}
}
// ファイルをハッシュ値でグループ化する
// 全ファイルを読み込んでハッシュ値を計算するので遅いです
var hashGroupQuery = from filehash in
(from filename in files
let hash = GetMD5String(filename)
select new { Filename = filename, Hash = hash })
group filehash by filehash.Hash into hashGroup
where hashGroup.Count() >= 2
select hashGroup;
foreach (var hashGroup in hashGroupQuery)
{
Console.WriteLine("Hash: {0}, Count: {1}", hashGroup.Key, hashGroup.Count());
foreach (var filehash in hashGroup)
{
Console.WriteLine("\t{0}", filehash.Filename);
}
}
4035
2008/02/15(金) 11:56:08 次に前処理を行って高速化したバージョン
// 処理を高速化するため、ファイルサイズでグループ化しておく
// (ファイルサイズはファイルを読み込まなくても取得できるので)
var sizeGroupQuery = from filesize in
(from filename in files
let fileinfo = new System.IO.FileInfo(filename)
let size = fileinfo.Length
select new { Filename = filename, Size = size })
group filesize by filesize.Size into sizeGroup
where sizeGroup.Count() >= 2
select sizeGroup;
foreach (var sizeGroup in sizeGroupQuery)
{
// ハッシュ値でグループ化する
var hashGroupQuery2 = from filehash in
(from filesize in sizeGroup
let hash = GetMD5String(filesize.Filename)
select new { Filename = filesize.Filename, Hash = hash })
group filehash by filehash.Hash into hashGroup
where hashGroup.Count() >= 2
select hashGroup;
foreach (var hashGroup in hashGroupQuery2)
{
// (行数オーバーのため略 >>39と同じです)
}
}
// 処理を高速化するため、ファイルサイズでグループ化しておく
// (ファイルサイズはファイルを読み込まなくても取得できるので)
var sizeGroupQuery = from filesize in
(from filename in files
let fileinfo = new System.IO.FileInfo(filename)
let size = fileinfo.Length
select new { Filename = filename, Size = size })
group filesize by filesize.Size into sizeGroup
where sizeGroup.Count() >= 2
select sizeGroup;
foreach (var sizeGroup in sizeGroupQuery)
{
// ハッシュ値でグループ化する
var hashGroupQuery2 = from filehash in
(from filesize in sizeGroup
let hash = GetMD5String(filesize.Filename)
select new { Filename = filesize.Filename, Hash = hash })
group filehash by filehash.Hash into hashGroup
where hashGroup.Count() >= 2
select hashGroup;
foreach (var hashGroup in hashGroupQuery2)
{
// (行数オーバーのため略 >>39と同じです)
}
}
41デフォルトの名無しさん
2008/02/16(土) 00:03:522008/02/16(土) 00:04:35
Q.データを確認したい
ツールバーにある DataGridView は、とりあえずデータの中身を見てみたい時にとても便利です。
DataSource プロパティーにデータをセットする事で見ることができます。
ただし、ここに設定できるオブジェクトは IList , IListSource , IBindingList , IBindingListView
の四つです。
また、要素は、フィールドメンバでは駄目で、プロパティーでなければなりません。
C# 3.0 より追加された省略形が便利です。
class Row {
public int Data1 { set ; get ; }
public int Data2 { set ; get ; }
}
dataGridView1.DataSource = new Row[] { new Row() { Data1 = 1, Data2 = 2 } };
ツールバーにある DataGridView は、とりあえずデータの中身を見てみたい時にとても便利です。
DataSource プロパティーにデータをセットする事で見ることができます。
ただし、ここに設定できるオブジェクトは IList , IListSource , IBindingList , IBindingListView
の四つです。
また、要素は、フィールドメンバでは駄目で、プロパティーでなければなりません。
C# 3.0 より追加された省略形が便利です。
class Row {
public int Data1 { set ; get ; }
public int Data2 { set ; get ; }
}
dataGridView1.DataSource = new Row[] { new Row() { Data1 = 1, Data2 = 2 } };
2008/02/16(土) 00:05:16
Q.from ... として作ったデータが見れない
IList 等に変換してしまうのが便利です。
var tableX = new [] {
new { X=1 , P=0.25 },
new { X=2 , P=0.50 },
new { X=3 , P=0.25 },
};
var table2 = from row in tableX orderby row.P select row;
dataGridView1.DataSource = table2.ToArray();
IList 等に変換してしまうのが便利です。
var tableX = new [] {
new { X=1 , P=0.25 },
new { X=2 , P=0.50 },
new { X=3 , P=0.25 },
};
var table2 = from row in tableX orderby row.P select row;
dataGridView1.DataSource = table2.ToArray();
2008/02/16(土) 00:05:53
Q.表の中から必要な要素を選択したい
where句を使います。
class Row {
public int X { set ; get ; }
public double P { set ; get ; }
}
var tableX = new Row[] {
new Row() { X=1 , P=0.25 },
new Row() { X=2 , P=0.50 },
new Row() { X=3 , P=0.25 },
};
// Xが2以下の行を選択する
var table1 = from row in tableX where row.X <= 2 select row;
// Xが2以下の行を選択したのち、さらに P <= 0.25 となる行を絞り込む
var table2 = from row in tableX where row.X <= 2 where row.P <= 0.25 select row;
dataGridView1.DataSource = table1.ToArray();
dataGridView2.DataSource = table2.ToArray();
where句を使います。
class Row {
public int X { set ; get ; }
public double P { set ; get ; }
}
var tableX = new Row[] {
new Row() { X=1 , P=0.25 },
new Row() { X=2 , P=0.50 },
new Row() { X=3 , P=0.25 },
};
// Xが2以下の行を選択する
var table1 = from row in tableX where row.X <= 2 select row;
// Xが2以下の行を選択したのち、さらに P <= 0.25 となる行を絞り込む
var table2 = from row in tableX where row.X <= 2 where row.P <= 0.25 select row;
dataGridView1.DataSource = table1.ToArray();
dataGridView2.DataSource = table2.ToArray();
2008/02/16(土) 00:06:24
Q.表をソートしたい
1.orderby句を使います、単純なソートは以下の通りです。
class Row {
public string S { set; get; }
public int D { set; get; }
}
var tableOrg = new Row[] {
new Row() { D=3 },
new Row() { D=1 },
new Row() { D=4 },
new Row() { D=1 },
new Row() { D=5 },
new Row() { D=9 },
};
// 昇順(ascending省略可)
var table1 = from row in tableOrg orderby row.D ascending select row;
// 降順
var table2 = from row in tableOrg orderby row.D descending select row;
dataGridView1.DataSource = table1.ToArray();
dataGridView2.DataSource = table2.ToArray();
1.orderby句を使います、単純なソートは以下の通りです。
class Row {
public string S { set; get; }
public int D { set; get; }
}
var tableOrg = new Row[] {
new Row() { D=3 },
new Row() { D=1 },
new Row() { D=4 },
new Row() { D=1 },
new Row() { D=5 },
new Row() { D=9 },
};
// 昇順(ascending省略可)
var table1 = from row in tableOrg orderby row.D ascending select row;
// 降順
var table2 = from row in tableOrg orderby row.D descending select row;
dataGridView1.DataSource = table1.ToArray();
dataGridView2.DataSource = table2.ToArray();
2008/02/16(土) 00:15:04
2.二つ以上の項目についてソートする場合は以下の通りです。
class Row {
public string S { set; get; }
public int D { set; get; }
}
var tableOrg = new Row[] {
new Row() { S="A" , D=3 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=4 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=5 },
new Row() { S="B" , D=9 },
};
// SとD を使って比較します
var table1 = from row in tableOrg orderby row.S, row.D select row;
dataGridView1.DataSource = table1.ToArray();
class Row {
public string S { set; get; }
public int D { set; get; }
}
var tableOrg = new Row[] {
new Row() { S="A" , D=3 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=4 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=5 },
new Row() { S="B" , D=9 },
};
// SとD を使って比較します
var table1 = from row in tableOrg orderby row.S, row.D select row;
dataGridView1.DataSource = table1.ToArray();
2008/02/16(土) 00:15:29
3.二回に分けてソートする場合は以下の通りです。(2と結果が異なります)
class Row {
public string S { set; get; }
public int D { set; get; }
}
var tableOrg = new Row[] {
new Row() { S="A" , D=3 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=4 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=5 },
new Row() { S="B" , D=9 },
};
// SとD を使って比較します
var table1 = from row in tableOrg orderby row.S orderby row.D select row;
dataGridView1.DataSource = table1.ToArray();
class Row {
public string S { set; get; }
public int D { set; get; }
}
var tableOrg = new Row[] {
new Row() { S="A" , D=3 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=4 },
new Row() { S="B" , D=1 },
new Row() { S="A" , D=5 },
new Row() { S="B" , D=9 },
};
// SとD を使って比較します
var table1 = from row in tableOrg orderby row.S orderby row.D select row;
dataGridView1.DataSource = table1.ToArray();
2008/02/16(土) 09:02:20
ところで、LINQってどう発音するの?
2008/02/16(土) 09:48:38
発音は link と同じらしいよ。
2008/02/16(土) 17:51:35
>>1 です、今日は、表の結合のやり方を紹介します。
2008/02/16(土) 17:52:36
Q.表を結合したい1(クロス結合)
Row1の表にRow2の表の要素をすべて結合します。
class Row1 { public string S { set; get; } }
class Row2 { public string S { set; get; } }
class Row3 { public string R1 { set; get; } public string R2 { set; get; } }
var tableOrg1 = new Row1[] { new Row1() { S="赤" }, new Row1() { S="青" },};
var tableOrg2 = new Row2[] { new Row2() { S="青" }, new Row2() { S="緑" },};
var table1 = from row1 in tableOrg1 from row2 in tableOrg2 select new Row3() { R1 = row1.S, R2 = row2.S };
dataGridView1.DataSource = table1.ToArray();
dataGridView2.DataSource = table2.ToArray();
table1 の結果
赤 青
赤 緑
青 青
青 緑
この機能、一見は使い道がなさそうですが、これをフィルターしてゆく事により価値が出てきます。
Row1の表にRow2の表の要素をすべて結合します。
class Row1 { public string S { set; get; } }
class Row2 { public string S { set; get; } }
class Row3 { public string R1 { set; get; } public string R2 { set; get; } }
var tableOrg1 = new Row1[] { new Row1() { S="赤" }, new Row1() { S="青" },};
var tableOrg2 = new Row2[] { new Row2() { S="青" }, new Row2() { S="緑" },};
var table1 = from row1 in tableOrg1 from row2 in tableOrg2 select new Row3() { R1 = row1.S, R2 = row2.S };
dataGridView1.DataSource = table1.ToArray();
dataGridView2.DataSource = table2.ToArray();
table1 の結果
赤 青
赤 緑
青 青
青 緑
この機能、一見は使い道がなさそうですが、これをフィルターしてゆく事により価値が出てきます。
2008/02/16(土) 17:53:19
Q.表を結合したい2(等価結合、きっと良く使うに違いない)
Row1の表にRow2の表の要素を普通に結合します。
この例では、 tableOrg1 の Index 番号と同じ Index のある tableOrg2 の列に結合します。
class Row1 { public int LineNo { set; get; } public int Index { set; get; } }
class Row2 { public int Index { set; get; } public string Data1 { set; get; } public string Data2 { set; get; } }
class Row3 { public int LineNo { set; get; } public string Data1 { set; get; } public string Data2 { set; get; } }
var tableOrg1 = new Row1[] {
new Row1() { LineNo=1 , Index = 3 },
new Row1() { LineNo=2 , Index = 1 },
new Row1() { LineNo=3 , Index = 4 },
new Row1() { LineNo=4 , Index = 1 },
new Row1() { LineNo=5 , Index = 5 },
};
var tableOrg2 = new Row2[] {
new Row2() { Index=1 , Data1 = "Index1" , Data2="ABC" },
new Row2() { Index=2 , Data1 = "Index2" , Data2="DEF" },
new Row2() { Index=3 , Data1 = "Index3" , Data2="GHI" },
new Row2() { Index=4 , Data1 = "Index4" , Data2="JKL" },
new Row2() { Index=5 , Data1 = "Index5" , Data2="MNL" },
};
var table1 = from row1 in tableOrg1 join row2 in tableOrg2 on row1.Index equals row2.Index select new Row3() { LineNo = row1.LineNo, Data1 = row2.Data1, Data2 = row2.Data2 };
table1 の結果
1 Index3 GHI
2 Index1 ABC
3 Index4 JKL
4 Index1 ABC
5 Index5 MNL
Row1の表にRow2の表の要素を普通に結合します。
この例では、 tableOrg1 の Index 番号と同じ Index のある tableOrg2 の列に結合します。
class Row1 { public int LineNo { set; get; } public int Index { set; get; } }
class Row2 { public int Index { set; get; } public string Data1 { set; get; } public string Data2 { set; get; } }
class Row3 { public int LineNo { set; get; } public string Data1 { set; get; } public string Data2 { set; get; } }
var tableOrg1 = new Row1[] {
new Row1() { LineNo=1 , Index = 3 },
new Row1() { LineNo=2 , Index = 1 },
new Row1() { LineNo=3 , Index = 4 },
new Row1() { LineNo=4 , Index = 1 },
new Row1() { LineNo=5 , Index = 5 },
};
var tableOrg2 = new Row2[] {
new Row2() { Index=1 , Data1 = "Index1" , Data2="ABC" },
new Row2() { Index=2 , Data1 = "Index2" , Data2="DEF" },
new Row2() { Index=3 , Data1 = "Index3" , Data2="GHI" },
new Row2() { Index=4 , Data1 = "Index4" , Data2="JKL" },
new Row2() { Index=5 , Data1 = "Index5" , Data2="MNL" },
};
var table1 = from row1 in tableOrg1 join row2 in tableOrg2 on row1.Index equals row2.Index select new Row3() { LineNo = row1.LineNo, Data1 = row2.Data1, Data2 = row2.Data2 };
table1 の結果
1 Index3 GHI
2 Index1 ABC
3 Index4 JKL
4 Index1 ABC
5 Index5 MNL
2008/02/16(土) 17:54:00
Q.表を結合したい3(非等価結合、やや使う違いない)
let を使って、選択した行を保持する事により実現できます。
class 得点表 { public string 氏名 { set; get; } public int 得点 { set; get; } }
class 評価表 { public int 以上 { set; get; } public int 未満 { set; get; } public string 評価 { set; get; } }
class 氏名と評価 { public string 氏名 { set; get; } public string 評価 { set; get; } }
var tableOrg1 = new 得点表[] {
new 得点表() { 氏名="Aさん" , 得点=10 },
new 得点表() { 氏名="Bさん" , 得点=100 },
new 得点表() { 氏名="Cさん" , 得点=60 },
};
var tableOrg2 = new 評価表[] {
new 評価表() { 以上=0 , 未満=20, 評価="丙" },
new 評価表() { 以上=20 , 未満=70, 評価="乙" },
new 評価表() { 以上=70 , 未満=101, 評価="甲" },
};
var table1 = from row1 in tableOrg1
let selectLines = from row2 in tableOrg2 where (row2.以上 <= row1.得点 && row1.得点 < row2.未満) select row2
select new 氏名と評価() { 氏名 = row1.氏名, 評価 = selectLines.First().評価 };
table1 の結果
Aさん 丙
Bさん 甲
Cさん 乙
あんま綺麗じゃない……equalsに対してLINQの拡張求む > Microsoft
let を使って、選択した行を保持する事により実現できます。
class 得点表 { public string 氏名 { set; get; } public int 得点 { set; get; } }
class 評価表 { public int 以上 { set; get; } public int 未満 { set; get; } public string 評価 { set; get; } }
class 氏名と評価 { public string 氏名 { set; get; } public string 評価 { set; get; } }
var tableOrg1 = new 得点表[] {
new 得点表() { 氏名="Aさん" , 得点=10 },
new 得点表() { 氏名="Bさん" , 得点=100 },
new 得点表() { 氏名="Cさん" , 得点=60 },
};
var tableOrg2 = new 評価表[] {
new 評価表() { 以上=0 , 未満=20, 評価="丙" },
new 評価表() { 以上=20 , 未満=70, 評価="乙" },
new 評価表() { 以上=70 , 未満=101, 評価="甲" },
};
var table1 = from row1 in tableOrg1
let selectLines = from row2 in tableOrg2 where (row2.以上 <= row1.得点 && row1.得点 < row2.未満) select row2
select new 氏名と評価() { 氏名 = row1.氏名, 評価 = selectLines.First().評価 };
table1 の結果
Aさん 丙
Bさん 甲
Cさん 乙
あんま綺麗じゃない……equalsに対してLINQの拡張求む > Microsoft
54デフォルトの名無しさん
2008/02/16(土) 17:54:50 そのうち、逆引きLINQでも作って、纏めてみたいな……
こうやって、Q&A を作ってみると、LINQは集合の積的な演算は強いのに和の方は至って貧弱なんですね。
全部LINQにしなくても適当にメソッドを使えば良いという話もありますが……
こうやって、Q&A を作ってみると、LINQは集合の積的な演算は強いのに和の方は至って貧弱なんですね。
全部LINQにしなくても適当にメソッドを使えば良いという話もありますが……
2008/02/16(土) 18:39:49
>>54
まあ、リレーショナルデータベースがそういうものだからね<テーブル積を多用
まあ、リレーショナルデータベースがそういうものだからね<テーブル積を多用
2008/02/16(土) 18:59:05
2008/02/16(土) 19:11:27
そういう概念を導入すると、
作り手だけでなくて、使い手にも圏論の知識を強要することにならないかな。
LINQ は、リレーショナルデータベースの文化を
OOP 言語に導入したものだから、
少なくとも SQL チックに select とか where ってキーワードを使ってる限り、
リレーショナルデータベースの文化を大きく逸脱するようなことは
しない方がいいと思う。
ヘジたんがクエリ式否定派(関数形式ばっかり使う)な理由も
そういうところにあるのかもね。
作り手だけでなくて、使い手にも圏論の知識を強要することにならないかな。
LINQ は、リレーショナルデータベースの文化を
OOP 言語に導入したものだから、
少なくとも SQL チックに select とか where ってキーワードを使ってる限り、
リレーショナルデータベースの文化を大きく逸脱するようなことは
しない方がいいと思う。
ヘジたんがクエリ式否定派(関数形式ばっかり使う)な理由も
そういうところにあるのかもね。
2008/02/16(土) 19:11:51
>>53
ちょっとだけ短くしたよ。
var table1 = from row1 in tableOrg1
let 評価 = tableOrg2.First(row2 => row2.以上 <= row1.得点 && row1.得点 < row2.未満)
select new { row1.氏名, 評価.評価 };
ちょっとだけ短くしたよ。
var table1 = from row1 in tableOrg1
let 評価 = tableOrg2.First(row2 => row2.以上 <= row1.得点 && row1.得点 < row2.未満)
select new { row1.氏名, 評価.評価 };
2008/02/16(土) 19:15:04
あと、同値分類みたいなのは、group by じゃだめ?
6058
2008/02/16(土) 19:24:17 >>53
パターンマッチっぽくしてみたよ。
var table1 =
from row1 in tableOrg1
let 評価結果 = tableOrg2.Where(row2 => row2.以上 <= row1.得点 && row1.得点 < row2.未満)
.Select(row2 => row2.評価)
.Concat(Enumerable.Repeat("見つからないよ", 1))
.Take(1)
from 評価 in 評価結果
select new { row1.氏名, 評価 };
パターンマッチっぽくしてみたよ。
var table1 =
from row1 in tableOrg1
let 評価結果 = tableOrg2.Where(row2 => row2.以上 <= row1.得点 && row1.得点 < row2.未満)
.Select(row2 => row2.評価)
.Concat(Enumerable.Repeat("見つからないよ", 1))
.Take(1)
from 評価 in 評価結果
select new { row1.氏名, 評価 };
2008/02/16(土) 20:13:38
>>1です
>>57
概念を導入することと、どう表現してどう使わせるかは違うと思うんですよ
高度な概念も、図にしてみれば、あんたバカ、何当り前の事をと思わずにはいられない概念は多いと思うんですよ。
圏論のそんな物の内の一つだと思っています。
ちなみにヘジたん理論無視の直感実装大好きです、実装は理屈じゃないですよ、いいと思ったらそれがいいんだと思ってます。
理屈は後付け、原爆の爆縮レンズが開発される時に、火薬職人が二種類の火薬使えばいいじゃんといって、頭でっかちのノイマンが計算するっていうのは悪くないと
ここでは、火薬職人がヘジたんで、頭でっかちがリサーチの人たちですね。
>>60
ありがとさんです、なるほどなるほど、いろいろ参考になりますです。
まだまだ初心者なんで今後ともよろしくお願いします。
>>57
概念を導入することと、どう表現してどう使わせるかは違うと思うんですよ
高度な概念も、図にしてみれば、あんたバカ、何当り前の事をと思わずにはいられない概念は多いと思うんですよ。
圏論のそんな物の内の一つだと思っています。
ちなみにヘジたん理論無視の直感実装大好きです、実装は理屈じゃないですよ、いいと思ったらそれがいいんだと思ってます。
理屈は後付け、原爆の爆縮レンズが開発される時に、火薬職人が二種類の火薬使えばいいじゃんといって、頭でっかちのノイマンが計算するっていうのは悪くないと
ここでは、火薬職人がヘジたんで、頭でっかちがリサーチの人たちですね。
>>60
ありがとさんです、なるほどなるほど、いろいろ参考になりますです。
まだまだ初心者なんで今後ともよろしくお願いします。
2008/02/16(土) 20:26:54
高度な概念といえば、たとえばλ式なんかがそうなんですが、関数だと思うと恐ろしい事になりますが、
あれってとどのつまりは、引数が添え字になっている唯のベクトルですよね。なにやら要素が並んでいるだけの物です。
よく無限次元になってしまうので、普通に書けないからああ書いたというだけで……
もっと解り易くならないかなと思ったりします。
あれってとどのつまりは、引数が添え字になっている唯のベクトルですよね。なにやら要素が並んでいるだけの物です。
よく無限次元になってしまうので、普通に書けないからああ書いたというだけで……
もっと解り易くならないかなと思ったりします。
2008/02/16(土) 21:07:54
DB屋もやってる俺からみると、これはぶっちゃけキモい
変にSQLの知識あるとちょっと慣れそうにないなぁ、これは
変にSQLの知識あるとちょっと慣れそうにないなぁ、これは
2008/02/17(日) 00:29:39
>>63
俺も一応オラクルマスター持ちなんだが(システム屋から足を洗って長いけど)、
それはそれ、これはこれだな。
DBとだけ使っている限りは、SQL以上のことができるわけじゃないから「ただのキモいSQL」という見方も、そう間違ってはいないだろう。
SQLを基準にして見れば、SQLとの違いが気持ち悪いのは確か。しかし、メモリ上のデータのグループ化やら結合やら、定型的なわりに再利用しづらいコードを
いちいち書いては「こんな処理、SQLならSELECT文一発なのに」と思っていた人にとっては、むしろSQLに近づいた感じなのではないだろうか。
俺も一応オラクルマスター持ちなんだが(システム屋から足を洗って長いけど)、
それはそれ、これはこれだな。
DBとだけ使っている限りは、SQL以上のことができるわけじゃないから「ただのキモいSQL」という見方も、そう間違ってはいないだろう。
SQLを基準にして見れば、SQLとの違いが気持ち悪いのは確か。しかし、メモリ上のデータのグループ化やら結合やら、定型的なわりに再利用しづらいコードを
いちいち書いては「こんな処理、SQLならSELECT文一発なのに」と思っていた人にとっては、むしろSQLに近づいた感じなのではないだろうか。
2008/02/17(日) 00:53:13
OOP 言語が SQL に近づいたこと
(より「意図通りに書ける」ようになった)も重要だし、
in-memory オブジェクト、XML、DB に対して
ほぼ同じ書式でクエリが書けることも重要かと。
(より「意図通りに書ける」ようになった)も重要だし、
in-memory オブジェクト、XML、DB に対して
ほぼ同じ書式でクエリが書けることも重要かと。
2008/02/17(日) 20:41:50
LINQとSQLの違いのひとつにプランナの有無がある。
LINQは処理順に書かなくてはならないし、必ず記述順で処理される。
LINQはSQLの類似品と考えるより、
Enumeratorやコールバック(ラムダ)を使ったパイプライン処理であり
コレクション処理の延長だと思ったほうが誤解がない。
LINQは処理順に書かなくてはならないし、必ず記述順で処理される。
LINQはSQLの類似品と考えるより、
Enumeratorやコールバック(ラムダ)を使ったパイプライン処理であり
コレクション処理の延長だと思ったほうが誤解がない。
2008/02/17(日) 21:31:55
2008/02/17(日) 21:32:46
Q.表を分割したい
LINQの文法は、例えば以下のような形式になっています。
from アイテム名 in 元データ where アイテム名.項目=="条件のあっているデータ" select 新しい行の定義
上記の文の最後の部分「select 新しい行の定義」の部分を「group 新しい行の定義 by ふるい分けの基準となる値」
とする事により表を分割できます。
ここでは
1 "ABC"
2 "DEF"
3 "ABC"
4 "DEF"
5 "GHI"
となっている表を、以下の三つの表に分割する方法です。
ABC のある列
1 ABC
3 ABC
DEF のある列
2 DEF
4 DEF
GHI のある列
5 GHI
LINQの文法は、例えば以下のような形式になっています。
from アイテム名 in 元データ where アイテム名.項目=="条件のあっているデータ" select 新しい行の定義
上記の文の最後の部分「select 新しい行の定義」の部分を「group 新しい行の定義 by ふるい分けの基準となる値」
とする事により表を分割できます。
ここでは
1 "ABC"
2 "DEF"
3 "ABC"
4 "DEF"
5 "GHI"
となっている表を、以下の三つの表に分割する方法です。
ABC のある列
1 ABC
3 ABC
DEF のある列
2 DEF
4 DEF
GHI のある列
5 GHI
2008/02/17(日) 21:33:19
ツールボックスから DataGridView と TextBox を三つ貼り付けて以下のコードを実行すると三つの表が完成します。
var tableOrg1 = new[] {
new { LineNo = 1 , Data = "ABC" } ,
new { LineNo = 2 , Data = "DEF" } ,
new { LineNo = 3 , Data = "ABC" } ,
new { LineNo = 4 , Data = "DEF" } ,
new { LineNo = 5 , Data = "GHI" } ,
};
var dataGridViewArray = new[] { dataGridView1, dataGridView2, dataGridView3 };
var textBoxArray = new[] { textBox1, textBox2, textBox3 };
var tableArray = (from row in tableOrg1 group row by row.Data).ToArray();
for (int i = 0; i < dataGridViewArray.GetLength(0) && i < tableArray.GetLength(0); ++i) {
dataGridViewArray[i].DataSource = tableArray[i].ToArray();
textBoxArray[i].Text = tableArray[i].Key.ToString();
}
by row.Data の部分を変更することにより、例えばby row.Data.Length などとする事により複雑なふるい分けが可能です。
var tableOrg1 = new[] {
new { LineNo = 1 , Data = "ABC" } ,
new { LineNo = 2 , Data = "DEF" } ,
new { LineNo = 3 , Data = "ABC" } ,
new { LineNo = 4 , Data = "DEF" } ,
new { LineNo = 5 , Data = "GHI" } ,
};
var dataGridViewArray = new[] { dataGridView1, dataGridView2, dataGridView3 };
var textBoxArray = new[] { textBox1, textBox2, textBox3 };
var tableArray = (from row in tableOrg1 group row by row.Data).ToArray();
for (int i = 0; i < dataGridViewArray.GetLength(0) && i < tableArray.GetLength(0); ++i) {
dataGridViewArray[i].DataSource = tableArray[i].ToArray();
textBoxArray[i].Text = tableArray[i].Key.ToString();
}
by row.Data の部分を変更することにより、例えばby row.Data.Length などとする事により複雑なふるい分けが可能です。
2008/02/17(日) 21:34:14
Q.特定項目で分類したい
項目に大小比較ができれば、ソートしてしまえば良いのですが、それが無い場合には少し困った事になります。
ここでは、前出の「表を分割したい」と組み合わせた方法を紹介します。
それは、前出のLINQ文「from row in tableOrg1 group row by row.Data」の後ろに「into tmp1 from tmp2 in tmp1 select tmp2」を追加して
from row in tableOrg1 group row by row.Data into tmp1 from tmp2 in tmp1 select tmp2
とすると実現できます、まじないの部類ですが・・・うまく行きます。
var tableOrg1 = new[] {
new { LineNo = 1 , Data = "ABC" } ,
new { LineNo = 2 , Data = "DEF" } ,
new { LineNo = 3 , Data = "ABC" } ,
new { LineNo = 4 , Data = "DEF" } ,
new { LineNo = 5 , Data = "GHI" } ,
};
var table1 = from row in tableOrg1 group row by row.Data into tmp1 from tmp2 in tmp1 select tmp2;
dataGridView1.DataSource = table1.ToArray();
項目に大小比較ができれば、ソートしてしまえば良いのですが、それが無い場合には少し困った事になります。
ここでは、前出の「表を分割したい」と組み合わせた方法を紹介します。
それは、前出のLINQ文「from row in tableOrg1 group row by row.Data」の後ろに「into tmp1 from tmp2 in tmp1 select tmp2」を追加して
from row in tableOrg1 group row by row.Data into tmp1 from tmp2 in tmp1 select tmp2
とすると実現できます、まじないの部類ですが・・・うまく行きます。
var tableOrg1 = new[] {
new { LineNo = 1 , Data = "ABC" } ,
new { LineNo = 2 , Data = "DEF" } ,
new { LineNo = 3 , Data = "ABC" } ,
new { LineNo = 4 , Data = "DEF" } ,
new { LineNo = 5 , Data = "GHI" } ,
};
var table1 = from row in tableOrg1 group row by row.Data into tmp1 from tmp2 in tmp1 select tmp2;
dataGridView1.DataSource = table1.ToArray();
71デフォルトの名無しさん
2008/02/17(日) 21:35:03 linq の文法 query-body ::= query-body-clause* final-query-clause query-continuation?
この query-body-clause* の部分が複数になると急に難解になりますね。
どういう時に、使うと見通しが良くなるのか、あるいはどういう時にろくな事にならないのか
パターンとアンチパターンを揃える必要がある気がします。
この query-body-clause* の部分が複数になると急に難解になりますね。
どういう時に、使うと見通しが良くなるのか、あるいはどういう時にろくな事にならないのか
パターンとアンチパターンを揃える必要がある気がします。
2008/02/17(日) 21:40:18
2008/02/18(月) 18:11:36
>>1 です、今日は、LINQ文法の詳細をやろうと思ったのですが……
一通りざらっと見てみて、LINQの文法はひょっとして質が悪いのでは?という疑惑が湧いてきました。
LINQの核心部分は、from join その他 LINQ キーワードではなく、実際の処理が記述されている System.Linq.Enumerable であるので
これが致命傷になるとは思えないのですが、簡単に使うための上っ面としては今一な気がします。
このキーワードと文法には、変な汎用性があり、相当な広範囲にわたって複雑な処理が可能ですが
それを行うなら、メソッドベースで行ったほうが良さそうな気がします。
1.方向性としては、良くある定型について、LINQ 文法を使って完結に記述。使用例一覧に纏めておき、サクッと使う。
2.例外的なクエリについては、メソッドを使い、一つ一つ区切りながらクエリを完成させる。
こういう使い方が良いのではと思い始めました。
皆さんはどんな意見をお持ちでしょうか?
一通りざらっと見てみて、LINQの文法はひょっとして質が悪いのでは?という疑惑が湧いてきました。
LINQの核心部分は、from join その他 LINQ キーワードではなく、実際の処理が記述されている System.Linq.Enumerable であるので
これが致命傷になるとは思えないのですが、簡単に使うための上っ面としては今一な気がします。
このキーワードと文法には、変な汎用性があり、相当な広範囲にわたって複雑な処理が可能ですが
それを行うなら、メソッドベースで行ったほうが良さそうな気がします。
1.方向性としては、良くある定型について、LINQ 文法を使って完結に記述。使用例一覧に纏めておき、サクッと使う。
2.例外的なクエリについては、メソッドを使い、一つ一つ区切りながらクエリを完成させる。
こういう使い方が良いのではと思い始めました。
皆さんはどんな意見をお持ちでしょうか?
74デフォルトの名無しさん
2008/02/18(月) 18:13:51 http://www.microsoft.com/japan/msdn/net/bb308959.aspx より。
今日はこれを、初心者向けの説明にしようと思ったのですが……難しすぎ
区切り無く、際限なく、限りなく書き方が広がるとマニュアル化ができません。
query-continuation? の定義に query-body があるのが最悪だ。
だれがこれを手際よく解説するアイディアお持ちで無いでしょうか?
query-body ::= query-body-clause* final-query-clause query-continuation?
query-body-clause ::= (from-clause | join-clause | let-clause | where-clause | orderby-clause)
join-clause ::= join itemName in srcExpr on keyExpr equals keyExpr (into itemName)?
let-clause ::= let itemName = selExpr
where-clause ::= where predExpr
orderby-clause ::= orderby (keyExpr (ascending | descending)?)*
final-query-clause ::= (select-clause | groupby-clause)
select-clause ::= select selExpr
groupby-clause ::= group selExpr by keyExpr
query-continuation ::= into itemName query-body
#ひょっとしてカンマ忘れてる?
#orderby-clause ::= orderby (keyExpr (ascending | descending)? ,)*
今日はこれを、初心者向けの説明にしようと思ったのですが……難しすぎ
区切り無く、際限なく、限りなく書き方が広がるとマニュアル化ができません。
query-continuation? の定義に query-body があるのが最悪だ。
だれがこれを手際よく解説するアイディアお持ちで無いでしょうか?
query-body ::= query-body-clause* final-query-clause query-continuation?
query-body-clause ::= (from-clause | join-clause | let-clause | where-clause | orderby-clause)
join-clause ::= join itemName in srcExpr on keyExpr equals keyExpr (into itemName)?
let-clause ::= let itemName = selExpr
where-clause ::= where predExpr
orderby-clause ::= orderby (keyExpr (ascending | descending)?)*
final-query-clause ::= (select-clause | groupby-clause)
select-clause ::= select selExpr
groupby-clause ::= group selExpr by keyExpr
query-continuation ::= into itemName query-body
#ひょっとしてカンマ忘れてる?
#orderby-clause ::= orderby (keyExpr (ascending | descending)? ,)*
2008/02/18(月) 18:52:44
>>73
LINQ って言葉の指す範囲は広くて、クエリ式もメソッド形式もどっちも LINQ よ。
from x in list みたいなのはクエリ式。
クエリ式でないと書きづらいのは、多重 from と join と let くらいかな。
まあ、transparent な変数が絡むとクエリ式使わないときつい。
逆に、クエリ式で書けないことも実に多い。
まあ、個人的には、
クエリ式で書けるものは全部クエリ式で、
それ以外だけメソッド形式で書いてる。
LINQ って言葉の指す範囲は広くて、クエリ式もメソッド形式もどっちも LINQ よ。
from x in list みたいなのはクエリ式。
クエリ式でないと書きづらいのは、多重 from と join と let くらいかな。
まあ、transparent な変数が絡むとクエリ式使わないときつい。
逆に、クエリ式で書けないことも実に多い。
まあ、個人的には、
クエリ式で書けるものは全部クエリ式で、
それ以外だけメソッド形式で書いてる。
2008/02/18(月) 18:56:38
2008/02/18(月) 19:00:39
対応関係としては、
from x in list where x > 0 select x;
↓
list.Where(x => x > 0); // 最後の Select はきえる
from x in list select x * x;
↓
list.Select(x => x * x);
from x in list select x * x into y where y > 5 select y;
↓
list.Select(x => x * x).Where(y => y > 5); // .Select の後ろにさらにメソッドが続く
from x in list where x > 0 select x;
↓
list.Where(x => x > 0); // 最後の Select はきえる
from x in list select x * x;
↓
list.Select(x => x * x);
from x in list select x * x into y where y > 5 select y;
↓
list.Select(x => x * x).Where(y => y > 5); // .Select の後ろにさらにメソッドが続く
2008/02/20(水) 00:08:01
2008/02/20(水) 04:36:32
Hibernate とは違うの?
2008/02/20(水) 10:09:28
2008/02/20(水) 18:48:34
2008/02/20(水) 20:25:54
>>79
簡単に言うと、O/Rマッピングは対症療法、LINQは原因療法、みたいな。
なんでこんなのが必要かってのは、
ttp://d.hatena.ne.jp/fromdusktildawn/20060216/1140064918
を読むと理解が深まるかも。
簡単に言うと、O/Rマッピングは対症療法、LINQは原因療法、みたいな。
なんでこんなのが必要かってのは、
ttp://d.hatena.ne.jp/fromdusktildawn/20060216/1140064918
を読むと理解が深まるかも。
2008/02/20(水) 21:16:01
LINQ最大の効果ポイントは、一般化と高速化にあるんじゃないかな
データベースから、XMLから、果ては適当なクラスや構造体まで統一手法で操作可能という点。
O/Rマッピングと目指すところがそもそも違うと思う
データベースから、XMLから、果ては適当なクラスや構造体まで統一手法で操作可能という点。
O/Rマッピングと目指すところがそもそも違うと思う
2008/02/20(水) 22:14:52
キャッシュポリシーは単純だけど、Linq to SQLはORM。
これだけはほかのと系統が違う。これで使うラムダ式は特殊なもの。
これだけはほかのと系統が違う。これで使うラムダ式は特殊なもの。
2008/02/20(水) 23:37:59
( ゚д゚)ノ ハイ!シツモーン!です。
次のように追加してくと実行時間がリニアに増えてくんだけど何か間違えてるんでしょうか?
プロジェクトごとあげてみました。
http://www.borujoa.org/upload/source/upload16875.zip
class Program {
static void Main(string[] args) {
var db =new TestDB(@"testDB.sdf");
db.DeleteDatabase();
db.CreateDatabase();
var count=0;
var tu=new TickUtil();
tu.WriteLine("begin--");
while(count++<5000){
var person=new Person{Name=string.Format("name-{0:8d}",count),
Age=count,Explanation=string.Format("Explain-{0}",count)};
db.Persons.InsertOnSubmit(person);
db.SubmitChanges();
if(count%100==0)
tu.WriteLine("new person-count={0}",count);
}
tu.WriteLine("end-");
}
}
次のように追加してくと実行時間がリニアに増えてくんだけど何か間違えてるんでしょうか?
プロジェクトごとあげてみました。
http://www.borujoa.org/upload/source/upload16875.zip
class Program {
static void Main(string[] args) {
var db =new TestDB(@"testDB.sdf");
db.DeleteDatabase();
db.CreateDatabase();
var count=0;
var tu=new TickUtil();
tu.WriteLine("begin--");
while(count++<5000){
var person=new Person{Name=string.Format("name-{0:8d}",count),
Age=count,Explanation=string.Format("Explain-{0}",count)};
db.Persons.InsertOnSubmit(person);
db.SubmitChanges();
if(count%100==0)
tu.WriteLine("new person-count={0}",count);
}
tu.WriteLine("end-");
}
}
2008/02/21(木) 01:06:41
LINQでWin32のメッセージマップって書けないの?
2008/02/21(木) 01:43:02
C++/CLI には無いの?
2008/02/21(木) 07:12:47
>>85
遅くなるというのは1件あたりの処理時間が増えるということかな?
それだったらCompact Editonなのが影響してるのかもしれない。
2005Expressで実行してみたらどうだろう。
db.SubmitChanges(); は5000件まとめての方が速いと思う。
メモリがきついようなら500件くらいまとめてで。
遅くなるというのは1件あたりの処理時間が増えるということかな?
それだったらCompact Editonなのが影響してるのかもしれない。
2005Expressで実行してみたらどうだろう。
db.SubmitChanges(); は5000件まとめての方が速いと思う。
メモリがきついようなら500件くらいまとめてで。
2008/02/21(木) 08:46:06
2008/02/21(木) 10:05:01
>>85のソースから
> protected string SetAndReturnDifferenceTimeString() {
> int current = Environment.TickCount;
> int lastDiff = current - _last;
> _last = current;
> return "[" + lastDiff + "]";
> }
> public void WriteLine(string message) {
> Console.WriteLine(message + " " + SetAndReturnDifferenceTimeString());
> }
> public void WriteLine(string message, params object[] args) {
> WriteLine(string.Format(message, args));
> }
100件毎に実行されるのってWriteLine(string message, params object[] args)じゃね?
最近プログラミングしてないんで間違ってたらスマソ
> protected string SetAndReturnDifferenceTimeString() {
> int current = Environment.TickCount;
> int lastDiff = current - _last;
> _last = current;
> return "[" + lastDiff + "]";
> }
> public void WriteLine(string message) {
> Console.WriteLine(message + " " + SetAndReturnDifferenceTimeString());
> }
> public void WriteLine(string message, params object[] args) {
> WriteLine(string.Format(message, args));
> }
100件毎に実行されるのってWriteLine(string message, params object[] args)じゃね?
最近プログラミングしてないんで間違ってたらスマソ
2008/02/21(木) 10:13:41
>>90
下のWriteLine()の中で上のを呼んでる。
下のWriteLine()の中で上のを呼んでる。
2008/02/22(金) 00:11:14
>>1 です
クエリ式はとりあえず放って置いて、メソッドでしか表現できないタイプのものを解説してみようと思っているのですが
まずは一発目で Aggregate あたりからやってみようかと思ってます。
ただ、このメソッドあまりにも関数型言語らしい仕様をしています。
何か良い説明方法はないかと色々さがしているのですが、良いのがあったら誰か紹介してください。
http://d.hatena.ne.jp/blanketsky/20071129/1196329379
とりあえず、この辺りとか見てみたのですが……
こんなの見せられたら初心者さん気絶するよなとか思いつつ、何かいいのはないかなと……
クエリ式はとりあえず放って置いて、メソッドでしか表現できないタイプのものを解説してみようと思っているのですが
まずは一発目で Aggregate あたりからやってみようかと思ってます。
ただ、このメソッドあまりにも関数型言語らしい仕様をしています。
何か良い説明方法はないかと色々さがしているのですが、良いのがあったら誰か紹介してください。
http://d.hatena.ne.jp/blanketsky/20071129/1196329379
とりあえず、この辺りとか見てみたのですが……
こんなの見せられたら初心者さん気絶するよなとか思いつつ、何かいいのはないかなと……
2008/02/22(金) 00:32:05
>>92
forループからの置き換えで解釈してみては。
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
これをAggregateで記述するとどうなるか、とか。
forループからの置き換えで解釈してみては。
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
これをAggregateで記述するとどうなるか、とか。
9485
2008/02/22(金) 00:39:59 Comapctでまとめて実行するようにしたらリニアに増加するのはなくなった様。
10000件ぐらいまではまとめたほうがトータルの実行時間が短くなった。
もっと多くした場合はどうなるかは今度試します。
ほかのデータベース試してないけれど、なんかCompactのせいっぽい匂いが・・・
10000件ぐらいまではまとめたほうがトータルの実行時間が短くなった。
もっと多くした場合はどうなるかは今度試します。
ほかのデータベース試してないけれど、なんかCompactのせいっぽい匂いが・・・
2008/02/22(金) 01:20:37
>>92
その情熱がどこから来るのかわからんが、Aggregateなら
・sum、factあたりを通常の再帰関数で書く
・共通する部分を抜き出す
・これがAggregateです
っていうのがわかりやすいんじゃないの?
その情熱がどこから来るのかわからんが、Aggregateなら
・sum、factあたりを通常の再帰関数で書く
・共通する部分を抜き出す
・これがAggregateです
っていうのがわかりやすいんじゃないの?
2008/02/22(金) 11:23:52
2008/02/22(金) 19:46:15
クエリ式はきもいけどLINQ自体はないと生きていけんよ
コレクションに対するアルゴリズムは絶対に必要だ
XMLやSQLは別になくても生きていけるとは思うが
コレクションに対するアルゴリズムは絶対に必要だ
XMLやSQLは別になくても生きていけるとは思うが
98デフォルトの名無しさん
2008/02/22(金) 22:13:522008/02/23(土) 01:08:33
>>1 です
>>93 結局ループをどの様に書くかという問題なのだからそれが一番いいような気がしました。
それと、これは群論の本(数学の本です)を読んでいて、抽象化は具体例を限りなく沢山作ってその中から共通の物を取り出すことだという記述があって
それも考慮にいれて、まず具体例、それからループへと展開する方針でいってみようと思います。
>>95
申し訳ないですが、再帰は最終手段だと思います、非常に良くないと思います。それ以外の部分は賛成です。
再帰とラムダ(or Delegate)は絶対に最初に記述して説明してはならないものだと確信しています。
>>96
>http://ufcpp.net/study/csharp/introduction.html
>実を言うと、僕は趣味でプログラミングをしてるだけで、 C# は研究とは一切関係なかったりします。
>(むしろ C/C++ を使うことが多かった。 2007年追記: 最近では割となんでも C# で書くようになりました。)
>初めて C# について調べてみたとき(ちょうど Java に物足りなさを感じ、SUNの方針に憤りを感じていたころです)、
> C# が普及してくれればプログラミングにかかる手間は大幅に削減されると感じるました。
>しかし、Microsoft は順調に行かなさそうなものはばっさりと切り捨てることで有名な企業ですし、
>世間の C# への関心が低ければ、C# は普及することなく消え去ってしまうでしょう。
>そこで、少しでも早く C# が普及するようにとの願いを込めて当コンテンツを作成することにしました。
実は自分も全く同じ境遇です、でも研究者じゃありません、ただのプログラマですが……
関数型言語をやっていて思うところで、こんなの一発なのにというコードがオブジェクト指向のスタイルでは全くまともにかけなくて歯がゆい思いをしていました。
今日からお休みなので、これから練ってみます、明後日辺りから書き始めるかもしれません。
>>93 結局ループをどの様に書くかという問題なのだからそれが一番いいような気がしました。
それと、これは群論の本(数学の本です)を読んでいて、抽象化は具体例を限りなく沢山作ってその中から共通の物を取り出すことだという記述があって
それも考慮にいれて、まず具体例、それからループへと展開する方針でいってみようと思います。
>>95
申し訳ないですが、再帰は最終手段だと思います、非常に良くないと思います。それ以外の部分は賛成です。
再帰とラムダ(or Delegate)は絶対に最初に記述して説明してはならないものだと確信しています。
>>96
>http://ufcpp.net/study/csharp/introduction.html
>実を言うと、僕は趣味でプログラミングをしてるだけで、 C# は研究とは一切関係なかったりします。
>(むしろ C/C++ を使うことが多かった。 2007年追記: 最近では割となんでも C# で書くようになりました。)
>初めて C# について調べてみたとき(ちょうど Java に物足りなさを感じ、SUNの方針に憤りを感じていたころです)、
> C# が普及してくれればプログラミングにかかる手間は大幅に削減されると感じるました。
>しかし、Microsoft は順調に行かなさそうなものはばっさりと切り捨てることで有名な企業ですし、
>世間の C# への関心が低ければ、C# は普及することなく消え去ってしまうでしょう。
>そこで、少しでも早く C# が普及するようにとの願いを込めて当コンテンツを作成することにしました。
実は自分も全く同じ境遇です、でも研究者じゃありません、ただのプログラマですが……
関数型言語をやっていて思うところで、こんなの一発なのにというコードがオブジェクト指向のスタイルでは全くまともにかけなくて歯がゆい思いをしていました。
今日からお休みなので、これから練ってみます、明後日辺りから書き始めるかもしれません。
100デフォルトの名無しさん
2008/02/23(土) 01:09:33 しかし、http://msdn2.microsoft.com/ja-jp/library/bb549218.aspx
これをみて理解できる人間が一体何人いるんだろうか……
Aggregate<(Of <(TSource, TAccumulate>)>)(IEnumerable<(Of <(TSource>)>), TAccumulate, Func<(Of <(TAccumulate, TSource, TAccumulate>)>))
この表現からぱっと見た目に使い方がわかる人は一体何人いるんだろうと、首を傾げそうになります。
ドキュメントのつくりを一度見直すべきだと思う……強力なのに……
>世間の C# への関心が低ければ、C# は普及することなく消え去ってしまうでしょう。
こんな状態になって欲しくないです
これを使えば、エクセルで小計等をやるような操作を一行で書き下せますが、使える人が居なくなってしまう。
これをみて理解できる人間が一体何人いるんだろうか……
Aggregate<(Of <(TSource, TAccumulate>)>)(IEnumerable<(Of <(TSource>)>), TAccumulate, Func<(Of <(TAccumulate, TSource, TAccumulate>)>))
この表現からぱっと見た目に使い方がわかる人は一体何人いるんだろうと、首を傾げそうになります。
ドキュメントのつくりを一度見直すべきだと思う……強力なのに……
>世間の C# への関心が低ければ、C# は普及することなく消え去ってしまうでしょう。
こんな状態になって欲しくないです
これを使えば、エクセルで小計等をやるような操作を一行で書き下せますが、使える人が居なくなってしまう。
101デフォルトの名無しさん
2008/02/23(土) 01:22:13 C++にBoostその他の取り合わせなんか、正にそんな世間の関心が低い状態。
LINQもそういうことになってしまうのは嫌だな。
LINQもそういうことになってしまうのは嫌だな。
102デフォルトの名無しさん
2008/02/23(土) 02:31:52 一応世間に知られてからもう大分経つでしょ・・・
これ流行らないよ・・・
from の位置とか外人さんでも気持ちわるいんじゃないかな
これ流行らないよ・・・
from の位置とか外人さんでも気持ちわるいんじゃないかな
10395
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 でググってみるといいんじゃないかと。
203デフォルトの名無しさん
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
ttp://msdn.microsoft.com/ja-jp/library/bb546158.aspx
ttp://msdn.microsoft.com/ja-jp/library/bb882640.aspx
204デフォルトの名無しさん
2008/08/31(日) 11:34:15 >>198
LINQの本が少ない中、この本はお薦め。
LINQを構成する基礎や、現在のバージョンで、できる事できない事、
やってはダメな事が書かれている。
.netとSQLを使って仕事している人ならLINQがどういう物か理解できる。
少なくともこの本レベルの事を理解していないと知らずに地雷を埋め込むことになる。
LINQの本が少ない中、この本はお薦め。
LINQを構成する基礎や、現在のバージョンで、できる事できない事、
やってはダメな事が書かれている。
.netとSQLを使って仕事している人ならLINQがどういう物か理解できる。
少なくともこの本レベルの事を理解していないと知らずに地雷を埋め込むことになる。
205デフォルトの名無しさん
2008/08/31(日) 18:22:46 LINQは、VSに付いてくるC#のサンプルコードだけで十分理解できるでしょ。
206デフォルトの名無しさん
2008/08/31(日) 23:44:43 LINQがこれから他のテクノロジとどう統合されてくのかよくわからん(´・ω・`)
207デフォルトの名無しさん
2008/09/01(月) 00:10:28 > どう統合されてくのか
消えていくと言う運命もあるから、俺はもう少し様子見。
消えていくと言う運命もあるから、俺はもう少し様子見。
208デフォルトの名無しさん
2008/09/01(月) 00:59:30 これだけ言語に食いこんだものが消えるというのはありえないと思うが。
209デフォルトの名無しさん
2008/09/01(月) 06:48:16210デフォルトの名無しさん
2008/09/01(月) 09:00:39 小手先の道具として便利なLINQ to objectsくらいは残るでしょ
そのほかはともかく
そのほかはともかく
211デフォルトの名無しさん
2008/09/01(月) 21:35:34 別に「残らない」なんて断定してるわけじゃないよ。
俺はなくてもあまり困ってないし、「残らない可能性もある」ので
ちょっと様子見してるだげ。
いいと思う人はどしどし使って広めてくれ。
俺はなくてもあまり困ってないし、「残らない可能性もある」ので
ちょっと様子見してるだげ。
いいと思う人はどしどし使って広めてくれ。
212デフォルトの名無しさん
2008/09/01(月) 23:25:27 LINQ便利ざんすよ?
特にLINQtoSQL。XMLはしらんがたぶん便利だろう。
今のだと出来ないこともあるけれど、出来るところのはかなり楽だ。
特にLINQtoSQL。XMLはしらんがたぶん便利だろう。
今のだと出来ないこともあるけれど、出来るところのはかなり楽だ。
213デフォルトの名無しさん
2008/09/01(月) 23:38:08 LINQ の意義の1つに、コレクションに対する操作がらみのメソッド名を統一したってのがあるから、
今後、LINQ to SQL とか LINQ to XML が廃れるようになろうとも、
コレクションとかサーバ問い合わせ系のライブラリ書く人は
おそらくほぼ LINQ の規約に従ってメソッド名を付けると思う。
そういう意味では、廃れないと思うんだが。
クエリ式とか、IQueryable を介したサーバ問い合わせとかが廃れようとも、
命名規約の部分に関しては絶対残る。
今後、LINQ to SQL とか LINQ to XML が廃れるようになろうとも、
コレクションとかサーバ問い合わせ系のライブラリ書く人は
おそらくほぼ LINQ の規約に従ってメソッド名を付けると思う。
そういう意味では、廃れないと思うんだが。
クエリ式とか、IQueryable を介したサーバ問い合わせとかが廃れようとも、
命名規約の部分に関しては絶対残る。
214デフォルトの名無しさん
2008/09/01(月) 23:43:37 MS の技術が「なくても困らない」と感じるのは、
MS がエンタープライズ相手の商売してるから、
個人で趣味で開発してる人へのアピール弱いせい。
あんまりホビープログラムでDBアプリとか書かないし。
MS がエンタープライズ相手の商売してるから、
個人で趣味で開発してる人へのアピール弱いせい。
あんまりホビープログラムでDBアプリとか書かないし。
215デフォルトの名無しさん
2008/09/02(火) 00:10:13 LINQはEntity Frameworkなんかと密接に関わるからねー
まだまだこれからの技術。
まだまだこれからの技術。
216デフォルトの名無しさん
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だけで上手く書き直す方法ないんかなぁ。
というより、生成したクエリを最適化してくれる関数みたいなものはないんだろうか。
みたいなLINQ書くとselect newの部分でvalue1とvalue2を生成するためにSQLサブクエリが生成されるんだけど、
これってgroup byだけで上手く書き直す方法ないんかなぁ。
というより、生成したクエリを最適化してくれる関数みたいなものはないんだろうか。
217デフォルトの名無しさん
2008/09/03(水) 08:19:42 LINQ to SQL 自体、Entity Framework までの繋ぎの過渡技術だし、
今後 Entity Fx の側がよっぽど大ごけしないと
LINQ to SQL のグレードアップは見込めない気もする。
LINQ とは別に、SQL 文の最適化ライブラリみたいなの探す方が早いかも。
今後 Entity Fx の側がよっぽど大ごけしないと
LINQ to SQL のグレードアップは見込めない気もする。
LINQ とは別に、SQL 文の最適化ライブラリみたいなの探す方が早いかも。
218デフォルトの名無しさん
2008/09/03(水) 08:25:31 EntityFWのクエリーインターフェースとして、LINQ使われるんじゃないの?(´・ω・`)
今のLINQのEntityうんたらがもっとしっかりしたものになるということ?
今のLINQのEntityうんたらがもっとしっかりしたものになるということ?
219デフォルトの名無しさん
2008/09/03(水) 08:44:14 裏側の最適化の話ね。
同じ LINQ クエリ式を書いたときに、
実際にどういう SQL 文が発行されるかという、
実装上の最適化の部分に関して、
LINQ to SQL の今後にはあんまり期待しない方がいいんじゃないかってこと。
まだ手をつけてる人が少なくて情報少ないけども、
将来を期待したいなら LINQ to Entity Framework の方使うこと考えるのがいいんじゃないかと。
同じ LINQ クエリ式を書いたときに、
実際にどういう SQL 文が発行されるかという、
実装上の最適化の部分に関して、
LINQ to SQL の今後にはあんまり期待しない方がいいんじゃないかってこと。
まだ手をつけてる人が少なくて情報少ないけども、
将来を期待したいなら LINQ to Entity Framework の方使うこと考えるのがいいんじゃないかと。
220デフォルトの名無しさん
2008/09/03(水) 08:46:06 LINQtoSQLがせいじゅくされてLINQtoEntityになるのかとおもっとった
221デフォルトの名無しさん
2008/09/11(木) 20:45:39 りんきゅー><
222デフォルトの名無しさん
2008/09/17(水) 20:13:37 ↓をメソッド形式で書きたいのですが、OrderByメソッドで複数のプロパティで
ソートするのははどうすればいいですか?
var v = from e in GetFoo() orderby e.Age, e.Name select e
OrderBy二回せずに一回でさくっと書きたいです。
ソートするのははどうすればいいですか?
var v = from e in GetFoo() orderby e.Age, e.Name select e
OrderBy二回せずに一回でさくっと書きたいです。
223デフォルトの名無しさん
2008/09/17(水) 22:32:24224デフォルトの名無しさん
2008/09/18(木) 20:14:01 >>223
ThenByって知らなかった。ありがと。
ThenByって知らなかった。ありがと。
225デフォルトの名無しさん
2008/09/19(金) 01:50:55 つか、そんなの条件式を二つ持つOrderByを自分で実装するがよろし
226デフォルトの名無しさん
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チームの自己満足だね。いつものことだけど。
Aggreegate戻り値はIntegerだし、クエリ機能あれば十分なのでは。
LINQ TO XMLとか開発の現場でまず使うのは小数だろうし、可用性が低いよ。
VBチームの自己満足だね。いつものことだけど。
229デフォルトの名無しさん
2008/09/29(月) 12:49:16 >>228
VBのAggregate構文のことかEnumerable.Aggregateのことを言ってるのかわからない。
Integerってどういう意味だろう、集計対象の型で集計されると思うけど。
VBのLinqは使いやすくしようと、文法やキーワードを増やしすぎて
収集がつかなくなってるという感じはする。C#と同じにしておけば良かったような。
VBのAggregate構文のことかEnumerable.Aggregateのことを言ってるのかわからない。
Integerってどういう意味だろう、集計対象の型で集計されると思うけど。
VBのLinqは使いやすくしようと、文法やキーワードを増やしすぎて
収集がつかなくなってるという感じはする。C#と同じにしておけば良かったような。
230デフォルトの名無しさん
2008/09/29(月) 14:30:31 VBはラムダ式が冗長だから拡張メソッドでクエリ書くと悲惨なことになる
231デフォルトの名無しさん
2008/09/29(月) 14:54:49 遅延実行と即時評価ってやたら強調されてるけど
やっぱりC#のyield知らないとわかりにくいのかな
やっぱりC#のyield知らないとわかりにくいのかな
232デフォルトの名無しさん
2008/09/29(月) 23:02:22 言われてみるとyieldを知らない(あまり使った事がない)とすれば
即時実行でないのに違和感を感じるのも分かるな。
即時実行でないのに違和感を感じるのも分かるな。
233デフォルトの名無しさん
2008/09/30(火) 11:58:27 いまさらだけど、yield Returnつう名前がややこすいよ!!
234デフォルトの名無しさん
2008/09/30(火) 23:43:43 yield とかってどこからきたん?関数型?
235デフォルトの名無しさん
2008/09/30(火) 23:47:50 Rubyのはクロージャ呼び出しだからPythonかなぁ。
Windows2x時代のAPIは関係ないと思う。
Windows2x時代のAPIは関係ないと思う。
236デフォルトの名無しさん
2008/10/01(水) 02:17:48 ICONからきていると予想
Fiberはいつのまにか消えていたってオチかな
Fiberはいつのまにか消えていたってオチかな
237[Fn]+[名無しさん]
2008/10/02(木) 00:00:54 てかDTDとかXMLスキーマサポートしてない段階でLINQ廃レは確定ぽ。。
238デフォルトの名無しさん
2008/10/02(木) 00:06:53 それは LINQ to XML の問題であって、LINQ の問題じゃないのでは。
239デフォルトの名無しさん
2008/10/02(木) 01:54:39 LINQ to XMLはもともとXmlDOMやXmlReaderの代替を狙ったものじゃなく、
standaloneのXMLや部分的なXMLを簡単に扱えることを目指したもの。
はじめからDTDやXMLSchemaはサポートしないことになっていた。
もっともnamespaceを中途半端なサポートはチトいただけないから改良は欲しい。
いっそなくすか、もっと充実させるかどちらかで。
standaloneのXMLや部分的なXMLを簡単に扱えることを目指したもの。
はじめからDTDやXMLSchemaはサポートしないことになっていた。
もっともnamespaceを中途半端なサポートはチトいただけないから改良は欲しい。
いっそなくすか、もっと充実させるかどちらかで。
240デフォルトの名無しさん
2008/10/02(木) 08:21:03 スキーマはサポートしない、って確かにそうなんだけど
ぶっちゃけあれ下層に XmlReader が使えるからでは
ないのかと
ぶっちゃけあれ下層に XmlReader が使えるからでは
ないのかと
241デフォルトの名無しさん
2008/10/02(木) 13:10:43 LINQはすんばらしい
FOR EACH書かなくてすむし、べた書きのXMLもコードとして扱える。
FOR EACH書かなくてすむし、べた書きのXMLもコードとして扱える。
242デフォルトの名無しさん
2008/10/03(金) 00:46:47 C#だとエディットコンティニューが使えないのは結構痛い
243デフォルトの名無しさん
2008/10/03(金) 10:10:47 エディットコンティニュかあ、x64だと使えないんだよなあ。
まあx86にすりゃいいんだけど、デフォがAnyCPUだからなあ。
まあx86にすりゃいいんだけど、デフォがAnyCPUだからなあ。
244デフォルトの名無しさん
2008/10/11(土) 23:59:11 てかLINQってORACLEとかポスグレでも使えるのね。
245デフォルトの名無しさん
2008/10/12(日) 00:58:14246デフォルトの名無しさん
2008/10/12(日) 02:57:11 別に Linq to SQL でも別データベースサポート可能だよ。
でも Linq -> Entity SQL がサポートされたから、Entity SQL ->
ネイティブ SQL だけでいいじゃん=皆やる気ナスなだけで。
でも Linq -> Entity SQL がサポートされたから、Entity SQL ->
ネイティブ SQL だけでいいじゃん=皆やる気ナスなだけで。
247デフォルトの名無しさん
2008/10/12(日) 20:47:40 Linq to Entityが生成する生のSQLを確認する方法を教えてください。
248デフォルトの名無しさん
2008/10/13(月) 00:46:17 それは実行される前に?恒常的に?
そうじゃないならログ見りゃいいと思うけど・・・
そうじゃないならログ見りゃいいと思うけど・・・
249デフォルトの名無しさん
2008/10/13(月) 17:15:00 >>248
実行時でかまいません。
Linq to SQLのようのDataContext.Logプロパティにあたるものが見当たらないようです。
またSystem.DiagnosticsのTraceやDebugでも確認できませんでした。
探し方が悪いのかもしれませんがSQLのログを出力する方法を教えてください。
実行時でかまいません。
Linq to SQLのようのDataContext.Logプロパティにあたるものが見当たらないようです。
またSystem.DiagnosticsのTraceやDebugでも確認できませんでした。
探し方が悪いのかもしれませんがSQLのログを出力する方法を教えてください。
250デフォルトの名無しさん
2008/10/13(月) 21:39:14 だから SQL Server なら確かプロファイラ起動してトレースの開始で…
と記憶を頼りにぐぐって気づいたんだが Express にはないのか
このツール。おおう。それとごめんトレースだった
2005 ならこんなの見つけたけど
ttp://code.google.com/p/sqlexpressprofiler/
と記憶を頼りにぐぐって気づいたんだが Express にはないのか
このツール。おおう。それとごめんトレースだった
2005 ならこんなの見つけたけど
ttp://code.google.com/p/sqlexpressprofiler/
251デフォルトの名無しさん
2008/10/17(金) 03:19:46 タイプセーフなデータベースプログラミング
ttp://d.hatena.ne.jp/higayasuo/20081014/1223969275
拡張メソッドとラムダ式と式木と匿名型とvarとあって良かったと思える瞬間。
ttp://d.hatena.ne.jp/higayasuo/20081014/1223969275
拡張メソッドとラムダ式と式木と匿名型とvarとあって良かったと思える瞬間。
252デフォルトの名無しさん
2008/10/17(金) 17:46:42 Entity FrameworkをLinqなしで使うと2番目の例っぽくなるね。
253デフォルトの名無しさん
2008/10/17(金) 19:35:37 多言語でLinqのパクリを作ろうと思っても、言語仕様のサポートが無いと
ああいう風にせざるをえないんだよな。
ああいう風にせざるをえないんだよな。
254デフォルトの名無しさん
2008/10/17(金) 22:35:24 まあ、だからC# 3.0がああなったわけで。
255デフォルトの名無しさん
2008/10/17(金) 22:53:01 その辺Booなら自分で言語使用作れるかと
256デフォルトの名無しさん
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 が真の力を発揮するのはデータベースではなく、日常的に使う配列やオブジェクトです。
いままではデータベースではクエリで簡単に実行できても、プログラム中ではできずと
やむなくデータベースに一旦突っ込んでやるか、フルスクラッチで同等機能を作り出すかと、
無意味なプログラム実行環境の大規模化を引き起こしていました、これが無くなります。
という訳でみんなこれ勉強しろ!!
とりあえずアドバイス、まずは yield return / yield break が自在に使いこなせるようになるといいです。
使い方のコツ
1.シーケンス( IEnumerable<T> 、データベースで言えばテーブル)の生成
2.from ... または System.Linq.Enumerable で加工(繰り返し)
3.ToArray() , ToList() , ToDictionary() , All() , Any() 等で結果生成。
これが標準パターン
元の列を作る → 加工 → 加工 ・・・ → 加工 → 配列化
基本的にこればっかりです。
ちなみに LINQ が真の力を発揮するのはデータベースではなく、日常的に使う配列やオブジェクトです。
いままではデータベースではクエリで簡単に実行できても、プログラム中ではできずと
やむなくデータベースに一旦突っ込んでやるか、フルスクラッチで同等機能を作り出すかと、
無意味なプログラム実行環境の大規模化を引き起こしていました、これが無くなります。
2581
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 に準備して欲しい・・・
という訳でシーケンスの作り方のコツ
配列や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 に準備して欲しい・・・
2591
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 に準備して欲しい・・・
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 に準備して欲しい・・・
2601
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は実は触ったことが一度もないのですが、どうも色々便利ノウハウが彼らにはあるようです。
現在鋭意開拓中
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()
マニュアルが余りに理解不能な文書なので、動作を確かめながら自分の言葉で整理しておくと便利です。
生成用関数、加工用関数、結果生成用関数の三つに分類してみると、すっきりしてきます。
シーケンスを混ぜて一つのシーケンスを作る系
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の定義が無いのですが‥‥
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46703&forum=7&2
ぶっちゃけ、この常連しんさんと全く同じ質問なのですが、
この人、質問して、自己解決して、回答書いてないので‥‥
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46703&forum=7&2
ぶっちゃけ、この常連しんさんと全く同じ質問なのですが、
この人、質問して、自己解決して、回答書いてないので‥‥
263デフォルトの名無しさん
2008/10/27(月) 23:38:24 関数型プログラム言語触れば別に驚くことでもない
264デフォルトの名無しさん
2008/10/28(火) 01:43:36 Firstも使うけどSingleもよく使う
265デフォルトの名無しさん
2008/10/28(火) 03:14:06266262
2008/10/28(火) 13:58:59267デフォルトの名無しさん
2008/10/28(火) 17:52:37268デフォルトの名無しさん
2008/10/31(金) 16:20:09 これってORマッピングツールみたいなものか?
269デフォルトの名無しさん
2008/10/31(金) 19:53:08 >>267
ラムダで書くと見た目が不必要に複雑になるからな
ラムダで書くと見た目が不必要に複雑になるからな
270デフォルトの名無しさん
2008/10/31(金) 19:59:39 C#の方は XML to LINQ を無理やりC#構文で書かせるのはなんとかしてほしい。
データ操作まで無理やりオブジェクト指向にするとかえって記述がグダグダになるんだよ。
データ操作は特化した記述がいい。
データ操作まで無理やりオブジェクト指向にするとかえって記述がグダグダになるんだよ。
データ操作は特化した記述がいい。
271デフォルトの名無しさん
2008/10/31(金) 20:27:08 同じ記述でXMLが扱える所が利点なのに?
わざわざ特化した記述作って、新しく覚えないといけなかったら魅力感じないな
わざわざ特化した記述作って、新しく覚えないといけなかったら魅力感じないな
272デフォルトの名無しさん
2008/10/31(金) 20:35:02 もしかして関数型構築のこと?
273デフォルトの名無しさん
2008/10/31(金) 22:23:22 >>269
全部クエリ式で書けない場合は,joinとかletとか使わない限りは全部拡張メソッドで俺は書いちゃうな
全部クエリ式で書けない場合は,joinとかletとか使わない限りは全部拡張メソッドで俺は書いちゃうな
274デフォルトの名無しさん
2008/11/01(土) 02:17:30 クエリ式みたいなものを自由に拡張できるようにして欲しいお(´・ω・`)
275デフォルトの名無しさん
2008/11/01(土) 02:29:34 そんなことしたらカオスになるじゃないか
276デフォルトの名無しさん
2008/11/01(土) 09:41:51 クエリ式は抽象化の度合いを下げないまま、
foreachをネストさせた時の様に変数を扱えるのが便利だね。
これを拡張可能にすると・・・関数型っぽくなる気がする。
foreachをネストさせた時の様に変数を扱えるのが便利だね。
これを拡張可能にすると・・・関数型っぽくなる気がする。
277デフォルトの名無しさん
2008/11/01(土) 09:50:56278デフォルトの名無しさん
2008/11/01(土) 10:45:55279デフォルトの名無しさん
2008/11/01(土) 11:38:48 遅延評価を繋げるだけならほとんど遅くはならないはず
280デフォルトの名無しさん
2008/11/01(土) 11:49:52 遅い速いは相対的なものだからどのレベルで遅いといってるのか示さないと議論にならない。
非常に細かいパフォーマンスを気にしているなら、
ラムダ式(デリゲート)を使うので関数の呼び出しがインライン化されないとか、
SumやMaxなど集計系メソッドを複数使った場合にちょっと効率の悪いことをしているとか
そんなところだね。
非常に細かいパフォーマンスを気にしているなら、
ラムダ式(デリゲート)を使うので関数の呼び出しがインライン化されないとか、
SumやMaxなど集計系メソッドを複数使った場合にちょっと効率の悪いことをしているとか
そんなところだね。
281デフォルトの名無しさん
2008/11/01(土) 12:18:38 Reverseってバッファ使うから即時実行だと思ってたんだけど、Reverseの呼び出し時じゃなくて
最初のMoveNextの呼び出しの時点ですべての結果が決まるから遅延実行になるのか
速い遅い気にするならどういう実装になってるか気にしないといけないね
最初のMoveNextの呼び出しの時点ですべての結果が決まるから遅延実行になるのか
速い遅い気にするならどういう実装になってるか気にしないといけないね
282デフォルトの名無しさん
2008/11/01(土) 12:31:55 3.0出始めの時に誰かが、foreachで条件とか変換とか並べて書いたのと、クエリ式とか並べて頴田の比べて結構違いがあったような。
283デフォルトの名無しさん
2008/11/01(土) 12:37:47 Linq to ObjectとLinq to SQLは分けないと話が食い違うから要注意。
284デフォルトの名無しさん
2008/11/01(土) 12:44:36 この文脈でどう読んだらto SQLになるのか
285デフォルトの名無しさん
2008/11/01(土) 12:50:21 4.0の紹介ビデオみてるが、よいなぁこれ・・・
来年早々にも出してくれんかな・・・
来年早々にも出してくれんかな・・・
286デフォルトの名無しさん
2008/11/01(土) 13:11:04 PLINQとか並列化関係いいなぁ・・
287デフォルトの名無しさん
2008/11/05(水) 00:04:48 4.0の紹介ビデオってmsdnにある?
288デフォルトの名無しさん
2008/11/05(水) 00:12:26 http://channel9.msdn.com/pdc2008/TL16/
ちなみに、パスを1段削って、
http://channel9.msdn.com/pdc2008/
にするとPDCのセッションの一覧が出てくる。
ちなみに、パスを1段削って、
http://channel9.msdn.com/pdc2008/
にするとPDCのセッションの一覧が出てくる。
289デフォルトの名無しさん
2008/11/05(水) 00:31:16 thx
290デフォルトの名無しさん
2008/11/06(木) 01:31:48 C#インタプリタ、すげぇ!
291デフォルトの名無しさん
2008/11/06(木) 09:38:50 >>282
http://ufcpp.net/study/csharp/sp3_linqreconstruct.html#iterator
これ?
foreach で置き換えるだけじゃたいして性能変わらない。
ここで違いが出てるのはそれの次の節の話で、
「if をループの外に出せ」と同じ原理で
「可能な限り where を from の上に」ってやるとパフォーマンス結構変わる。
http://ufcpp.net/study/csharp/sp3_linqreconstruct.html#iterator
これ?
foreach で置き換えるだけじゃたいして性能変わらない。
ここで違いが出てるのはそれの次の節の話で、
「if をループの外に出せ」と同じ原理で
「可能な限り where を from の上に」ってやるとパフォーマンス結構変わる。
292デフォルトの名無しさん
2008/11/06(木) 10:16:15 LINQのクエリ式とSQLの一番の違いがプランナの有無。
クエリ式は書いた順番どおりに処理していくが、
SQLはプランナが最適な実行計画を立てる。
クエリ式は書いた順番どおりに処理していくが、
SQLはプランナが最適な実行計画を立てる。
293デフォルトの名無しさん
2008/11/06(木) 10:39:15 LinqtoObjectも気合い入れてプロバイダ書けばプランナ相当のもの記述可能?
いや書く気毛頭無いですが
いや書く気毛頭無いですが
294デフォルトの名無しさん
2008/11/08(土) 12:26:24 やろうとおもえばLINQでスクリプト言語書けるよ
295デフォルトの名無しさん
2008/11/09(日) 21:52:31 >> 294
出だしだけでもKWSK
出だしだけでもKWSK
296デフォルトの名無しさん
2008/11/11(火) 17:07:42 LINQ to SQLって無くなるの?
なんつーか、ぶちまければ良いってもんじゃねぇだろ。
そんなのはオプソ系に任せとけよ。
なんつーか、ぶちまければ良いってもんじゃねぇだろ。
そんなのはオプソ系に任せとけよ。
297デフォルトの名無しさん
2008/11/11(火) 18:08:39 何で無くなると思ったのさ?
298デフォルトの名無しさん
2008/11/11(火) 18:35:18 なくなるっつーかLinq to Entityに置き換えでしょ。
別に今のところは対して書き方が違うわけじゃないし
Linq to Entity完成までの代打的存在として十分用を果たしたような。
別に今のところは対して書き方が違うわけじゃないし
Linq to Entity完成までの代打的存在として十分用を果たしたような。
299デフォルトの名無しさん
2008/11/11(火) 22:44:48 うむ。かなりの部分でSQLの開発楽にしてくれた。
ストーリーにちゃんと沿わないと痛い目あうがなwww
ストーリーにちゃんと沿わないと痛い目あうがなwww
300デフォルトの名無しさん
2008/11/11(火) 23:18:07 >>296
開発が止まるだけで今後も当面は.NET Frameworkに標準搭載が続くんじゃないの?
開発が止まるだけで今後も当面は.NET Frameworkに標準搭載が続くんじゃないの?
301デフォルトの名無しさん
2008/11/12(水) 00:12:05 Entity Frameworkは絶対こける。
間違いない。
間違いない。
302デフォルトの名無しさん
2008/11/12(水) 00:44:11 >>301
まあVer.3ぐらいになるまでは毎回大変更の嵐だろうな。
まあVer.3ぐらいになるまでは毎回大変更の嵐だろうな。
303デフォルトの名無しさん
2008/11/12(水) 17:23:24 Entity FrameworkはLinq to SQLの問題点が色々と解決されてるんだけど
デザイナが使いにくすぎる。
RailsのActiveRecordみたいに
ちょこちょこっとクラスに属性を付ければモデル完成、
ってのフレームワークだったらよかったのに。
デザイナが使いにくすぎる。
RailsのActiveRecordみたいに
ちょこちょこっとクラスに属性を付ければモデル完成、
ってのフレームワークだったらよかったのに。
304デフォルトの名無しさん
2008/11/20(木) 12:30:10 LINQ to SQLってADO.NETより目茶苦茶いいな。
更新系では、生のSQL文に完全なWHERE句を入れてくれるし、
非接続型・楽観的制御(←赤間さん流)では文句なし。
あと、生SQLのサブクエリ相当の組み合わせを段階を踏んで書けるのもいい。
デバッグも迅速になりそう。
更新系では、生のSQL文に完全なWHERE句を入れてくれるし、
非接続型・楽観的制御(←赤間さん流)では文句なし。
あと、生SQLのサブクエリ相当の組み合わせを段階を踏んで書けるのもいい。
デバッグも迅速になりそう。
305デフォルトの名無しさん
2008/11/20(木) 15:06:45 俺、LINQ to P2P で当てたら結婚すんだ。
306デフォルトの名無しさん
2008/11/20(木) 21:51:19 >>304
消える運命にあるが
消える運命にあるが
307デフォルトの名無しさん
2008/11/20(木) 22:15:10 なんらかの形で残るよ。使ってみれば、この方向性で進化していくんだろうと判る。
今のはちょっとSQL Serverに特化しすぎてるからディスコンかもしれないけどさ。
今のはちょっとSQL Serverに特化しすぎてるからディスコンかもしれないけどさ。
308デフォルトの名無しさん
2008/11/20(木) 22:16:56 >>307
この方向性で進化した結果がLinq to Entityなんだけど、今のところいまいちの出来。
この方向性で進化した結果がLinq to Entityなんだけど、今のところいまいちの出来。
309デフォルトの名無しさん
2008/11/20(木) 22:32:43 >>308
Entity Framework自体まだ手を付けてないのだが、どういまいち?
Entity Framework自体まだ手を付けてないのだが、どういまいち?
310デフォルトの名無しさん
2009/01/04(日) 23:25:17 例えば、
Select Sum(col1),Sum(col2),Sum(col3) from Table1
なSQLだとLINQではどう書くの?
Select Sum(col1),Sum(col2),Sum(col3) from Table1
なSQLだとLINQではどう書くの?
311デフォルトの名無しさん
2009/01/04(日) 23:46:52 >>310
そんな質問はつい最近掲示板で見た事あるな
そんな質問はつい最近掲示板で見た事あるな
312デフォルトの名無しさん
2009/01/04(日) 23:59:48 これか。ググったら一発で出てきたw
ttp://bbs.wankuma.com/index.cgi?mode=all&namber=30713
ttp://bbs.wankuma.com/index.cgi?mode=all&namber=30713
313デフォルトの名無しさん
2009/01/05(月) 00:53:25 ただのマルチじゃねーかw
315デフォルトの名無しさん
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(), }
でいいんじゃね?
from item in Table1
select new {Sum1 = item.col1.Sum(), Sum2 = item.col2.Sum(), Sum3 = item.col3.Sum(), }
でいいんじゃね?
316デフォルトの名無しさん
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;
});
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デフォルトの名無しさん
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でも最適化されたと思うが。
それはクエリプロバイダ次第じゃなかろうか。
確かに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デフォルトの名無しさん
2009/01/07(水) 08:09:53 LINQ to SQL、生成されたSQLクエリがどんなのか見れるから試してみればいいんでは。
319デフォルトの名無しさん
2009/01/07(水) 08:21:29 いつもながらLinq to ほにゃららを明記しないと話がこじれるな。
Linq to Entityかもしれない。
Linq to Entityかもしれない。
320デフォルトの名無しさん
2009/01/07(水) 10:45:44 マルチに答えるとつけあがるからやめとけ
321デフォルトの名無しさん
2009/01/07(水) 12:34:27322デフォルトの名無しさん
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();
確かに間違ってるな。
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デフォルトの名無しさん
2009/01/07(水) 14:08:38 ティマイザ→オプティマイザ
324デフォルトの名無しさん
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)
});
初心者なりに考えてみた。
全然スマートじゃないけど勘弁してね。
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デフォルトの名無しさん
2009/02/11(水) 13:05:19var 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のスレにもレスさせて頂きます。ご了承くださいませ。
どうかアドバイスを下さい。
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デフォルトの名無しさん
2009/02/20(金) 07:06:29 >>326
マルチ乙
マルチ乙
328デフォルトの名無しさん
2009/02/20(金) 18:50:07 Microsohuto社製品なんて使うからだな
329デフォルトの名無しさん
2009/02/21(土) 04:59:59 >Microsohuto社
中国のばったものの会社?
中国のばったものの会社?
330デフォルトの名無しさん
2009/02/21(土) 21:28:41 株式会社精密工具
331デフォルトの名無しさん
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から順番になるように保つ、という感じです
<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デフォルトの名無しさん
2009/02/23(月) 00:53:41 データが何個あるか調べて、XMLを作り直したほうが早いと思わんかね?
333デフォルトの名無しさん
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>
<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デフォルトの名無しさん
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を直接変更してもいいと思う。
<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デフォルトの名無しさん
2009/04/14(火) 23:27:35 WPF の UIElementCollection に対して、
Linq の機能(Where メソッドとか)を使いたいのですが、
UIElementCollection にはそのメソッドがありません。
どうすれば Linq の機能が使えるでしょうか?
Linq の機能(Where メソッドとか)を使いたいのですが、
UIElementCollection にはそのメソッドがありません。
どうすれば Linq の機能が使えるでしょうか?
336デフォルトの名無しさん
2009/04/14(火) 23:34:03 あー、non-generic な IEnumerable に対する Where とかないのか・・・
いったん、 .OfType<UIElement>() っての通すと使える気がする。
いったん、 .OfType<UIElement>() っての通すと使える気がする。
337デフォルトの名無しさん
2009/04/15(水) 11:49:27 OfTypeじゃなくて,元のコレクションに違う型が入ってないことを仮定するCastのほうがベター
※foreach(UIElement item in collection)相当
OfTypeを使うのはOfType<Button>みたいに意図的に型をフィルタリングするときだけ
※foreach(UIElement item in collection)相当
OfTypeを使うのはOfType<Button>みたいに意図的に型をフィルタリングするときだけ
339デフォルトの名無しさん
2009/04/19(日) 23:45:46 良スレなのに過疎ってて残念。
340デフォルトの名無しさん
2009/04/20(月) 12:48:21 SQLは糞
341デフォルトの名無しさん
2009/04/20(月) 18:09:58 何をもって糞と判断してるのか
342デフォルトの名無しさん
2009/04/20(月) 20:08:48 互換領域の文字だからだな
343デフォルトの名無しさん
2009/04/20(月) 22:24:47 int[] a = new int[] { 1, 2, 3 };
a.ToList().ForEach(i => Trace.WriteLine(i) );
ForEach するために毎回 ToList() してるんだけど、
ToList() しなくてすむ方法ないの?
a.ToList().ForEach(i => Trace.WriteLine(i) );
ForEach するために毎回 ToList() してるんだけど、
ToList() しなくてすむ方法ないの?
344デフォルトの名無しさん
2009/04/20(月) 22:33:14 >>343
素直に foreach (var i in a) するか、自分で IEnumerable 用の ForEach 拡張メソッド書くか。
素直に foreach (var i in a) するか、自分で IEnumerable 用の ForEach 拡張メソッド書くか。
345デフォルトの名無しさん
2009/04/20(月) 22:35:22 ttp://neue.cc/2009/04/04_145.html
346デフォルトの名無しさん
2009/04/20(月) 22:59:17 DataTrigger で特定の Rectangle だけ色を変えようと思って、
TargetName を指定したら、Style では TargetName は指定できないという
エラーが出てしまいました。
回避する方法はありますか?
TargetName を指定したら、Style では TargetName は指定できないという
エラーが出てしまいました。
回避する方法はありますか?
347346
2009/04/21(火) 06:16:25 すんません、誤爆です。
348デフォルトの名無しさん
2009/04/25(土) 15:04:39 from age in
349デフォルトの名無しさん
2009/04/25(土) 15:04:53 .
350デフォルトの名無しさん
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だけを取得したいのですが、どうしたら
いいでしょうか?
class Order
{
string syohin;
DateTime transactTime;
}
class SpecialInterval
{
string syohin;
DateTime applyDayFrom;
DateTime applyDayTo;
}
で、Orderは数万件以上、SpecialIntervalは数十件以上あります。
これで、Orderの中から、syohinが一致してなおかつtransactTimeがapplyDayFrom〜
applyDayToの間にあるOrderだけを取得したいのですが、どうしたら
いいでしょうか?
351デフォルトの名無しさん
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
ではダメ?
join si in context.Special on order.shyohin equals si.syohin
where si.applyDayFrom < order.transactTime && order.transactTime < si.applyDayTo
select order
ではダメ?
352デフォルトの名無しさん
2009/05/21(木) 21:21:06 .NETとVisual Studioってどういう関係ですか?
.NETの後継??
.NETの後継??
353デフォルトの名無しさん
2009/05/21(木) 21:32:08 .NETは.NET
Visual StudioはVisual Studio
Visual StudioはVisual Studio
354デフォルトの名無しさん
2009/05/21(木) 22:07:37 パイナップルと酢豚みたいなもんだな
355デフォルトの名無しさん
2009/05/21(木) 22:08:10 >>354
それだと、.NETは要らない子になっちまうじゃないか。
それだと、.NETは要らない子になっちまうじゃないか。
356デフォルトの名無しさん
2009/05/21(木) 22:59:46 >>354
吹いたww
吹いたww
357デフォルトの名無しさん
2009/05/21(木) 23:13:02 パイナップルのない酢豚なんて・・・
358デフォルトの名無しさん
2009/05/22(金) 13:52:09 オレも邪魔だと思ってたが、無いと寂しいw
359デフォルトの名無しさん
2009/05/22(金) 14:38:39 で、
.NET = パイナップル
VS = 酢豚
っていう結論でいいのか?w
.NET = パイナップル
VS = 酢豚
っていう結論でいいのか?w
360デフォルトの名無しさん
2009/05/30(土) 17:03:50 .NET = フレームワーク
VS = IDE
VS = IDE
361デフォルトの名無しさん
2009/06/01(月) 13:49:45362デフォルトの名無しさん
2009/06/24(水) 16:09:02 >>244-246って他社製のプロバイダ使ってってこと?
363デフォルトの名無しさん
2009/07/08(水) 22:18:41 LINQ to Object やyield returnを使っていて
ふと「これ、何のために使っているんだろう」と思ってしまう。
旧.netと互換性がなくなる上に、実行速度は条件次第(そして多くの場合)落ちるし。
これらの目的は「可読性を上げる」って認識でおk?
ふと「これ、何のために使っているんだろう」と思ってしまう。
旧.netと互換性がなくなる上に、実行速度は条件次第(そして多くの場合)落ちるし。
これらの目的は「可読性を上げる」って認識でおk?
364デフォルトの名無しさん
2009/07/08(水) 22:31:05 yield return は 2.0 からあるぞ。それより前となると
Generics もないので互換性気にするだけアレというか・・・
Linq to Objects は遅くなるのは確かだけどスケーラビリティは
あるんだよなぁ。Linq がといったほうがいいかもしれないけど
Generics もないので互換性気にするだけアレというか・・・
Linq to Objects は遅くなるのは確かだけどスケーラビリティは
あるんだよなぁ。Linq がといったほうがいいかもしれないけど
365デフォルトの名無しさん
2009/07/08(水) 22:35:58 とりあえず書いて楽になったとおもわんか?
思わないなら別に使わなくていいだろ。
自分はIEnumerable<T>系を自分のライブラリでも多用してるし、yield使わないでIEnumerable返すコードなんか書きたくもないが。
思わないなら別に使わなくていいだろ。
自分はIEnumerable<T>系を自分のライブラリでも多用してるし、yield使わないでIEnumerable返すコードなんか書きたくもないが。
366デフォルトの名無しさん
2009/07/08(水) 22:36:57 MSはyield使いまくってるよ
yieldはフレームワークを作る人のための機能、LINQは使う人のための機能だな
yieldはフレームワークを作る人のための機能、LINQは使う人のための機能だな
367デフォルトの名無しさん
2009/07/08(水) 22:38:09 .NET 4.0 のPLINQに期待。
CTPで試したけど、お手軽並列化はかなり便利だった。
CTPで試したけど、お手軽並列化はかなり便利だった。
368デフォルトの名無しさん
2009/07/08(水) 22:38:59 トン。なるほど。
確かに非常に楽にはなるし、拡張も楽だし、バグも入りにくいと思う。
でも、コードレビューに速度至上主義者がいるとそれが理解されないのよね。
確かに非常に楽にはなるし、拡張も楽だし、バグも入りにくいと思う。
でも、コードレビューに速度至上主義者がいるとそれが理解されないのよね。
369デフォルトの名無しさん
2009/07/08(水) 22:48:23 実際にボトルネックになるような場所でlinq使って叱られるのは当然だが
「なんか遅そうなコード」を見ただけで騒ぐのは
速度至上主義者じゃなくてただの阿呆や
「なんか遅そうなコード」を見ただけで騒ぐのは
速度至上主義者じゃなくてただの阿呆や
370デフォルトの名無しさん
2009/07/08(水) 22:49:54 別にそれ自身遅いもんじゃないよ
IEnumerableを返すメソッドを手で書いたところでyieldより効率のいいものができるとは考えにくい
LINQは素直すぎるだけだ
IEnumerableを返すメソッドを手で書いたところでyieldより効率のいいものができるとは考えにくい
LINQは素直すぎるだけだ
371デフォルトの名無しさん
2009/07/08(水) 23:08:48 妄想で語っている人多い気はするね、LINQは初回の実行の時はコンパイルが入るから遅いのは分かるが
一度実行されると、二回目からは高速化する構造になっているしね。
LINQを使わない場合は、平均して中速になる。
ある意味LINQを使わないというのはパフォーマンス的には使いやすいかもしれないが、コーディングの楽さとそこそこのパフォーマンスの両得確保を目指すなら
LINQは外せないはず
一度実行されると、二回目からは高速化する構造になっているしね。
LINQを使わない場合は、平均して中速になる。
ある意味LINQを使わないというのはパフォーマンス的には使いやすいかもしれないが、コーディングの楽さとそこそこのパフォーマンスの両得確保を目指すなら
LINQは外せないはず
372デフォルトの名無しさん
2009/07/08(水) 23:14:43 そういうパフォーマンス厨いるけど、実行速度に影響するのはそういう部分じゃなくデータ構造とか効率的なアルゴリズムとか。
LINQでのパフォーマンスの劣化なんてよっぽどの所でないと誤差の範囲。
LINQでのパフォーマンスの劣化なんてよっぽどの所でないと誤差の範囲。
373デフォルトの名無しさん
2009/07/08(水) 23:20:03 >>371
式木とクエリ式混同してない?
少なくとも、LINQ to object は動的生成一切ないよ。
foreach でコレクション操作するのに比べて、
静的メソッド呼び出しがちょっと増えて、その分のパフォーマンス落ちる程度。
静的メソッド呼び出しのコストなんてほんとたかが知れてて、
ほんの数%の最適化が必要な超クリティカルな場面以外は気にする必要ない。
式木とクエリ式混同してない?
少なくとも、LINQ to object は動的生成一切ないよ。
foreach でコレクション操作するのに比べて、
静的メソッド呼び出しがちょっと増えて、その分のパフォーマンス落ちる程度。
静的メソッド呼び出しのコストなんてほんとたかが知れてて、
ほんの数%の最適化が必要な超クリティカルな場面以外は気にする必要ない。
374デフォルトの名無しさん
2009/07/08(水) 23:24:03 パフォーマンスについては間違ってる
クエリ演算子を繋げることによってネストされた列挙子ができて、列挙自体のコストがちょっとだけ増えるんだよ
クエリ演算子を繋げることによってネストされた列挙子ができて、列挙自体のコストがちょっとだけ増えるんだよ
375デフォルトの名無しさん
2009/07/08(水) 23:26:16 ああ、そか。
かかるコストは静的メソッド呼び出し分じゃなくて、
仮想メソッド分になるか<列挙子のネスト。
かかるコストは静的メソッド呼び出し分じゃなくて、
仮想メソッド分になるか<列挙子のネスト。
376デフォルトの名無しさん
2009/07/08(水) 23:27:55 なんか適当な事書かれているような気がするぞ
foreachなどでやる場合は、連続したシーケンス操作では計算した値を何処かに確保して
また計算してというのが繰り返されているのに対して、クエリをバシバシつなげた場合は、中間データが作られないで処理される。
データ処理が縦に輪切りで処理するか横に輪切りで処理するかが変わる
この時決定的な差として、キャッシュの使用量がLINQを使った場合の方が小さくなって結果的に高速化するケースは多い。
オレはこっちの効果を重要視している
foreachなどでやる場合は、連続したシーケンス操作では計算した値を何処かに確保して
また計算してというのが繰り返されているのに対して、クエリをバシバシつなげた場合は、中間データが作られないで処理される。
データ処理が縦に輪切りで処理するか横に輪切りで処理するかが変わる
この時決定的な差として、キャッシュの使用量がLINQを使った場合の方が小さくなって結果的に高速化するケースは多い。
オレはこっちの効果を重要視している
377デフォルトの名無しさん
2009/07/08(水) 23:29:27 >キャッシュの使用量
CPUのデータキャッシュの事ね、今のプロセッサではこれが決定的なパフォーマンスを決める
CPUのデータキャッシュの事ね、今のプロセッサではこれが決定的なパフォーマンスを決める
378デフォルトの名無しさん
2009/07/08(水) 23:36:57 LINQ使うときは最後まで列挙や評価を行わせないのが重要
Reverseみたいに、遅延実行の演算子の中にも危ないのがあるので注意
Reverseみたいに、遅延実行の演算子の中にも危ないのがあるので注意
379デフォルトの名無しさん
2009/07/08(水) 23:37:56 yieldは結構便利なことに気付いた。
配列を返させてたところはこれに変えられる。
配列を返させてたところはこれに変えられる。
380デフォルトの名無しさん
2009/07/08(水) 23:38:06 >>378
気にしなくていいと思うけどね、よほどの問題が発生しない限り
気にしなくていいと思うけどね、よほどの問題が発生しない限り
381デフォルトの名無しさん
2009/07/09(木) 00:00:11 >>376
実際のところ、測ってみたら速くならなくない?
1段ラッパーされてる分のペナルティの方が大きくて。
そういうレベルの話よりは、
データ列の処理ってのを1段階抽象化してるから、
LINQ to SQL/Entity みたいなクエリ化もできるし、
PLINQ みたいな並列化もできるしって辺りの
もっと抽象度高い話しないと LINQ の価値出ない気も。
実際のところ、測ってみたら速くならなくない?
1段ラッパーされてる分のペナルティの方が大きくて。
そういうレベルの話よりは、
データ列の処理ってのを1段階抽象化してるから、
LINQ to SQL/Entity みたいなクエリ化もできるし、
PLINQ みたいな並列化もできるしって辺りの
もっと抽象度高い話しないと LINQ の価値出ない気も。
382デフォルトの名無しさん
2009/07/09(木) 00:09:58 デリゲート呼び出しのコストがやっぱり大きいんじゃないかな
使い方を変えずにExpressionTreeで一つの大きな列挙子に展開することだって可能なわけで、
そういうところがLINQのポテンシャルなんだろうな
使い方を変えずにExpressionTreeで一つの大きな列挙子に展開することだって可能なわけで、
そういうところがLINQのポテンシャルなんだろうな
383デフォルトの名無しさん
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;
: 実際には実行されない大量のコード
}
サイズの小さい関数の呼び出しはJIT時にインライン化されるが、
デリゲートで呼び出された関数はどんなに小さいものでもインライン化されないようだった。
関数のサイズを大きなものに変えた場合はどちらもほぼ同じ結果になった。
こういう関数があった場合、
int Hoge1(int x) { return x * x; } // こっちはインライン化されるコード
インライン化されない関数の作り方としては、xは-10000以下にならないという前提で
int Hoge2(int x) {
if (x > -10000) return x * x;
: 実際には実行されない大量のコード
}
384デフォルトの名無しさん
2009/07/09(木) 08:40:19 くだらない事やらずに分かりやすく書けやクズ
385デフォルトの名無しさん
2009/07/09(木) 08:44:04 インライン展開はMethodImpl属性で抑制できるぞ
386383
2009/07/09(木) 09:18:21387デフォルトの名無しさん
2009/07/09(木) 09:36:21 デリゲート呼び出しは通常の関数呼び出しの一割り増しぐらいだと外人の誰かがブログでグラフ付きでかいとったな。
ああいうページいつもどこ行ったか忘れちゃうんだよな・・・
ああいうページいつもどこ行ったか忘れちゃうんだよな・・・
388デフォルトの名無しさん
2009/07/09(木) 09:50:59 いかにデリゲート呼び出しが速かろうとベタに書くよりはそりゃ遅くなるに決まってる
最適化できなくなるんだから
最適化できなくなるんだから
389デフォルトの名無しさん
2009/07/09(木) 10:00:52 だから遅くても許容範囲なんじゃねーのって話だろ。
そんだけ速いの欲しかったらアセンブラで書いとけよ。
そんだけ速いの欲しかったらアセンブラで書いとけよ。
390デフォルトの名無しさん
2009/07/09(木) 13:22:47 それでも・・・僕はLINQを使うんだ!
391デフォルトの名無しさん
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 };
と、アホまっしぐらなコードに。
そもそも副作用のある式を入れている時点でマズイとは思うけど
これ以外に手はあるんでしょうか?
int index = 0;
var numbered =
from p in source
let gomi = (++index)
select new { Index = index, Data = p };
と、アホまっしぐらなコードに。
そもそも副作用のある式を入れている時点でマズイとは思うけど
これ以外に手はあるんでしょうか?
392デフォルトの名無しさん
2009/07/10(金) 01:26:45 クエリ式に固執しなければいいんじゃね?
393デフォルトの名無しさん
2009/07/10(金) 05:27:16 source.Select((Data, i) => new { Index = i + 1, Data });
クエリ構文だとやれることが少ないことに気づくと、だんだメソッド構文ばかり使うようになる
クエリ構文だとやれることが少ないことに気づくと、だんだメソッド構文ばかり使うようになる
394デフォルトの名無しさん
2009/07/10(金) 08:19:37 トン
こんな便利なバージョンがあったとは。
こんな便利なバージョンがあったとは。
395デフォルトの名無しさん
2009/07/10(金) 16:21:58 C#のLINQは大事なものはほとんど拡張メソッド版になっているよ
ムキになってメソッドでやるのもどうかと思うんだが……
VBのXMLリテラルなんぞを見ていると、やっぱ便利だし読みやすいし。
あんまり拡張メソッドに拘って欲しくないんだけどな
ムキになってメソッドでやるのもどうかと思うんだが……
VBのXMLリテラルなんぞを見ていると、やっぱ便利だし読みやすいし。
あんまり拡張メソッドに拘って欲しくないんだけどな
396デフォルトの名無しさん
2009/07/10(金) 22:45:31 XMLリテラルってXLINQだろ
XLINQ自体は良いものだとは思うけどそんな普及するかどうかもわからない
実験的なものをいきなり言語に組み込むとか
XLINQ自体は良いものだとは思うけどそんな普及するかどうかもわからない
実験的なものをいきなり言語に組み込むとか
397デフォルトの名無しさん
2009/07/10(金) 23:20:37 全然違うような
398デフォルトの名無しさん
2009/07/11(土) 00:00:36 VBは使ったことはなかったけど…イコールではないよね。
XMLリテラルはXDocumentやXElementといった
LINQ to XMLのクラスを使っているだけで。
って、LINQ to Schema for VB SUGEEEE!!こりゃ楽だわ。C#じゃ使えないのか。
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ユーザーは新しいものを使おうとしないだろうとか考えたのかな
言語仕様レベルで依存してるんだから
それくらいしないとVBユーザーは新しいものを使おうとしないだろうとか考えたのかな
400デフォルトの名無しさん
2009/07/11(土) 00:16:09 Linq to Xmlは別にこけるこけないって次元の中身ではないと思うけど。
使ったことないで言ってるでしょ。
使ったことないで言ってるでしょ。
401デフォルトの名無しさん
2009/07/11(土) 01:13:05 Linq to XMLはC#では言語構文の拡張は何もやってない。
使ってるのはLinq to Objectの構文だけで、拡張はクラスライブラリだけ。
VBでは言語構文の拡張もやってて、XMLリテラルもその一種。
使ってるのはLinq to Objectの構文だけで、拡張はクラスライブラリだけ。
VBでは言語構文の拡張もやってて、XMLリテラルもその一種。
402デフォルトの名無しさん
2009/07/15(水) 18:58:43 この流れを見て、LINQ to XML触ってみた
書き方はすごく楽だね、こりゃ。
…けど、これってLINQ to XMLで書いてしまうと
XMLでデータの不整合や値のレンジ外が見つかった時に
XMLのエラー箇所を通知するのが難しい気がする。
例外できないんじゃ実用性って…
書き方はすごく楽だね、こりゃ。
…けど、これってLINQ to XMLで書いてしまうと
XMLでデータの不整合や値のレンジ外が見つかった時に
XMLのエラー箇所を通知するのが難しい気がする。
例外できないんじゃ実用性って…
403デフォルトの名無しさん
2009/07/15(水) 22:02:46 あるある。
LoadOptions.SetLineInfoを活用しようとして、
ToDictionaryの代わりにToLookup+重複のないことの検査したり、
Count != 1なら自前の例外を投げてから、Single呼んだりする羽目になっている。
LoadOptions.SetLineInfoを活用しようとして、
ToDictionaryの代わりにToLookup+重複のないことの検査したり、
Count != 1なら自前の例外を投げてから、Single呼んだりする羽目になっている。
404デフォルトの名無しさん
2009/07/15(水) 22:18:29 >>402
スキーマ検証周りならベースにまず XmlReader を使え。
XmlReaderSettings で XmlSchemaSet が指定できる
XLinq 上でもエラー処理したいときは、読み込み周りのオプ
ションで XmlReaderSettings の指定とさらに LoadOptions の
SetBaseUri や SetLineInfo オプションも忘れずに
スキーマ検証周りならベースにまず XmlReader を使え。
XmlReaderSettings で XmlSchemaSet が指定できる
XLinq 上でもエラー処理したいときは、読み込み周りのオプ
ションで XmlReaderSettings の指定とさらに LoadOptions の
SetBaseUri や SetLineInfo オプションも忘れずに
405デフォルトの名無しさん
2009/07/16(木) 00:18:20 トン、とても参考になった。SetLineInfoはかなり便利そう
>>403
後、フィルタ以外を全部取り除いておいて最低限にしておいて
データ一個だけ処理する関数を作ってその中で処理したり
return from p in hoge.Elements("Hoge")
where (int?)p.Value < 0
select CreateHogeInstance(p); ←この中で整合性チェックして例外を投げる
結構マヌケな作りな気がする。
>>403
後、フィルタ以外を全部取り除いておいて最低限にしておいて
データ一個だけ処理する関数を作ってその中で処理したり
return from p in hoge.Elements("Hoge")
where (int?)p.Value < 0
select CreateHogeInstance(p); ←この中で整合性チェックして例外を投げる
結構マヌケな作りな気がする。
406デフォルトの名無しさん
2009/07/16(木) 00:20:28 C#なら拡張メソッドがんがん作ってそういうのをチェックしながらのWhereとか例外メッセージつきのSelectとかいろいろ作りゃいいんじゃねーの。
0スタートのindexがくっついてくるSelectWithCountとか自分的に便利。
0スタートのindexがくっついてくるSelectWithCountとか自分的に便利。
407デフォルトの名無しさん
2009/07/16(木) 04:16:14408デフォルトの名無しさん
2009/07/16(木) 08:01:45 index 付きの Select、みんなが意外知らない便利機能だけど、
まったく同じ機能を再発明しちゃった人までいるのか。
まったく同じ機能を再発明しちゃった人までいるのか。
409406
2009/07/16(木) 08:29:31 ・・・(´・ω・`)
WhereWithCountとか色々作ったのに・・・
WhereWithCountとか色々作ったのに・・・
410デフォルトの名無しさん
2009/07/16(木) 10:22:56 引数なしのAny()とかも影薄いよな
Count() > 0とかやっちゃってる人も多そう
Count() > 0とかやっちゃってる人も多そう
411デフォルトの名無しさん
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);
}
デバッグ用に意外と役に立ったり。
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デフォルトの名無しさん
2009/07/16(木) 14:51:15 手軽に作れるのが魅力の1つだよな
413407
2009/07/16(木) 17:27:01414デフォルトの名無しさん
2009/07/16(木) 17:42:57 List<T>との整合性を考えても、ForEachの方がしっくりくるな
415デフォルトの名無しさん
2009/07/16(木) 19:36:16416デフォルトの名無しさん
2009/07/29(水) 01:05:17 ttp://www.infoq.com/jp/news/2009/07/Reactive-Framework-LINQ-Events
417デフォルトの名無しさん
2009/09/12(土) 18:41:51 ヌルポ
418デフォルトの名無しさん
2009/09/12(土) 19:39:22 LINQと例外処理ってどうやって組み合わせている?
IEnumerableを参照する全ての場所で例外が起こるかもしれない、
となると例外安全の確保をしなきゃならない範囲が滅茶苦茶広くなるし、
任意のtry-catchで捕まえることもできない。
自分は「LINQ中に例外を外に投げる処理は入れるな」で対応している。
IEnumerableを参照する全ての場所で例外が起こるかもしれない、
となると例外安全の確保をしなきゃならない範囲が滅茶苦茶広くなるし、
任意のtry-catchで捕まえることもできない。
自分は「LINQ中に例外を外に投げる処理は入れるな」で対応している。
419デフォルトの名無しさん
2009/09/12(土) 23:31:27 LINQからIEnum処理するところすべてtry-catch(´・ω・`)
420デフォルトの名無しさん
2009/09/13(日) 00:16:47 それは、不毛過ぎるw
421デフォルトの名無しさん
2009/09/14(月) 20:55:08 配列の要素を2個ずつ処理したいときにはどうすればいいでしょうか?
ruby の each_slice みたいなのがやりたいのですが。
ruby の each_slice みたいなのがやりたいのですが。
422デフォルトの名無しさん
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データだけを対象にして使う分にはいいね。
522デフォルトの名無しさん
2010/02/14(日) 00:14:49 まぁ大抵の感想はそこにいきつく。
無理にLINQtoSQLを使うことはない。
無理にLINQtoSQLを使うことはない。
523デフォルトの名無しさん
2010/02/14(日) 00:24:09 Expressionで処理を構築するっていう考え方は割と好きだけどね−。
524デフォルトの名無しさん
2010/02/14(日) 00:25:34 IEnumerable に ForEach がないのは何でなんだろ
525デフォルトの名無しさん
2010/02/14(日) 00:36:00 >>524
副作用起こす系統はLINQの標準には入れたくなかったんじゃないかと。
副作用起こす系統はLINQの標準には入れたくなかったんじゃないかと。
526デフォルトの名無しさん
2010/02/14(日) 00:36:11527デフォルトの名無しさん
2010/02/14(日) 00:45:40528デフォルトの名無しさん
2010/02/14(日) 13:40:26 C#って3.0以降は標準化されてないけどするとしたらExpression<T>とかdynamicとかどうするんだろう
激しくランタイムに依存するわけだけど全部言語仕様にハードコードするのかな
激しくランタイムに依存するわけだけど全部言語仕様にハードコードするのかな
529デフォルトの名無しさん
2010/02/15(月) 20:27:09 お邪魔します。
実はわりと短期間でACCESS+MySQLで作ったアプリを少し拡張して
VB.NET2008 Expressに移植しないといけないのです。
ACCESS VBAでO/Rマッピングもどきを自作で実装していたのですが、
コーディング効率アップのためにLINQの採用を検討しています。
・単純に、"ODBC経由でMySQLにつないでテーブルから任意のカラムを取ってくる"
というサンプルソースか手順リストがどこかにありませんでしょうか?
ネットで探しまくっているのですが、LINQ布教用のXMLやら配列やらへの
クエリのサンプルは見つかっても、実用的なMySQL/ODBCへの接続宣言を
どうするのかが見つからないのです。
・LINQの習得にADO.NETの知識は必須でしょうか?
DAO、ADOときて、これ以上、知識の習得に無駄な寄り道は出来れば
避けたいのですが。
みなさん、よろしくお願いします。
実はわりと短期間でACCESS+MySQLで作ったアプリを少し拡張して
VB.NET2008 Expressに移植しないといけないのです。
ACCESS VBAでO/Rマッピングもどきを自作で実装していたのですが、
コーディング効率アップのためにLINQの採用を検討しています。
・単純に、"ODBC経由でMySQLにつないでテーブルから任意のカラムを取ってくる"
というサンプルソースか手順リストがどこかにありませんでしょうか?
ネットで探しまくっているのですが、LINQ布教用のXMLやら配列やらへの
クエリのサンプルは見つかっても、実用的なMySQL/ODBCへの接続宣言を
どうするのかが見つからないのです。
・LINQの習得にADO.NETの知識は必須でしょうか?
DAO、ADOときて、これ以上、知識の習得に無駄な寄り道は出来れば
避けたいのですが。
みなさん、よろしくお願いします。
530デフォルトの名無しさん
2010/02/15(月) 21:06:51 お前にとっては多分無駄な寄り道だと思うからやめとけば
531デフォルトの名無しさん
2010/02/15(月) 21:09:51 普通に考えてそのまんま移植した方が早い
532デフォルトの名無しさん
2010/02/15(月) 21:38:19 探しまくっても見つからないようなもんが
なんで効率アップに繋がると思うのがよくわからんわ
なんで効率アップに繋がると思うのがよくわからんわ
533デフォルトの名無しさん
2010/02/15(月) 22:07:19 LINQ プロバイダ MySQL でぐぐってわからなかったら無理だからやめておけ
534デフォルトの名無しさん
2010/03/14(日) 22:49:42 xmlはUTF-8だと思っていたけど、XmlDocument.Load(TextReader)
でTextReaderにS-jisエンコードを指定しているコードをみて困惑。
これってどういう意図なんでしょう?
でTextReaderにS-jisエンコードを指定しているコードをみて困惑。
これってどういう意図なんでしょう?
535デフォルトの名無しさん
2010/03/15(月) 02:22:37 ていうかXMLはUTF-8じゃないというか、何だってありだし。
UTF-8固定ならDeclarationにencodingはいらん。
UTF-8固定ならDeclarationにencodingはいらん。
536デフォルトの名無しさん
2010/03/16(火) 00:47:57 まあそういうなよ
537デフォルトの名無しさん
2010/03/18(木) 01:22:17 UTF-8はデフォルトなだけ
538デフォルトの名無しさん
2010/03/30(火) 00:55:11 なんか来てた
Chapter16 LINQとメソッド構文
ttp://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_16/extremecs_16_01.html
でもこんな概略の説明なんて既に色々あるんだから、もっと深い奴、
例えばLINQの落とし穴とかそういうところを説明したドキュメントがホスィ
Chapter16 LINQとメソッド構文
ttp://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_16/extremecs_16_01.html
でもこんな概略の説明なんて既に色々あるんだから、もっと深い奴、
例えばLINQの落とし穴とかそういうところを説明したドキュメントがホスィ
539デフォルトの名無しさん
2010/03/30(火) 08:10:45 コアな使い方はブログを見て回ればいいんじゃね?
540デフォルトの名無しさん
2010/03/30(火) 09:38:37 それがマンドクサイのでいろいろとコアなのがまとまってて欲しいのが正直なところ。
いや、そんなことじゃいけないとは思うんだけどね(;´Д`)
いや、そんなことじゃいけないとは思うんだけどね(;´Д`)
541デフォルトの名無しさん
2010/06/05(土) 19:53:02 今更ながらLINQ便利すぎ!
Listに格納したオブジェクトの並べ替えとフィルタが楽すぎて笑った。
並べ替え用のDatatable作ってたりいったい今まで俺は何をやっていたんだろう‥
Listに格納したオブジェクトの並べ替えとフィルタが楽すぎて笑った。
並べ替え用のDatatable作ってたりいったい今まで俺は何をやっていたんだろう‥
542デフォルトの名無しさん
2010/06/05(土) 19:57:34 VB脳乙
Listのソートやフィルタは別にLINQやDataTable使わなくても簡単にできる
Listのソートやフィルタは別にLINQやDataTable使わなくても簡単にできる
543デフォルトの名無しさん
2010/06/06(日) 00:08:23 >>542
わざわざそういうクラスを実装した上でLISTを作ればの話だろ?
オブジェクト型のList作って、適当に格納したオブジェクトの対象としたいメンバさえ一致すれば、一行で書けてしまうは凄い。
わかっててやらないと危ういけど‥
わざわざそういうクラスを実装した上でLISTを作ればの話だろ?
オブジェクト型のList作って、適当に格納したオブジェクトの対象としたいメンバさえ一致すれば、一行で書けてしまうは凄い。
わかっててやらないと危ういけど‥
544デフォルトの名無しさん
2010/06/06(日) 00:18:40 Listにソートmethodつければ良いだけじゃん
545デフォルトの名無しさん
2010/06/06(日) 01:05:19 List<T>.Sort()
List<T>.Find()
とかないの?使えないの?
List<T>.Find()
とかないの?使えないの?
546デフォルトの名無しさん
2010/06/06(日) 10:17:56 その二つはVB使いには使い方が理解しづらいメソッドの定番
LINQも同様に高階関数使ってるけどクエリ式で隠してるわけだ
LINQも同様に高階関数使ってるけどクエリ式で隠してるわけだ
547デフォルトの名無しさん
2010/06/06(日) 13:33:23 拡張メソッド形式のLINQのわかりやすさは異常。
548デフォルトの名無しさん
2010/06/07(月) 00:43:25549デフォルトの名無しさん
2010/06/07(月) 18:47:48 気付いたら>>548スタイルで書こうとしてて拡張メソッドで書き直すことはたまにあるな
あまりにもよく使われるパターンだったから手が覚えてるんだよね
あまりにもよく使われるパターンだったから手が覚えてるんだよね
550デフォルトの名無しさん
2010/06/10(木) 07:41:28 C#, EF4で、ちょっとハマったので質問させてくれ。
DbContextというのがedmxで定義されたコンテキスト、Hogeというのがedmxで定義されたエンティティ型で、
Piyoがedmxとは関係ないクラスだとする。
「DbContext.Hoge.Select(x => new Piyo() { A = x.A, B = x.B })」
みたいな書き方は普通にできて、普通にIQueriable<Piyo>(実体はObjectQuery<Piyo>)が返ってくるよね。
CreateQueryを使って同じようなことがしたいとき(つまりObjectQuery<Piyo>がほしいとき)
どうすればいいんだろう?
「DbContext.CreateQuery<Piyo>("SELECT VALUE Piyo (x.A, x.B) FROM Hoge AS x")」
こう書くと、「Piyoなんて型見つからない」って怒られるし、かといってE-SQL内でVALUE Piyoを
指定しないと「MaterializedDataRecordからPiyoに変換できない」と怒られるし(当然だけど)。
DbContextというのがedmxで定義されたコンテキスト、Hogeというのがedmxで定義されたエンティティ型で、
Piyoがedmxとは関係ないクラスだとする。
「DbContext.Hoge.Select(x => new Piyo() { A = x.A, B = x.B })」
みたいな書き方は普通にできて、普通にIQueriable<Piyo>(実体はObjectQuery<Piyo>)が返ってくるよね。
CreateQueryを使って同じようなことがしたいとき(つまりObjectQuery<Piyo>がほしいとき)
どうすればいいんだろう?
「DbContext.CreateQuery<Piyo>("SELECT VALUE Piyo (x.A, x.B) FROM Hoge AS x")」
こう書くと、「Piyoなんて型見つからない」って怒られるし、かといってE-SQL内でVALUE Piyoを
指定しないと「MaterializedDataRecordからPiyoに変換できない」と怒られるし(当然だけど)。
551デフォルトの名無しさん
2010/06/10(木) 14:35:37 名前空間は?
552550
2010/06/10(木) 15:29:40 >>551
Hogeは、型はMyApp.Data.Hoge。EdmEntityTypeAttributeでは「DataModel」が名前空間になってる。
「DataEntities」がエンティティセットの名前空間。
PiyoはMyApp.Something.Piyo。コンストラクタに二つの引数がある。
これを踏まえて
「DbContext.CreateQuery<Piyo>("SELECT VALUE MyApp.Something.Piyo (x.A, x.B) FROM DataEntities.Hoge AS x")」
としてみたけど、だめだった。
Hogeは、型はMyApp.Data.Hoge。EdmEntityTypeAttributeでは「DataModel」が名前空間になってる。
「DataEntities」がエンティティセットの名前空間。
PiyoはMyApp.Something.Piyo。コンストラクタに二つの引数がある。
これを踏まえて
「DbContext.CreateQuery<Piyo>("SELECT VALUE MyApp.Something.Piyo (x.A, x.B) FROM DataEntities.Hoge AS x")」
としてみたけど、だめだった。
553550
2010/06/11(金) 10:16:21 うーん、そもそもCreateQueryってそういう使い方しないのね。
DbDataRecordで受け取るのが一般的なのか。
IQueriableなのに、後からWhereとか追加できない不思議仕様だ。
DbDataRecordで受け取るのが一般的なのか。
IQueriableなのに、後からWhereとか追加できない不思議仕様だ。
554デフォルトの名無しさん
2010/06/13(日) 14:12:11 ごちゃごちゃ言わずにソース出せ。
555デフォルトの名無しさん
2010/06/15(火) 15:18:45 これ仕事で使ってる人いる?
556デフォルトの名無しさん
2010/06/15(火) 20:29:00 OfType()のおかげでArrayListが大復活。
var al = new ArrayList();
al.Add(1);
al.Add(2);
al.Add(3);
al.Add(1D);
al.Add(2D);
al.Add(3D);
var q = al.OfType<double>().Where(n => n >= 2.0);
var al = new ArrayList();
al.Add(1);
al.Add(2);
al.Add(3);
al.Add(1D);
al.Add(2D);
al.Add(3D);
var q = al.OfType<double>().Where(n => n >= 2.0);
557デフォルトの名無しさん
2010/06/15(火) 20:48:14 大復活って、いやいやw
せめてList<Object>で……。
せめてList<Object>で……。
558デフォルトの名無しさん
2010/06/24(木) 02:06:34 ある2つのフォルダ間で同じファイル名かつ更新日時が新しいものをLINQで取得したいです。
IEqualityComparer<FileInfo>を継承したMyCompareを使ってExceptしたのですがうまくいきません。
GetHashCode()で return 1;など定まった値を返せばうまくいくので、GetHashCode()の実装が悪いのかと思います。
しかし、オブジェクトを一意に特定するためのメソッドなのだからそういった実装は間違っていると思います。
もしかしたら全然勘違いをしているかもしれませんが、どなたか助け舟をいただけませんか?
よろしくお願いします。
ソース:http://ideone.com/Ttea4
IEqualityComparer<FileInfo>を継承したMyCompareを使ってExceptしたのですがうまくいきません。
GetHashCode()で return 1;など定まった値を返せばうまくいくので、GetHashCode()の実装が悪いのかと思います。
しかし、オブジェクトを一意に特定するためのメソッドなのだからそういった実装は間違っていると思います。
もしかしたら全然勘違いをしているかもしれませんが、どなたか助け舟をいただけませんか?
よろしくお願いします。
ソース:http://ideone.com/Ttea4
559デフォルトの名無しさん
2010/06/24(木) 04:14:11 比較する際に内部では、最初にGetHashCodeでハッシュコードを取得して、
それが同じ値であったらEqualsで比較する、という動きをします。
なので、GetHashCodeはobj.FullName.GetHashCode()だけ返せばいいんじゃないのかな?
LastWriteTimeまで算出に含めるから希望通りに動かないのでは、と思ってみる。
あと、FullNameじゃそもそも「ファイル名」じゃなくてフルパスを取っちゃうから絶対に一致しない。
でも、なんというか、その用途にExceptは違う気もします。
それが同じ値であったらEqualsで比較する、という動きをします。
なので、GetHashCodeはobj.FullName.GetHashCode()だけ返せばいいんじゃないのかな?
LastWriteTimeまで算出に含めるから希望通りに動かないのでは、と思ってみる。
あと、FullNameじゃそもそも「ファイル名」じゃなくてフルパスを取っちゃうから絶対に一致しない。
でも、なんというか、その用途にExceptは違う気もします。
560デフォルトの名無しさん
2010/06/24(木) 04:17:39 マルチ質問にマルチ回答かw
561559
2010/06/24(木) 04:24:52 あー、ほんとだ、C#相談室のほうにも同じ質問投げてあったのね。
しかし回答がまるっきり一緒とは……。
しかし回答がまるっきり一緒とは……。
562デフォルトの名無しさん
2010/06/24(木) 21:15:15 >>559
return obj.Name.GetHashCode();
でいけました。ありがとうございました。
過疎スレに質問をしてしまったと投稿してから思い、相談室にもマルチポストしてしまいました。
LINQが大好きなのでこのスレを監視している方がいてくださって嬉しいです。
return obj.Name.GetHashCode();
でいけました。ありがとうございました。
過疎スレに質問をしてしまったと投稿してから思い、相談室にもマルチポストしてしまいました。
LINQが大好きなのでこのスレを監視している方がいてくださって嬉しいです。
563デフォルトの名無しさん
2010/06/24(木) 21:22:28 ところで相談室でも言われたのですが、Exceptを使うのは変でしょうか?
私は差集合で解決できる問題なのかなと素直に思いましたが。
単純にファイルの有無ならば差集合でとれる。
→Equalになる条件が違う
→ならばその条件を指定してやればいい
という段階を踏んでこのソースの形に.なりました。
私は差集合で解決できる問題なのかなと素直に思いましたが。
単純にファイルの有無ならば差集合でとれる。
→Equalになる条件が違う
→ならばその条件を指定してやればいい
という段階を踏んでこのソースの形に.なりました。
564デフォルトの名無しさん
2010/06/24(木) 21:32:30 差集合の意味わかってるか?
565デフォルトの名無しさん
2010/06/24(木) 21:35:41 積集合だな
だからってIntersectを使うのも不適切だと思う
だからってIntersectを使うのも不適切だと思う
566デフォルトの名無しさん
2010/06/24(木) 22:38:18 ああ、ごめんなさい。
もともとの質問がGetHashCode()の使い方についてでしたので、説明不足な点がありました。
実装したい機能は、AのフォルダからBのフォルダにファイルをコピーするというものです。
コピーする対象は、AにあってBにないファイルです。
この時点で私はExceptを採用しました。
その後で、実は同じファイルがあっても更新日付が新しかったら上書きコピーするという仕様になりました。
SQLでかくと
SELECT * FROM TableA A
WHERE NOT EXISTS
(SELECT * FROM TableB B WHERE A.Name = B.Name AND A.LastWriteDate <= B.LastWriteDate)
こんな感じになると思います。
これって差集合と違います?
もともとの質問がGetHashCode()の使い方についてでしたので、説明不足な点がありました。
実装したい機能は、AのフォルダからBのフォルダにファイルをコピーするというものです。
コピーする対象は、AにあってBにないファイルです。
この時点で私はExceptを採用しました。
その後で、実は同じファイルがあっても更新日付が新しかったら上書きコピーするという仕様になりました。
SQLでかくと
SELECT * FROM TableA A
WHERE NOT EXISTS
(SELECT * FROM TableB B WHERE A.Name = B.Name AND A.LastWriteDate <= B.LastWriteDate)
こんな感じになると思います。
これって差集合と違います?
2010/07/11(日) 04:57:51
568デフォルトの名無しさん
2010/11/10(水) 22:58:06 1から見てきたが使いたくなるようなコードがひとつもない
しかも直感でわかりにくい
しかも直感でわかりにくい
569デフォルトの名無しさん
2010/11/10(水) 23:24:39 >>568
つ関数型言語
つ関数型言語
570デフォルトの名無しさん
2010/12/14(火) 07:21:36 ORマッパーになると聞いたが
具体的にどんなふうになるのん?
具体的にどんなふうになるのん?
571デフォルトの名無しさん
2010/12/14(火) 20:57:11 >>570
1.エンティティを定義
[Table]
public class Table1
{
[Column(IsPrimaryKey=true)]
pubic int Key{ get; set; }
[Column]
pubic string Column2{ get; set; }
[Column]
pubic string Column3{ get; set; }
}
2.DataContextを定義
public TestContext :DataContext
{
public TestContext (string connectionString):base(connectionString){}
public Table<Table1> Table1;
}
2. DataContextをインスタンス化してLINQでアクセス
var dc = new TestContext (接続文字列);
var list = dc.Table1.Where(row=>row.Column2=="test").OrderBy(row=>row.Column2).ToList();
1.エンティティを定義
[Table]
public class Table1
{
[Column(IsPrimaryKey=true)]
pubic int Key{ get; set; }
[Column]
pubic string Column2{ get; set; }
[Column]
pubic string Column3{ get; set; }
}
2.DataContextを定義
public TestContext :DataContext
{
public TestContext (string connectionString):base(connectionString){}
public Table<Table1> Table1;
}
2. DataContextをインスタンス化してLINQでアクセス
var dc = new TestContext (接続文字列);
var list = dc.Table1.Where(row=>row.Column2=="test").OrderBy(row=>row.Column2).ToList();
572デフォルトの名無しさん
2010/12/14(火) 22:52:23 >>571
S2Daoとかなら簡単なSQLなら自動生成してくれるのに今更って感じだな
S2Daoとかなら簡単なSQLなら自動生成してくれるのに今更って感じだな
573デフォルトの名無しさん
2010/12/14(火) 23:10:17 S2DAO(笑)
574デフォルトの名無しさん
2010/12/14(火) 23:30:48575デフォルトの名無しさん
2010/12/14(火) 23:47:23576デフォルトの名無しさん
2010/12/15(水) 00:45:15 >572
えーと自動生成してくれるんだが・・・
えーと自動生成してくれるんだが・・・
577デフォルトの名無しさん
2010/12/20(月) 13:47:54 joSQLじゃ何故流行らない?
578デフォルトの名無しさん
2011/01/27(木) 16:14:48 ちょっと困ってるので質問
TableA:
Key1 string
Key2 string
TableB:
Key1 string
Key2 string
Key3 int
この2つのTableをleft joinさせる
var q=from n in TableA join m in TableB on new {n.Key1,n.Key2} equals new {m.Key1,m.Key2} into z
from a in z.DefaultIfEmpty()
select new {n.Key1,n.Key2,a.Key3};
そうするとforeachの段階で「a.Key3がnull許容型じゃない」と怒られる
複合キーだからnull許容には出来ないし、そもそもDefaultIfEmpty()って値型はデフォルトの値入れてくれるんじゃないのかと
これってどうすれば?
TableA:
Key1 string
Key2 string
TableB:
Key1 string
Key2 string
Key3 int
この2つのTableをleft joinさせる
var q=from n in TableA join m in TableB on new {n.Key1,n.Key2} equals new {m.Key1,m.Key2} into z
from a in z.DefaultIfEmpty()
select new {n.Key1,n.Key2,a.Key3};
そうするとforeachの段階で「a.Key3がnull許容型じゃない」と怒られる
複合キーだからnull許容には出来ないし、そもそもDefaultIfEmpty()って値型はデフォルトの値入れてくれるんじゃないのかと
これってどうすれば?
579デフォルトの名無しさん
2011/01/27(木) 18:31:19 それはLinq to なに?
580578
2011/01/27(木) 21:54:36 多分Linq to SQLです
何故「多分」かと言うと、Entityとの違いがわからんからです
DBはSQL Server2005です
何故「多分」かと言うと、Entityとの違いがわからんからです
DBはSQL Server2005です
581デフォルトの名無しさん
2011/01/27(木) 23:57:21 [TableA]
Key1 Key2
hoge fuga
foo bar
[TableB]
Key1 Key2 Key3
hoge fuga 1
[Result]
Key1 Key2 Key3
hoge fuga 1
foo bar NULL
Key1 Key2
hoge fuga
foo bar
[TableB]
Key1 Key2 Key3
hoge fuga 1
[Result]
Key1 Key2 Key3
hoge fuga 1
foo bar NULL
582581
2011/01/28(金) 00:04:25 途中で送ってしもた
例えばDB上でTableA,Bが上記のような場合、LEFT JOINしたらResultのようになるが、
これを(string, string, int)に入れようとすればエラーになって当然
とりあえず、匿名クラスを(string, string, int?)にすれば良い
例えばDB上でTableA,Bが上記のような場合、LEFT JOINしたらResultのようになるが、
これを(string, string, int)に入れようとすればエラーになって当然
とりあえず、匿名クラスを(string, string, int?)にすれば良い
584デフォルトの名無しさん
2011/01/28(金) 18:22:36586デフォルトの名無しさん
2011/02/08(火) 22:46:26 Linqでクロス集計とかできますかぁ?
587デフォルトの名無しさん
2011/02/08(火) 22:54:17 まあ、そりゃ、ODBCとExcelだのAccessだのでやれてたことはたいていLINQで簡単に書ける。
588デフォルトの名無しさん
2011/02/18(金) 23:37:45 ttp://www.g1sys.co.jp/seminar090515.html
にあるような複雑な消費税計算もLINQなら余裕ですよね?
にあるような複雑な消費税計算もLINQなら余裕ですよね?
589デフォルトの名無しさん
2011/02/19(土) 03:20:21 向こうで馬鹿にされたからってこっち荒らすなよ
590デフォルトの名無しさん
2011/03/25(金) 21:47:03.67 LINQ to DataSet良いね。
DataTable(DataViewだっけ?)のソート機能はいまいちわからない。
DataTable(DataViewだっけ?)のソート機能はいまいちわからない。
591デフォルトの名無しさん
2011/03/25(金) 21:52:20.02 LINQは禁止だけどDataTable.SelectはOKって意味が分からんよな
592デフォルトの名無しさん
2011/03/25(金) 21:56:40.88 >>591
そんなイミフな規約があるとはかわいそうに
そんなイミフな規約があるとはかわいそうに
593デフォルトの名無しさん
2011/03/26(土) 09:15:06.03 >591-592
.NET Framework 2.0を切れない環境とか。
工場なんかだと今だにWin2K使ってたりするしなあ。馬鹿げた話だ。
.NET Framework 2.0を切れない環境とか。
工場なんかだと今だにWin2K使ってたりするしなあ。馬鹿げた話だ。
594デフォルトの名無しさん
2011/03/26(土) 09:58:37.70 禁止といったら使えるのに使わせないということだと思ったけど
.NET 2だったら元より使えないじゃない
.NET 2だったら元より使えないじゃない
595デフォルトの名無しさん
2011/03/26(土) 10:11:54.06 件のプロジェクトは3.5だよ
なお除外申請をすればLINQは使えるけど拡張メソッドは全面禁止の模様
なお除外申請をすればLINQは使えるけど拡張メソッドは全面禁止の模様
596デフォルトの名無しさん
2011/03/26(土) 10:33:29.03 VBならいけるけど組み込みクエリ演算子の少ないC#では何もできないなそれ
597デフォルトの名無しさん
2011/03/27(日) 02:01:44.67 拡張メソッドを普通に呼び出すのもダメなのか?
598デフォルトの名無しさん
2011/03/27(日) 08:09:14.06 分からん
規約の最後の「以下は使用を禁止する」ってリストに「拡張メソッド」「ラムダ式」「LINQ」って書いてあって、
下二つは申請すれば使えるって注釈があった
多分ユーザーに直接聞けば普通にOKされるとは思うが、リーダーと元請が事なかれ主義で申請を弾くんじゃないかと思う
最悪後出しで吊し上げられる可能性もあるから確認する気にもならん
規約の最後の「以下は使用を禁止する」ってリストに「拡張メソッド」「ラムダ式」「LINQ」って書いてあって、
下二つは申請すれば使えるって注釈があった
多分ユーザーに直接聞けば普通にOKされるとは思うが、リーダーと元請が事なかれ主義で申請を弾くんじゃないかと思う
最悪後出しで吊し上げられる可能性もあるから確認する気にもならん
599デフォルトの名無しさん
2011/03/27(日) 08:28:01.17 拡張メソッドを自分で作るなってことじゃないのか?
600デフォルトの名無しさん
2011/03/27(日) 12:02:56.77 成果物のソースコードやライブラリを.NET2.0環境でも流用したいとかじゃないの?
601デフォルトの名無しさん
2011/03/27(日) 12:21:50.11 あそこがそんなまともな発想で動くはずがない
同じ規約に「stringは参照型だからconstじゃなくてstatic readonlyにしろ」って書いてあるんだぞ?
FxCopで何十個も警告出てみんな間違いだってわかってるのに、客がドヤ顔で提示してくるから誰も突っ込まないし
同じ規約に「stringは参照型だからconstじゃなくてstatic readonlyにしろ」って書いてあるんだぞ?
FxCopで何十個も警告出てみんな間違いだってわかってるのに、客がドヤ顔で提示してくるから誰も突っ込まないし
602デフォルトの名無しさん
2011/03/27(日) 12:25:59.03 理由は間違ってるがその規約自体は必ずしも間違ってないぞ
privateやinternalならいいが、アセンブリの外から見えるconst定数は
バージョン管理上問題があるので非推奨
privateやinternalならいいが、アセンブリの外から見えるconst定数は
バージョン管理上問題があるので非推奨
603デフォルトの名無しさん
2011/03/27(日) 12:38:29.25 >602
そういう意味ならstatic readonlyでもダメだろ
そういう意味ならstatic readonlyでもダメだろ
604デフォルトの名無しさん
2011/03/27(日) 12:48:55.51605デフォルトの名無しさん
2011/03/27(日) 13:17:12.35 メモリの節約が目的なのかな?
実際にはインターンされるから節約できるのは 文字列のサイズ×参照元のアセンブリの数 くらいかw
実際にはインターンされるから節約できるのは 文字列のサイズ×参照元のアセンブリの数 くらいかw
606デフォルトの名無しさん
2011/03/27(日) 13:45:11.34 .NETやらC#やらを使ってて「メモリの節約が〜」とか片腹痛いよね
馬鹿みたいな要求はそういう小手先だけの最適化()から出てくることが多かったり
馬鹿みたいな要求はそういう小手先だけの最適化()から出てくることが多かったり
607デフォルトの名無しさん
2011/03/31(木) 14:49:08.10 LINQは糞
608デフォルトの名無しさん
2011/04/02(土) 21:40:07.08 可読性が著しく悪化する
609デフォルトの名無しさん
2011/04/07(木) 22:52:52.61 SQLとかXML使わない人にはLINQって無用?
610デフォルトの名無しさん
2011/04/07(木) 22:57:19.29 コレクションも配列もIEnumerable<T>も使わないなら無用
612デフォルトの名無しさん
2011/04/08(金) 01:19:05.23 えっ
614デフォルトの名無しさん
2011/04/08(金) 23:54:00.10 あんたー
行かないでー
行かないでー
615デフォルトの名無しさん
2011/05/16(月) 14:59:59.72 おまえらの持ってるLINQの良書ってなんですか?
自分はオライリーのクックブック(LINQは30ページほど)しか持ってないから参考にしたい。
自分はオライリーのクックブック(LINQは30ページほど)しか持ってないから参考にしたい。
616デフォルトの名無しさん
2011/05/18(水) 17:03:55.24617デフォルトの名無しさん
2011/05/18(水) 19:19:33.39 LINQテクノロジ入門はないな。
618デフォルトの名無しさん
2011/06/02(木) 19:50:13.55 マイクロソフトさん、無敵のC#でエディットコンティニュなんとかしてくださいよォ
619デフォルトの名無しさん
2011/06/04(土) 10:32:14.82 LINQが素晴らしすぎて
もう他の言語では開発する気が起きない身体になってしまいました
javaがforを回しているのを見るだけで不整脈になります
Microsoftはどう責任をとるつもりですか?
もう他の言語では開発する気が起きない身体になってしまいました
javaがforを回しているのを見るだけで不整脈になります
Microsoftはどう責任をとるつもりですか?
620デフォルトの名無しさん
2011/06/04(土) 12:53:35.38 よし、じゃあ、J# 復活させろって要望を出しまくるんだ!
621デフォルトの名無しさん
2011/06/04(土) 18:17:29.27 from i in Enumerable.Range(1,10) ... までやっちゃう奴もいるが、
世の中には適材適所って言葉がだなw
世の中には適材適所って言葉がだなw
622デフォルトの名無しさん
2011/06/04(土) 23:25:36.07 F#のほうがいいお(´・ω・`)
623デフォルトの名無しさん
2011/06/05(日) 00:01:06.96 javaとか滅亡すればいいのに
624デフォルトの名無しさん
2011/06/05(日) 01:42:03.34 LINQ(の出来ること)に限ってはScalaやF#よりC#のほうがいいな。
625デフォルトの名無しさん
2011/06/05(日) 02:02:23.62 F#つかってるけどLINQは全く使わんな。
DBとかつかうんならまた話は別なんだが、おbじぇctとXMLはつかわんでいい。
DBとかつかうんならまた話は別なんだが、おbじぇctとXMLはつかわんでいい。
626デフォルトの名無しさん
2011/06/05(日) 02:14:45.27627デフォルトの名無しさん
2011/06/05(日) 09:55:46.24 XMLはElementとかAttributeとるラッパーかましたりSeq化したり。
SQLはクエリーにしないといけないのでそういうわけにはいかんけど。
まぁF#でもうちっとLinqがきれいに書ければいいんだけどね。TypeProvider来たらもう少し変わるんか?
SQLはクエリーにしないといけないのでそういうわけにはいかんけど。
まぁF#でもうちっとLinqがきれいに書ければいいんだけどね。TypeProvider来たらもう少し変わるんか?
628デフォルトの名無しさん
2011/06/05(日) 11:58:43.36 XPathかと思ったら・・・
629デフォルトの名無しさん
2011/06/06(月) 07:34:52.23 Xquery
630デフォルトの名無しさん
2011/06/09(木) 23:12:42.43 あれ?LINQ2SQLだとインデックス使ってくれないとかある?
さっきざっくり見た時にvarcharをncarcharに変換するので引っかからないうんたらとか書いてるもあったような気がしたんだが。
さっきざっくり見た時にvarcharをncarcharに変換するので引っかからないうんたらとか書いてるもあったような気がしたんだが。
631デフォルトの名無しさん
2011/06/09(木) 23:21:51.44 そんなもんスキーマと検索条件次第だろ
自分でDataContext.Log設定して実行計画確認しろよ
自分でDataContext.Log設定して実行計画確認しろよ
632デフォルトの名無しさん
2011/06/10(金) 00:45:13.06 Logみれというのはごもっともなんだが、明らかにインデックスのはってある絡むだけをwhereで使ってんないんだよね・・・
ちなみにちょと違うかもしれんがこんなのあった。
http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/cfa263a0-fc7b-4da5-982c-901da60236db/
ちなみにちょと違うかもしれんがこんなのあった。
http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/cfa263a0-fc7b-4da5-982c-901da60236db/
633デフォルトの名無しさん
2011/06/11(土) 07:50:22.35 あ
634デフォルトの名無しさん
2011/06/26(日) 21:45:11.58 まじっすか!!!
635デフォルトの名無しさん
2011/06/28(火) 13:00:23.68 複数のテーブルが複数のsdf(SQL Server Compact)ファイルに分散して格納されています。
#テーブル1,2はファイル1、テーブル3,4,5はファイル2など。
このような場合でもLinq to Entitiesで全てのテーブルを連携した検索等を行うことは可能でしょうか?
Linq自体これから勉強するところなのですが、仕様を先に決めなければなりません。
ご教示よろしくお願いします。
#テーブル1,2はファイル1、テーブル3,4,5はファイル2など。
このような場合でもLinq to Entitiesで全てのテーブルを連携した検索等を行うことは可能でしょうか?
Linq自体これから勉強するところなのですが、仕様を先に決めなければなりません。
ご教示よろしくお願いします。
636デフォルトの名無しさん
2011/06/28(火) 13:09:40.13637デフォルトの名無しさん
2011/06/28(火) 21:01:46.09 SelectedItems
Item
Count
SelectedIndices
Item
上記はそれぞれどのような機能を果たすのですか?その機能を教えてほしいです。
初心者で申し訳ありません。
Item
Count
SelectedIndices
Item
上記はそれぞれどのような機能を果たすのですか?その機能を教えてほしいです。
初心者で申し訳ありません。
638デフォルトの名無しさん
2011/06/29(水) 00:47:53.20639デフォルトの名無しさん
2011/06/29(水) 02:54:06.93 Linq2SqlとLinq2Entityってざっくり何が違うん(´・ω・`)
640デフォルトの名無しさん
2011/06/29(水) 08:46:14.33 >>639
そもそも開発チームが違う。
LINQ to SQL は言語チームが IQueryable 版 LINQ の参考実装として作ったもの。
LINQ to Entities は ADO.NET チームが作った、ちゃんとした DB アクセスライブラリ。
当然、参考実装が今後保守されるわけがなく。
そもそも開発チームが違う。
LINQ to SQL は言語チームが IQueryable 版 LINQ の参考実装として作ったもの。
LINQ to Entities は ADO.NET チームが作った、ちゃんとした DB アクセスライブラリ。
当然、参考実装が今後保守されるわけがなく。
641デフォルトの名無しさん
2011/06/29(水) 09:28:45.92 なるー。
で聞きたいのはEntityFrameworkを使ってこれから幸せになれるかなんだが…
まっとーなプロジェクトで使ってる人とかおるん?
で聞きたいのはEntityFrameworkを使ってこれから幸せになれるかなんだが…
まっとーなプロジェクトで使ってる人とかおるん?
642デフォルトの名無しさん
2011/06/29(水) 09:33:23.62 最近、というか、.NET 4世代になってようやく採用増えてるんじゃないな。
643デフォルトの名無しさん
2011/06/30(木) 00:31:39.64 これは良いスレ。
計測データの収集と抽出にDB使おうと考えてた。
計測データの収集と抽出にDB使おうと考えてた。
645デフォルトの名無しさん
2011/07/04(月) 00:35:22.65 LINQtoSQLはなんだかんだでNET4でもサポートされてる。
なくなるような懸念されてたけどどうもそんな感じではない。
なくなるような懸念されてたけどどうもそんな感じではない。
646デフォルトの名無しさん
2011/07/04(月) 00:39:45.53 WP7でLinq to Sqlが乗っかってるから、それ自体がなくなるってのはもうないねー。
647デフォルトの名無しさん
2011/07/06(水) 09:51:37.05 いまいちわからん。
もともとDBに任せてた SELECT とかの処理をクライアント側でやるってこと?だよね?
テーブルのデータを全部クライアントに持ってくるの?
もともとDBに任せてた SELECT とかの処理をクライアント側でやるってこと?だよね?
テーブルのデータを全部クライアントに持ってくるの?
648デフォルトの名無しさん
2011/07/06(水) 10:41:45.19 言葉の意味はよく分からんがとにかくすごい勘違いだ
649デフォルトの名無しさん
2011/07/06(水) 13:36:20.66 テーブル HOGE に 100 件中 10 件のデータの項目A が 10以下だったとして
その10件のデータに対してループ処理をしたいとき
LINQってまずDBから100件データ取ってきてコード内で指定された条件の10件分だけ選別してループするんじゃないの?
それともSQLを自動生成して必要分だけ取ってきてくれるの?
あれなんか根本的に間違ってる?
その10件のデータに対してループ処理をしたいとき
LINQってまずDBから100件データ取ってきてコード内で指定された条件の10件分だけ選別してループするんじゃないの?
それともSQLを自動生成して必要分だけ取ってきてくれるの?
あれなんか根本的に間違ってる?
650デフォルトの名無しさん
2011/07/06(水) 14:15:04.78 オブジェクトでSQLライクな操作を可能にしたのがLINQだろ
651デフォルトの名無しさん
2011/07/06(水) 16:10:54.32 >>647
全然違う。
LINQ to SQL とか LINQ to Entties は、
クエリ式とか db.Select(x => ...) みたいなメソッド呼び出しから、
式ツリー作って、その式ツリーから SQL 文組み立てて
DB サーバーに問い合わせ行う。
全然違う。
LINQ to SQL とか LINQ to Entties は、
クエリ式とか db.Select(x => ...) みたいなメソッド呼び出しから、
式ツリー作って、その式ツリーから SQL 文組み立てて
DB サーバーに問い合わせ行う。
652デフォルトの名無しさん
2011/07/06(水) 16:41:34.63 >>649
まずはLINQ to ObjectとLINQ to SQLの違いを勉強してから来い
まずはLINQ to ObjectとLINQ to SQLの違いを勉強してから来い
653デフォルトの名無しさん
2011/07/06(水) 21:35:56.48 詳しくない人は、IQueryableについて調べてから出直してください。
654デフォルトの名無しさん
2011/07/07(木) 23:26:47.53 教えてください。
クラスの配列を特定の要素でグループ化して、その中で別の要素の値が
もっとも小さいモノを取得したいと考えています。
var rows = new classA[] {
new classA { id = 1, group = 1, value = 100 },
new classA { id = 2, group = 1, value = 101 },
以下略 };
こんな感じの配列を group の値ごとに、同じ group をもつの同士の中で value が最小のレコード?を選びたい。
で、LINQ を利用してこんなことをしてみました。(間違いがあっても大目に見てください)
var list = from a in rows group a by a.group;
foreach( var x in list )
{
var row = from b in x where b.value = x.min( y => y.value );
row の保存処理;
}
一応これでも期待した動作はするんですが、もっときれいに一発でやれそうな気がします。
もっとよい方法があれば、ご教示いただけませんか?
クラスの配列を特定の要素でグループ化して、その中で別の要素の値が
もっとも小さいモノを取得したいと考えています。
var rows = new classA[] {
new classA { id = 1, group = 1, value = 100 },
new classA { id = 2, group = 1, value = 101 },
以下略 };
こんな感じの配列を group の値ごとに、同じ group をもつの同士の中で value が最小のレコード?を選びたい。
で、LINQ を利用してこんなことをしてみました。(間違いがあっても大目に見てください)
var list = from a in rows group a by a.group;
foreach( var x in list )
{
var row = from b in x where b.value = x.min( y => y.value );
row の保存処理;
}
一応これでも期待した動作はするんですが、もっときれいに一発でやれそうな気がします。
もっとよい方法があれば、ご教示いただけませんか?
655デフォルトの名無しさん
2011/07/08(金) 01:21:39.32 クエリ式じゃないけど
rows.OrderBy(e => e.value).GroupBy(e => e.group).Select(e=>e.First());
これでいけるが、groupってプロパティ名は・・・
rows.OrderBy(e => e.value).GroupBy(e => e.group).Select(e=>e.First());
これでいけるが、groupってプロパティ名は・・・
656デフォルトの名無しさん
2011/07/08(金) 01:41:10.34 rows.GroupBy(x => x.group).Select(y => y.Min(z => z.value))
groupよりvalueがイヤだ
groupよりvalueがイヤだ
657デフォルトの名無しさん
2011/07/08(金) 05:09:43.01 var list =
from a in rows
group a by a.@group into g
select g.OrderBy(x => x.value).First();
from a in rows
group a by a.@group into g
select g.OrderBy(x => x.value).First();
658654
2011/07/09(土) 00:03:39.81 ありがとうございます。
やっぱり出来たんですね。
それぞれの方法で動作を確認しました。
あのプロパティ名は、ここに書くためにわかりやすそうなのを適当につけただけなので。
ご心配には及びません。w 余計な心配をさせてしまったみたいで、すみません。
やっぱり出来たんですね。
それぞれの方法で動作を確認しました。
あのプロパティ名は、ここに書くためにわかりやすそうなのを適当につけただけなので。
ご心配には及びません。w 余計な心配をさせてしまったみたいで、すみません。
659デフォルトの名無しさん
2011/07/19(火) 15:12:17.04 int[] ia = {0,1,2,3,4,5,6,7,8,9}
に対して、並べ替えが
ia = {5,6,7,8,9,4,3,2,1,0}
となるようなLINQの書き方を教えてください。
に対して、並べ替えが
ia = {5,6,7,8,9,4,3,2,1,0}
となるようなLINQの書き方を教えてください。
660デフォルトの名無しさん
2011/07/19(火) 15:16:43.87 それは具体的にどういうルールなんだ
その例だけだとたくさんアプローチがあるんだが
その例だけだとたくさんアプローチがあるんだが
661デフォルトの名無しさん
2011/07/19(火) 15:28:28.71 0〜4までのグループ1は降順で、5〜9までのグループ2は昇順で、
グループ2→グループ1の順に並べたいです。
グループ2→グループ1の順に並べたいです。
662デフォルトの名無しさん
2011/07/19(火) 15:47:10.41 グループ分けは数値の大きさで決定?配列内での位置で決定?
663デフォルトの名無しさん
2011/07/19(火) 15:47:48.84 エスパーさんの御指名でしたか
664デフォルトの名無しさん
2011/07/19(火) 15:48:45.38 数値の大きさです。
665デフォルトの名無しさん
2011/07/19(火) 15:53:57.02 from i in ia
orderby i < 5 ? -i : i
orderby i < 5 ? 1 : 0
select i
orderby i < 5 ? -i : i
orderby i < 5 ? 1 : 0
select i
666デフォルトの名無しさん
2011/07/19(火) 16:00:37.66 おぉ、OrderByは2つ繋げてもいいんだ。?って初めて見た。
調べます。ありがとうございました。
調べます。ありがとうございました。
667デフォルトの名無しさん
2011/07/19(火) 16:04:18.40 ?は三項演算子、:とセット
プログラム書いてる人なら初めてってこたないと思うが
まあ誰にでも最初はあるか
プログラム書いてる人なら初めてってこたないと思うが
まあ誰にでも最初はあるか
668デフォルトの名無しさん
2011/07/20(水) 02:11:33.40 LINQ始めたてでよくわかってないんですが、C#の場合
var q = array.Where(x => x <= 4).Select(x => x);
配列から4以下の数値を、取り出す文の場合なんでWhereとSelectの中になんでラムダ式が入っているんですか?
それとxという変数っぽいのはなんなんですか?
var q = array.Where(x => x <= 4).Select(x => x);
配列から4以下の数値を、取り出す文の場合なんでWhereとSelectの中になんでラムダ式が入っているんですか?
それとxという変数っぽいのはなんなんですか?
669デフォルトの名無しさん
2011/07/20(水) 02:35:06.43 Whereならラムダ式でtrueになったものだけひっかけてくれる。
xはWhereのなかなどでラムダ式が呼び出される時にアイテムがセットされる。
xはWhereのなかなどでラムダ式が呼び出される時にアイテムがセットされる。
670デフォルトの名無しさん
2011/07/20(水) 02:53:47.23 >>668
そのコードの場合、Select(x => x)は不要だね。
private static bool Predicate(int x)
{
return x < 4;
}
と書くのをラムダ式にすると x => x < 4 となるわけで、xは変数そのもの。
もっと展開すれば
foreach(var x in array)
{
if (Predicate(x)) yield return x;
}
だから、 x は配列中の各要素が来る。
そのコードの場合、Select(x => x)は不要だね。
private static bool Predicate(int x)
{
return x < 4;
}
と書くのをラムダ式にすると x => x < 4 となるわけで、xは変数そのもの。
もっと展開すれば
foreach(var x in array)
{
if (Predicate(x)) yield return x;
}
だから、 x は配列中の各要素が来る。
671デフォルトの名無しさん
2011/07/20(水) 19:13:40.41 >>668
http://www.atmarkit.co.jp/fdotnet/chushin/roadtolinq_01/roadtolinq_01_02.html
↑これのFigure 9。
x はラムダ式(匿名関数)の引数。
http://www.atmarkit.co.jp/fdotnet/chushin/roadtolinq_01/roadtolinq_01_02.html
↑これのFigure 9。
x はラムダ式(匿名関数)の引数。
672デフォルトの名無しさん
2011/08/03(水) 06:46:39.84 >>670
Selectの有無でqの戻り値が変わることもあるよ
Selectの有無でqの戻り値が変わることもあるよ
673デフォルトの名無しさん
2011/08/03(水) 11:18:41.76 え?まじで?どういう場合に?
674デフォルトの名無しさん
2011/08/03(水) 19:11:17.24 戻り値は変わらないのでは?
しいてそういうケースを考えるなら
ただの配列に.Select(x => x)だけを足したりなどをすると、
得られる結果は一見同じだけど
型が厳密なIEnumerable<T>に変わるのと、
当然Selectを通るのでパフォーマンスは落ちる。
ただ、今回の場合は前段階にWhereが挟まれているので、何も変わらないね。
しいてそういうケースを考えるなら
ただの配列に.Select(x => x)だけを足したりなどをすると、
得られる結果は一見同じだけど
型が厳密なIEnumerable<T>に変わるのと、
当然Selectを通るのでパフォーマンスは落ちる。
ただ、今回の場合は前段階にWhereが挟まれているので、何も変わらないね。
675デフォルトの名無しさん
2011/08/03(水) 20:44:38.31 WhereのイテレータがSelectのイテレータに変わるから全く何も変わらないわけでもない
全く意味のない違いだけど
全く意味のない違いだけど
676デフォルトの名無しさん
2011/08/03(水) 21:40:50.63 まあ、ReferenceEqualsでもしない限りは。
普通しないと思うし。
普通しないと思うし。
677デフォルトの名無しさん
2011/08/08(月) 01:02:05.32 皆型までみないのか。
678デフォルトの名無しさん
2011/08/08(月) 01:26:27.26 LINQはインターフェイス中心だしね。
679デフォルトの名無しさん
2011/08/08(月) 19:29:01.07 DataTableをSELECTして匿名型になると元に戻すのが大変なんよー
680デフォルトの名無しさん
2011/08/14(日) 00:44:37.92 先生早く来ないかな
681デフォルトの名無しさん
2011/09/04(日) 02:37:18.36 >>674
> ただの配列に.Select(x => x)だけを足したりなどをすると、
> 得られる結果は一見同じだけど
> 型が厳密なIEnumerable<T>に変わるのと
厳密なってどういう意味だ?
IEnumerable<T>の派生型である配列からIEnumerable<T>へと抽象化されるんだが…
> ただの配列に.Select(x => x)だけを足したりなどをすると、
> 得られる結果は一見同じだけど
> 型が厳密なIEnumerable<T>に変わるのと
厳密なってどういう意味だ?
IEnumerable<T>の派生型である配列からIEnumerable<T>へと抽象化されるんだが…
682デフォルトの名無しさん
2011/09/04(日) 02:50:26.04 ああ、すまん、>>675って意味か…
683デフォルトの名無しさん
2011/09/06(火) 13:26:26.01 現在 asp.netで開発しております。
初心者です。
下記のようなXMLファイルを八百屋のIDを条件に
果物、野菜、缶詰の在庫の判定を行いたいのですが、
うまくいきません。
ご教示ください。
XMLの読み込みはLinqを使用しています。
初心者です。
下記のようなXMLファイルを八百屋のIDを条件に
果物、野菜、缶詰の在庫の判定を行いたいのですが、
うまくいきません。
ご教示ください。
XMLの読み込みはLinqを使用しています。
684デフォルトの名無しさん
2011/09/06(火) 13:29:04.49 Dim xmldoc As XElement = XElement.Load("C:\test.xml")
Dim query = From c In xmldoc.Descendants("八百屋") select c (ここからの条件が解りません)
For Each result In query
Dim Apple As String = result.Element("リンゴ").Attribute("在庫").Value
Dim Mikan As String = result.Element("みかん").Attribute("在庫").Value
上記のような感じで属性を取得していきます。
Next
宜しくお願いします。
Dim query = From c In xmldoc.Descendants("八百屋") select c (ここからの条件が解りません)
For Each result In query
Dim Apple As String = result.Element("リンゴ").Attribute("在庫").Value
Dim Mikan As String = result.Element("みかん").Attribute("在庫").Value
上記のような感じで属性を取得していきます。
Next
宜しくお願いします。
685デフォルトの名無しさん
2011/09/06(火) 13:32:18.03 <設定内容>
<八百屋 ID="001">
<果物>
<リンゴ 在庫="YES"/>
<みかん 在庫="YES"/>
<メロン 在庫="NO"/>
</果物>
<野菜>
<大根 在庫="NO">
<白菜 在庫="YES">
</野菜>
<缶詰>
<桃 在庫="NO">
<みかん 在庫="YES">
</缶詰>
</八百屋>
</設定内容>
<八百屋 ID="001">
<果物>
<リンゴ 在庫="YES"/>
<みかん 在庫="YES"/>
<メロン 在庫="NO"/>
</果物>
<野菜>
<大根 在庫="NO">
<白菜 在庫="YES">
</野菜>
<缶詰>
<桃 在庫="NO">
<みかん 在庫="YES">
</缶詰>
</八百屋>
</設定内容>
686デフォルトの名無しさん
2011/09/06(火) 20:24:12.34 こっちが聞きたいわ
「八百屋のIDを条件に」「在庫の判定」の具体的な条件は?
「八百屋のIDを条件に」「在庫の判定」の具体的な条件は?
687デフォルトの名無しさん
2011/09/06(火) 21:03:19.46 ちょっとやりたい事が伝わらない…
こんなこと?
Import System.Xml.XPath
Dim qry = From c In xmldoc.XPathSelectElements("設定内容/八百屋")
Where c.Attribute("ID").Value = "001"
Select c
※ qryは八百屋ノードの列挙データ
てかたぶんやりたいことはLINQじゃなくて、XPathの方がすっきりするような気がする…
こんなこと?
Import System.Xml.XPath
Dim qry = From c In xmldoc.XPathSelectElements("設定内容/八百屋")
Where c.Attribute("ID").Value = "001"
Select c
※ qryは八百屋ノードの列挙データ
てかたぶんやりたいことはLINQじゃなくて、XPathの方がすっきりするような気がする…
688デフォルトの名無しさん
2011/09/06(火) 21:59:22.20 from item in xmldoc.Descendants("八百屋")
let 果物 = item.Element("果物")
let 野菜 = item.Element("野菜")
let 缶詰 = item.Element("缶詰")
select new
{
HasApple = 果物.Element("リンゴ").Attribute("在庫").Value == "YES",
HasPeach = 缶詰.Element("桃").Attribute("在庫").Value == "YES"
}
みたいな感じでしょうか?VBも多分同じ感じなはず。
let 果物 = item.Element("果物")
let 野菜 = item.Element("野菜")
let 缶詰 = item.Element("缶詰")
select new
{
HasApple = 果物.Element("リンゴ").Attribute("在庫").Value == "YES",
HasPeach = 缶詰.Element("桃").Attribute("在庫").Value == "YES"
}
みたいな感じでしょうか?VBも多分同じ感じなはず。
689デフォルトの名無しさん
2011/09/08(木) 17:12:16.76 親子構造テーブル検索をしたいのですが、一発で取得する方法はありますか?
スキーマがID,親IDとなっていて、
A,null-+-A1,A
+-A2,A-+-A21,A2
B,null-+-B1,B
+-B2,B
+-B3,B-+-B31,B3-+-B311,B31
データがこのようになっていた場合、ID:Aで検索をかけてA,A1,A2,A21を取得したいです
ルートレコード(A)は取得できなくても構いません
また、A○やA○○と連番風になっていますが、実際はGUIDで、ID文字列中に親子を類推できる情報は一切ありません
よろしくお願いします
スキーマがID,親IDとなっていて、
A,null-+-A1,A
+-A2,A-+-A21,A2
B,null-+-B1,B
+-B2,B
+-B3,B-+-B31,B3-+-B311,B31
データがこのようになっていた場合、ID:Aで検索をかけてA,A1,A2,A21を取得したいです
ルートレコード(A)は取得できなくても構いません
また、A○やA○○と連番風になっていますが、実際はGUIDで、ID文字列中に親子を類推できる情報は一切ありません
よろしくお願いします
690デフォルトの名無しさん
2011/09/08(木) 21:34:54.14 分かりにくいし、データ構造の指定もないから逆に答えずらいわ…
private class A
{
public string ID { get; set; }
public string Parent { get; set; }
}
var l = new List<A>();
l.Add(new A() { ID = "A", Parent = null });
l.Add(new A() { ID = "A1", Parent = "A" });
l.Add(new A() { ID = "A2", Parent = "A" });
l.Add(new A() { ID = "A21", Parent = "A2" });
l.Add(new A() { ID = "B", Parent = null });
l.Add(new A() { ID = "B1", Parent = "B" });
l.Add(new A() { ID = "B2", Parent = "B" });
l.Add(new A() { ID = "B3", Parent = "B" });
l.Add(new A() { ID = "B31", Parent = "B3" });
l.Add(new A() { ID = "B311", Parent = "B31" });
string sel = "A";
var ret = new List<A>();
l.ForEach(x => { if (x.Parent == sel || ret.Any(y => y.ID == x.Parent)) ret.Add(x); });
private class A
{
public string ID { get; set; }
public string Parent { get; set; }
}
var l = new List<A>();
l.Add(new A() { ID = "A", Parent = null });
l.Add(new A() { ID = "A1", Parent = "A" });
l.Add(new A() { ID = "A2", Parent = "A" });
l.Add(new A() { ID = "A21", Parent = "A2" });
l.Add(new A() { ID = "B", Parent = null });
l.Add(new A() { ID = "B1", Parent = "B" });
l.Add(new A() { ID = "B2", Parent = "B" });
l.Add(new A() { ID = "B3", Parent = "B" });
l.Add(new A() { ID = "B31", Parent = "B3" });
l.Add(new A() { ID = "B311", Parent = "B31" });
string sel = "A";
var ret = new List<A>();
l.ForEach(x => { if (x.Parent == sel || ret.Any(y => y.ID == x.Parent)) ret.Add(x); });
692デフォルトの名無しさん
2011/09/10(土) 03:26:25.43 学校の宿題であることを願うばかりだ・・・
693デフォルトの名無しさん
2011/09/10(土) 16:31:03.33 テーブルをNodes (ID uniqueidentifier, ParentID uniqueidentifier)とすれば、SQLでもEntitiesでも
class Node {
uniqueidentifier ID { get; set; }
Node Node { get; set; } // ParentIDのリレーション (i.e. 親Node)
}
こんな感じのクラスになるはずだから、何も悩む必要はないと思うが?
class Node {
uniqueidentifier ID { get; set; }
Node Node { get; set; } // ParentIDのリレーション (i.e. 親Node)
}
こんな感じのクラスになるはずだから、何も悩む必要はないと思うが?
694デフォルトの名無しさん
2011/09/18(日) 10:53:41.53 int[] data;
省略
init max = data.Where(e => 条件).Max();
このとき、条件に一致するのがなかったときシーケンスが空っぽだよって例外が出るよね
だからといって
var seq = data.Where(e => 条件);
if(seq.Count > 0) {
max = seq.Max
}
ってしようとするとintと比較できないってコンパイルエラー出るし、
結構不便だよね
省略
init max = data.Where(e => 条件).Max();
このとき、条件に一致するのがなかったときシーケンスが空っぽだよって例外が出るよね
だからといって
var seq = data.Where(e => 条件);
if(seq.Count > 0) {
max = seq.Max
}
ってしようとするとintと比較できないってコンパイルエラー出るし、
結構不便だよね
695デフォルトの名無しさん
2011/09/18(日) 13:26:40.48 seq.Count()だろ
でも一つ含まれてればいいんだから if (seq.Any()) の方がいい
一行で書くなら
int? max = data.Where(e=>条件).Select(e=>(int?)e).DefaultIfEmpty().Max();
かな
でも一つ含まれてればいいんだから if (seq.Any()) の方がいい
一行で書くなら
int? max = data.Where(e=>条件).Select(e=>(int?)e).DefaultIfEmpty().Max();
かな
696デフォルトの名無しさん
2011/09/22(木) 05:59:38.55 >>695
了解
了解
697 忍法帖【Lv=8,xxxP】
2011/11/10(木) 08:11:23.35 a
698デフォルトの名無しさん
2012/01/19(木) 20:38:38.84 linqでcsvファイルを二次元配列に読み込むこと出来ますか?
699デフォルトの名無しさん
2012/01/19(木) 23:41:37.84 出来ますん
700デフォルトの名無しさん
2012/01/19(木) 23:45:40.19 LINQ使うなら二次元配列はすごく相性悪いから捨てろ(そうでなくても多次元配列は終わってるから使うな)
配列の配列を使うことにして、エスケープとか考えないなら
string[][] csv = File.ReadLines("hoge.csv").Select(line=>line.Split(",").ToArray()).ToArray();
配列の配列を使うことにして、エスケープとか考えないなら
string[][] csv = File.ReadLines("hoge.csv").Select(line=>line.Split(",").ToArray()).ToArray();
701デフォルトの名無しさん
2012/01/20(金) 05:02:02.84 二次元配列でなくて、CSVの1レコード(1行)に当たるクラスを作って、
そのクラスの配列ないしList<T>として読み込むなら、LINQ to CSV使えば一行で出来る
var hhh = new CsvContext().Read<作ったクラス名>(str, new CsvFileDescription { TextEncoding = Encoding.UTF8 }).Distinct().OrderBy(x => x.ID).ToArray;
みたいな感じで (上は、念のため重複覗いてID順に並べたりしてる)
そのクラスの配列ないしList<T>として読み込むなら、LINQ to CSV使えば一行で出来る
var hhh = new CsvContext().Read<作ったクラス名>(str, new CsvFileDescription { TextEncoding = Encoding.UTF8 }).Distinct().OrderBy(x => x.ID).ToArray;
みたいな感じで (上は、念のため重複覗いてID順に並べたりしてる)
702デフォルトの名無しさん
2012/01/20(金) 05:04:41.12 ↑ ちなみに str は読み込むCSVのファイル名を入れた変数
703デフォルトの名無しさん
2012/01/20(金) 08:08:43.31704デフォルトの名無しさん
2012/01/27(金) 14:02:24.01 質問なんですが、下のプログラムにてlinqでスマートに最後の行の状態にしたいんですが、
どういった方法がありますか?
var collection = new[] { 1, 2, 3 }; //これを
collection = ?
//var collection = new[] { 1, 2, 2, 3, 3, 3 }; //こうしたい
どういった方法がありますか?
var collection = new[] { 1, 2, 3 }; //これを
collection = ?
//var collection = new[] { 1, 2, 2, 3, 3, 3 }; //こうしたい
705704
2012/01/27(金) 14:15:34.18 すみません自己解決しました
var result = collection.SelectMany(i => Enumerable.Repeat(i, i));
var result = collection.SelectMany(i => Enumerable.Repeat(i, i));
706デフォルトの名無しさん
2012/02/09(木) 12:15:10.64 LINQでループ処理
何得ですね。
Enumerable.Range(0,length).All(i =>
{
dosomething(i);
return true;
});
何得ですね。
Enumerable.Range(0,length).All(i =>
{
dosomething(i);
return true;
});
707デフォルトの名無しさん
2012/02/13(月) 18:29:22.29 単なるループなら無駄だけど、N個の「なにか」が欲しいときは便利だね。
[LINQ]
var items = Enumerable.Range(0, N)
.Select(i => new Foo(i))
.ToArray();
[for]
var list = new List<Foo>();
for(var i=0;i<N;i++)
items.Add(new Foo(i));
var items = list.ToArray();
[LINQ]
var items = Enumerable.Range(0, N)
.Select(i => new Foo(i))
.ToArray();
[for]
var list = new List<Foo>();
for(var i=0;i<N;i++)
items.Add(new Foo(i));
var items = list.ToArray();
708デフォルトの名無しさん
2012/02/24(金) 22:06:01.26709デフォルトの名無しさん
2012/02/25(土) 02:33:39.10 LISPとかもいましたし
710デフォルトの名無しさん
2012/02/25(土) 02:42:37.61 >>708
これは酷い
これは酷い
711デフォルトの名無しさん
2012/02/25(土) 08:30:57.04 >グループ名のLinQは"Love in 九州"からの造語であり、またアイドル活動を通じて様々なものを"リンク"するという意味も込められている。
それならLinKにしろよ。。。
それならLinKにしろよ。。。
712デフォルトの名無しさん
2012/02/25(土) 08:58:56.23 九州の意味でQを使うのは、ローカルSFコンベンションの「Qコン」とか、
わりと古くから歴史がある(あの米澤さんも参加したことがある大会、のはず)。
わりと古くから歴史がある(あの米澤さんも参加したことがある大会、のはず)。
713デフォルトの名無しさん
2012/02/25(土) 13:12:39.82 LINQが考えなしのアイドル?だかに汚された
714デフォルトの名無しさん
2012/02/25(土) 14:34:17.58715デフォルトの名無しさん
2012/02/25(土) 14:45:19.45 最初は良スレだったのにネタが尽きたか
716デフォルトの名無しさん
2012/02/26(日) 08:35:59.17 昔秋葉原の楽器屋にORACLE Masterの参考書が売ってて
なんでかなと思ったらSOLってソフトの本と間違えてたみたい。
NoSQL系でLINQネイティヴ対応のが出れば流行るかねー
MS以外にポートしないとダメか
なんでかなと思ったらSOLってソフトの本と間違えてたみたい。
NoSQL系でLINQネイティヴ対応のが出れば流行るかねー
MS以外にポートしないとダメか
717デフォルトの名無しさん
2012/02/29(水) 00:20:54.78 【消しゴム】MONOを使ってみるスレ4【じゃない】
http://toro.2ch.net/test/read.cgi/tech/1329023778/
http://toro.2ch.net/test/read.cgi/tech/1329023778/
718デフォルトの名無しさん
2012/02/29(水) 19:50:47.06 アイドルはLinQでMSのはLINQだ
719デフォルトの名無しさん
2012/03/04(日) 00:59:43.14 http://theinterviews.jp/linq/3146658
LINQネタにも返してくれてるしそんなに怒るなよw
LINQネタにも返してくれてるしそんなに怒るなよw
720デフォルトの名無しさん
2012/03/04(日) 01:34:42.96 アイドルも大変だなw
721デフォルトの名無しさん
2012/03/04(日) 04:23:02.45 律儀に返してるのかw
722デフォルトの名無しさん
2012/03/04(日) 10:01:16.95 ステマスレとして終息か
723デフォルトの名無しさん
2012/06/27(水) 07:12:16.27 特定PCのみ、LINQ to EntitiesのLINQのクエリ構文だと
単純なクエリでもtimeoutするくらい遅いのですが、
なにか分かりますか?ExecuteStoreQueryなら同等でも一瞬なんです。
・遅い
Using context As New Entities
Dim hoge = (From a In context.hoge Where a.hoge = "xx").ToList()
End Using
・速い
Using context As New Entities
Dim hoge = context.ExecuteStoreQuery(Of hoge) _
("select * from hoge where hoge = 'xx')
End Using
前者だと高い確率で以下が出ます。後者は全く出ません。Entitiesは同じものです。
{"Timeout に達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
現在のコマンドで重大なエラーが発生しました。結果は破棄しなければなりません。
サーバーから結果を受信しているときに、トランスポート レベルのエラーが発生しました。 (provider: Session Provider, error: 18 - ピアによって接続が閉じられました)"}
単純なクエリでもtimeoutするくらい遅いのですが、
なにか分かりますか?ExecuteStoreQueryなら同等でも一瞬なんです。
・遅い
Using context As New Entities
Dim hoge = (From a In context.hoge Where a.hoge = "xx").ToList()
End Using
・速い
Using context As New Entities
Dim hoge = context.ExecuteStoreQuery(Of hoge) _
("select * from hoge where hoge = 'xx')
End Using
前者だと高い確率で以下が出ます。後者は全く出ません。Entitiesは同じものです。
{"Timeout に達しました。操作が完了する前にタイムアウト期間が過ぎたか、またはサーバーが応答していません。
現在のコマンドで重大なエラーが発生しました。結果は破棄しなければなりません。
サーバーから結果を受信しているときに、トランスポート レベルのエラーが発生しました。 (provider: Session Provider, error: 18 - ピアによって接続が閉じられました)"}
724デフォルトの名無しさん
2012/06/27(水) 11:03:37.78 サーバー一緒か?
いずれにしてもクエリーフックしてどう違うかみて、そのクエリーを単体でやったらどうなるかとかより切り分けれ
いずれにしてもクエリーフックしてどう違うかみて、そのクエリーを単体でやったらどうなるかとかより切り分けれ
725デフォルトの名無しさん
2012/06/28(木) 10:55:47.07 >>724
サーバーも一緒です。接続文字列は変えていません。
ToTraceStringでクエリを抜きだしてみましたが、後者のクエリに全てのフィールドを
指定しているくらいで、他は同等でした。
ただ、SSMSで実行してみると、同様の現象は再現できました。・・のでEFは関係なさそうです・・
実行する度にレスポンスが返るのが遅くなります。
1回目:0秒、2回目:2秒、3回目:8秒、4回目:24秒、5回目:60秒・・というように。。
* だと実行を何度連打しても0秒で返ります。
DBの専用スレで聞いてきた方が良いですよね。。ありがとうございました。
サーバーも一緒です。接続文字列は変えていません。
ToTraceStringでクエリを抜きだしてみましたが、後者のクエリに全てのフィールドを
指定しているくらいで、他は同等でした。
ただ、SSMSで実行してみると、同様の現象は再現できました。・・のでEFは関係なさそうです・・
実行する度にレスポンスが返るのが遅くなります。
1回目:0秒、2回目:2秒、3回目:8秒、4回目:24秒、5回目:60秒・・というように。。
* だと実行を何度連打しても0秒で返ります。
DBの専用スレで聞いてきた方が良いですよね。。ありがとうございました。
726デフォルトの名無しさん
2012/06/28(木) 13:03:56.26 件数がアホみたいに多いとかじゃないの
ToListしてるってことは即時全結果返すってことだから
ToListしてるってことは即時全結果返すってことだから
727デフォルトの名無しさん
2012/06/28(木) 13:13:47.69 >>725
100件程度です。問題になる件数ではないと思います。First()でも同様でした。
あとsqlserverの専用スレで聞いてきましたのでマルチポストになってしまいますし、
こちらは閉め切ります。ありがとうございました。
100件程度です。問題になる件数ではないと思います。First()でも同様でした。
あとsqlserverの専用スレで聞いてきましたのでマルチポストになってしまいますし、
こちらは閉め切ります。ありがとうございました。
728デフォルトの名無しさん
2012/06/29(金) 09:49:47.53 なってしまうじゃねえよ死ねカス
729デフォルトの名無しさん
2012/06/29(金) 10:11:31.00 聞いてくるって事前に書いたろうが。失せろクズ
730デフォルトの名無しさん
2012/06/29(金) 19:48:13.25 結局はVMのせいか。なんでCPUって思ったんだろうね。
731デフォルトの名無しさん
2012/07/06(金) 14:48:44.96 VBだとFunction(x)とかの記述キチガイじみてるけど
デバッグ中に他の箇所修正できるとこは
使い捨てプログラム作るときはうらやましいな
デバッグ中に他の箇所修正できるとこは
使い捨てプログラム作るときはうらやましいな
732デフォルトの名無しさん
2012/07/06(金) 14:54:02.15 俺はC#の方がキチガイに見えるw x=>とか象形文字かよソレ。
なんか調べてるとき、vb読みに脳内変換するのがツライです・・
なんか調べてるとき、vb読みに脳内変換するのがツライです・・
733デフォルトの名無しさん
2012/07/06(金) 16:13:40.13 そのうちIDE上でVB/C#のリアルタイム切り替えができる時代が来る
734デフォルトの名無しさん
2012/07/06(金) 19:23:41.81 >>732
VBにもラムダ式あるだろ
VBにもラムダ式あるだろ
735デフォルトの名無しさん
2012/07/06(金) 20:07:38.46 そうだが、なにを言ってるんだおm
736デフォルトの名無しさん
2012/07/06(金) 20:34:12.10 ミッドチルダ式とベルカ式どっちが好き?
737デフォルトの名無しさん
2012/07/06(金) 21:51:23.02 オギノ式
738デフォルトの名無しさん
2012/07/30(月) 22:30:23.44 LINQは必ず全部探索するのが嫌
木構造のグラフがあるとき条件を満たしたら早期打ち切り、
みたいな処理が書けない
木構造のグラフがあるとき条件を満たしたら早期打ち切り、
みたいな処理が書けない
739デフォルトの名無しさん
2012/07/30(月) 22:57:56.60 Any() みたいなのは見つかった時点でやめてるんじゃね?
740デフォルトの名無しさん
2012/07/30(月) 23:57:33.89 うん
741デフォルトの名無しさん
2012/08/06(月) 18:01:26.34 AsParallelってCPUリソース食う以外のデメリットってある?あんまり見ないなと・・
742デフォルトの名無しさん
2012/08/06(月) 18:16:29.27 並列化させると結果の順番が保証できない。
オプションで保証できるけどそれだと並列化の効果が落ちる。
オプションで保証できるけどそれだと並列化の効果が落ちる。
743デフォルトの名無しさん
2012/08/06(月) 19:02:00.50 ほうほう。なるほど。d
744デフォルトの名無しさん
2012/08/06(月) 22:38:59.20 結局要件次第なわけだけども…
そこまで強烈に並列性を求められて、かつ、並列化に向いてる処理ってのが、業務とかだとほとんどないはず。
そこまで強烈に並列性を求められて、かつ、並列化に向いてる処理ってのが、業務とかだとほとんどないはず。
745デフォルトの名無しさん
2012/08/07(火) 05:22:08.32 異なるURLに対して一斉にHTTPでデータ取ってくる処理とかかな
746デフォルトの名無しさん
2012/08/08(水) 00:47:56.74747デフォルトの名無しさん
2012/08/08(水) 01:03:58.30 横から補足すると
ParallelはCPU負荷が低いと並列度を上げるために新しいスレッドを立ち上げる。
そのためネットワークIO待ちで使うと数十のスレッドが次々と作られて非効率的。
スレッドの立ち上げは重い処理だし、メモリ使うし、切り替えにもオーバーヘッドかかるしでいい事ないよ。
ParallelはCPU負荷が低いと並列度を上げるために新しいスレッドを立ち上げる。
そのためネットワークIO待ちで使うと数十のスレッドが次々と作られて非効率的。
スレッドの立ち上げは重い処理だし、メモリ使うし、切り替えにもオーバーヘッドかかるしでいい事ないよ。
748デフォルトの名無しさん
2012/08/08(水) 10:13:12.64 すべてのクエリ文はobj.Where(〜).Select(〜〜)みたいなメソッドチェーンに置き換え可能なんですか?
749デフォルトの名無しさん
2012/08/08(水) 16:38:48.52750デフォルトの名無しさん
2012/08/09(木) 16:02:22.16 Zelda対応はいつになりますか?
751デフォルトの名無しさん
2012/08/09(木) 21:01:37.80 一瞬なにかと…。リンクね。Legend of Zelda なら店頭へ
752デフォルトの名無しさん
2012/09/14(金) 12:08:02.54 オフィシャルなドキュメントってhttp://msdn.microsoft.com/ja-jp/library/vstudio/bb387098.aspx
なんですか?何か右欄のスペースが凄い見にくい・・・。
なんですか?何か右欄のスペースが凄い見にくい・・・。
753デフォルトの名無しさん
2012/09/14(金) 14:09:00.18 <root>
<question>
<qtext>にしむらひろゆき?</qtext>
<correctid>3</correctid>
<choices>
<choice>
<choiceid>1</choiceid>
<ctext>MS</ctext>
</choice>
<choice>
<choiceid>2</choiceid>
<ctext>Apple</ctext>
</choice>
<choice>
<choiceid>3</choiceid>
<ctext>2ch</ctext>
</choice>
</choices>
</question>
</root>
上のようなXMLがあったとして
「にしむらひろゆき?:2ch」という結果を得たい場合、どのようにすれば良いでしょうか?
XDocument xdoc = XDocument.Load(@"c:\sample.xml");
XNamespace ns = "http://2ch.net";
var q = from n in xdoc.Descendants(ns + "question")
where (string)n.Element(ns + "correctid") == (string)n.Element(ns + "choiceid")
select (string)n.Element(ns + "qtext") + ":" + (string)n.Element(ns + "ctext");
こんな感じでは上手くいきませんでした。
<question>
<qtext>にしむらひろゆき?</qtext>
<correctid>3</correctid>
<choices>
<choice>
<choiceid>1</choiceid>
<ctext>MS</ctext>
</choice>
<choice>
<choiceid>2</choiceid>
<ctext>Apple</ctext>
</choice>
<choice>
<choiceid>3</choiceid>
<ctext>2ch</ctext>
</choice>
</choices>
</question>
</root>
上のようなXMLがあったとして
「にしむらひろゆき?:2ch」という結果を得たい場合、どのようにすれば良いでしょうか?
XDocument xdoc = XDocument.Load(@"c:\sample.xml");
XNamespace ns = "http://2ch.net";
var q = from n in xdoc.Descendants(ns + "question")
where (string)n.Element(ns + "correctid") == (string)n.Element(ns + "choiceid")
select (string)n.Element(ns + "qtext") + ":" + (string)n.Element(ns + "ctext");
こんな感じでは上手くいきませんでした。
754デフォルトの名無しさん
2012/09/14(金) 22:44:52.58 var x = from q in xml.Descendants("question")
let id = (string)q.Element("correctid")
let qt = (string)q.Element("qtext")
from choice in q.Element("choices").Elements("choice")
where (string)choice.Element("choiceid") == id
select qt + ":" + (string)choice.Element("ctext");
XNamespaceは略
let id = (string)q.Element("correctid")
let qt = (string)q.Element("qtext")
from choice in q.Element("choices").Elements("choice")
where (string)choice.Element("choiceid") == id
select qt + ":" + (string)choice.Element("ctext");
XNamespaceは略
755デフォルトの名無しさん
2012/09/14(金) 22:57:50.31756デフォルトの名無しさん
2012/09/14(金) 23:02:47.39 いやlet句はこの場合楽できるぐらいの意味しかない
from句を重ねて使用するのが肝
from句を重ねて使用するのが肝
757デフォルトの名無しさん
2012/09/15(土) 10:41:08.80 LINQ便利だけど、ローカル変数検索なんかで使う場合だと、遅いんだよね。
そろそろCLがコンパイル済みの最終実行状態を出力してくれればいいのに。。
そろそろCLがコンパイル済みの最終実行状態を出力してくれればいいのに。。
758デフォルトの名無しさん
2012/09/15(土) 10:43:41.46759デフォルトの名無しさん
2012/09/15(土) 21:35:58.16 さっき勉強したんだがLinq気持ちよすぎ精子吹いたwwwだれかC++に移植してくれ
760デフォルトの名無しさん
2012/09/17(月) 14:19:32.69 c++でも使えるだろ
761デフォルトの名無しさん
2012/10/09(火) 17:16:21.87762デフォルトの名無しさん
2012/10/20(土) 04:17:21.52 where区で条件を動的にする方法はありませんか?
763デフォルトの名無しさん
2012/10/20(土) 09:53:53.12 >>762
(1)パラメータクエリで解決するケース
(2)さらに、and や or の条件が増えたり減ったりするなら、文字列をつぎはぎ
(3)実はSQL文で結合とかいろいろ熟練すれば解決するケース
のどれなんだろうな
(1)パラメータクエリで解決するケース
(2)さらに、and や or の条件が増えたり減ったりするなら、文字列をつぎはぎ
(3)実はSQL文で結合とかいろいろ熟練すれば解決するケース
のどれなんだろうな
764デフォルトの名無しさん
2012/10/20(土) 10:17:54.51 変数と変数の比較なら動的じゃないか。
765デフォルトの名無しさん
2012/10/20(土) 18:39:25.06 三項演算子使えばいけそうだな
766デフォルトの名無しさん
2012/10/20(土) 21:37:04.90 誰もが通るスパゲッティ率最高のSQL組立
767デフォルトの名無しさん
2013/02/01(金) 13:55:35.49 class Data {
public List<Item> Items = new Items();
}
List<Data> dat = new List<Data>();
// ↑のdatリストから各Itemsプロパティの中身を全て抜出し、
// 1次元配列として得るにはどうしたらいいでしょうか?
public List<Item> Items = new Items();
}
List<Data> dat = new List<Data>();
// ↑のdatリストから各Itemsプロパティの中身を全て抜出し、
// 1次元配列として得るにはどうしたらいいでしょうか?
768デフォルトの名無しさん
2013/02/01(金) 16:52:24.22769デフォルトの名無しさん
2013/02/01(金) 17:14:16.34770デフォルトの名無しさん
2013/03/30(土) 19:52:58.27 IEnumerableとかIQueryableとかって会話で使うとき
なんて発音してる?
遅延実行のナイスな活用例って
無限リストとか馬鹿でかいデーターソースしかないのかな
処理時間を確定させたくていつもToListしちゃう
なんて発音してる?
遅延実行のナイスな活用例って
無限リストとか馬鹿でかいデーターソースしかないのかな
処理時間を確定させたくていつもToListしちゃう
771デフォルトの名無しさん
2013/03/30(土) 21:04:48.54 アイエヌュムェラボー
アイクェリャボー
アイクェリャボー
772デフォルトの名無しさん
2013/04/01(月) 15:49:06.61 愛イニュメラブル
愛クエリアブル
愛クエリアブル
773デフォルトの名無しさん
2013/04/03(水) 23:53:18.12 アイナマーエーブル
イクォータブル
イクォータブル
774デフォルトの名無しさん
2013/04/04(木) 11:04:11.27 INumerable?
Equatable?
Equatable?
775デフォルトの名無しさん
2013/04/05(金) 01:05:00.06 from x in xvideos where x.tag.Contains("anal") select x; /* 夜プログラミング部 */
http://engawa.2ch.net/test/read.cgi/poverty/1365090013/
http://engawa.2ch.net/test/read.cgi/poverty/1365090013/
776デフォルトの名無しさん
2013/04/18(木) 11:29:49.06 エロい人おしえてくり。
string[] testdata = {"BT","SS","TB","MCQ","AABC","NT"};
string[] result = testdata.Where(p => p.Length == 2 ).ToArray();
だと
{"BT","SS","TB","NT"}
が帰ってくるのですが、中の順番が乱れることはないって保障されているのでしょうか?
保障されていないのなら元の順番をでSortすることは可能でしょうか?
string[] testdata = {"BT","SS","TB","MCQ","AABC","NT"};
string[] result = testdata.Where(p => p.Length == 2 ).ToArray();
だと
{"BT","SS","TB","NT"}
が帰ってくるのですが、中の順番が乱れることはないって保障されているのでしょうか?
保障されていないのなら元の順番をでSortすることは可能でしょうか?
777デフォルトの名無しさん
2013/04/18(木) 11:45:38.06 配列のイテレータは順番が保障されている。
Whereはフィルタだけで順番の変更はしない。
並べ替えたいならOrderBy
>...ata.Where(p => p.Length == 2).OrderBy(s => s).ToAr...
Whereはフィルタだけで順番の変更はしない。
並べ替えたいならOrderBy
>...ata.Where(p => p.Length == 2).OrderBy(s => s).ToAr...
778デフォルトの名無しさん
2013/04/22(月) 07:29:14.20 課題が解けずに困ってます。教えていただけませんか?
VBはスレ違いでしたらすいません。
スペースが文字化けしてしまうので-で代用しています。
Dim-;Inpdata,OutData-As-String
Dim-;RecordCnt-As-;Integer
Using-sr-As-;New-StreamReader(Text1,Shift_JIS),_
-sw-As-New-StreamWriter(Text2,Shift_JIS)
-Do-While ;Sr.Peek>=0
---RecordCnt=RecordCnt ;+ ;1
---OutData=;InpData
---sw.WriteLine(OutData)
Loop
上記コードについて以下のように処理するようコードを変更もしくは追加しなさい。
(変更or追加するところだけ教えてください)
1.変数InpDataの2桁目から4桁目の値に従い、文字属性の変数Age5に次の値を代入。
(000-004のとき01、005-009のとき02、010-014のとき03、015-019のとき04)
また出力ファイルの各レコードの末尾にAge5の値を付与して出力する。
2.変数InpDataの2桁目から4桁目の値が変数Ageと等しいレコードのレコード数(変数Cnt)をカウントする。
すべてのレコードについて処理が終了したら「該当レコード数/総レコード数」を画面に表示する。
VBはスレ違いでしたらすいません。
スペースが文字化けしてしまうので-で代用しています。
Dim-;Inpdata,OutData-As-String
Dim-;RecordCnt-As-;Integer
Using-sr-As-;New-StreamReader(Text1,Shift_JIS),_
-sw-As-New-StreamWriter(Text2,Shift_JIS)
-Do-While ;Sr.Peek>=0
---RecordCnt=RecordCnt ;+ ;1
---OutData=;InpData
---sw.WriteLine(OutData)
Loop
上記コードについて以下のように処理するようコードを変更もしくは追加しなさい。
(変更or追加するところだけ教えてください)
1.変数InpDataの2桁目から4桁目の値に従い、文字属性の変数Age5に次の値を代入。
(000-004のとき01、005-009のとき02、010-014のとき03、015-019のとき04)
また出力ファイルの各レコードの末尾にAge5の値を付与して出力する。
2.変数InpDataの2桁目から4桁目の値が変数Ageと等しいレコードのレコード数(変数Cnt)をカウントする。
すべてのレコードについて処理が終了したら「該当レコード数/総レコード数」を画面に表示する。
779デフォルトの名無しさん
2013/04/22(月) 08:27:19.55 Dim Inpdata, OutData As String
Dim RecordCnt As Integer
Using sr As New StreamReader(Text1, Shift_JIS), sw As New StreamWriter(Text2, Shift_JIS)
Do While sr.Peek >= 0
RecordCnt = RecordCnt + 1
OutData = InpData
sw.WriteLine(OutData)
Loop
Dim RecordCnt As Integer
Using sr As New StreamReader(Text1, Shift_JIS), sw As New StreamWriter(Text2, Shift_JIS)
Do While sr.Peek >= 0
RecordCnt = RecordCnt + 1
OutData = InpData
sw.WriteLine(OutData)
Loop
780デフォルトの名無しさん
2013/04/22(月) 08:47:25.25 LINQ関係ないな
あとinpdataが空っぽのままだ
あとinpdataが空っぽのままだ
781デフォルトの名無しさん
2013/05/09(木) 23:35:28.70782デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN linqは結局流行らなかったね
783デフォルトの名無しさん
2013/08/29(木) NY:AN:NY.AN784デフォルトの名無しさん
2013/09/04(水) 20:35:45.77 where節とかで何個溜まったらそこまでって出来ないのかな?
785デフォルトの名無しさん
2013/09/04(水) 21:03:51.88 ちょっと意味が分からんが
Takeのことか?
Takeのことか?
786デフォルトの名無しさん
2013/09/04(水) 21:05:58.53 TakeWhile使え
787デフォルトの名無しさん
2013/09/05(木) 22:02:37.88 ありがとうござます
そんな関数もあるのですね
enumerableのメンバ関数を勉強してみます
そんな関数もあるのですね
enumerableのメンバ関数を勉強してみます
788デフォルトの名無しさん
2013/11/15(金) 09:11:08.42 専門スレあったのか。遅すぎてみんな使わなくなったのかな?
789デフォルトの名無しさん
2013/11/15(金) 09:55:37.40 こんなところまで出張して煽りに来ないでいいからw
790デフォルトの名無しさん
2013/11/15(金) 10:01:34.65 1.保守性が低い
2.単体テストが困難
3.内部処理を理解してないと簡単に遅いコードになる
以下の理由から業務ではあまり好まれていないようです。
2.単体テストが困難
3.内部処理を理解してないと簡単に遅いコードになる
以下の理由から業務ではあまり好まれていないようです。
791デフォルトの名無しさん
2013/11/15(金) 10:05:58.44 COBOL出身者の多いところでは好まれるんじゃね?
792デフォルトの名無しさん
2013/11/15(金) 10:12:06.99 LINQは横糸の技術、技術横断的な仕組みだから
理解されづらいというのはあるのかな
理解されづらいというのはあるのかな
793デフォルトの名無しさん
2013/11/15(金) 10:15:57.73794デフォルトの名無しさん
2013/11/16(土) 01:12:17.77 Smalltalkで昔から出来てたことを今更か。
query := QueryForTables fromTables: { table1. table2 }.
timeTable := query do:
[ :method :row1 :row2 |
method
where:[ row1 interselected: row2 time ]
select:[ TimeSpan timeSpanName: row1 name time: row2 time ].
].
timeTable do:
[ :each |
Transcript show: each asString;cr.
].
query := QueryForTables fromTables: { table1. table2 }.
timeTable := query do:
[ :method :row1 :row2 |
method
where:[ row1 interselected: row2 time ]
select:[ TimeSpan timeSpanName: row1 name time: row2 time ].
].
timeTable do:
[ :each |
Transcript show: each asString;cr.
].
795デフォルトの名無しさん
2013/11/16(土) 07:35:26.52 だからsmalltalkは普及しかなったといえる。
796デフォルトの名無しさん
2013/11/18(月) 12:36:12.52 本山
柿谷
小笠原
中田
高橋
柿谷
小笠原
中田
高橋
797デフォルトの名無しさん
2013/11/19(火) 19:29:10.58 画像処理ってループとか抽出とか多いけどLINQとの相性はどうですか?
798デフォルトの名無しさん
2013/11/20(水) 18:13:13.38 しりません
尻屋
尻屋
799デフォルトの名無しさん
2013/11/20(水) 20:19:50.38 ダメダメ
800ぼえ
2013/11/20(水) 20:25:52.01 12月の渋谷でやすなりが暴れてもとめません。おさわりハグ必至yasunari_syyh
801さき
2013/12/05(木) 07:33:52.40 浮気もののドエムやすなり。ゆさに首しめてもらいな
802デフォルトの名無しさん
2013/12/17(火) 12:20:52.45 LINQ達人の皆さまに教えをいただきにまいりました。
List<DateTime>の要素の中に異なる月の日付が混入しているかどうか(年が同じなのは所与)を判定するのにいい方法はありませんでしょうか?
とりあえずは
Min().Month!=Max().Month
でいけるようなのですが要素の数が増えるとMinやMaxをつかうのはどうかなと思っています。
List<DateTime>の要素の中に異なる月の日付が混入しているかどうか(年が同じなのは所与)を判定するのにいい方法はありませんでしょうか?
とりあえずは
Min().Month!=Max().Month
でいけるようなのですが要素の数が増えるとMinやMaxをつかうのはどうかなと思っています。
803デフォルトの名無しさん
2013/12/17(火) 12:46:15.89 list.Any(_ => _.Month != list[0].Month)
listが空のケースがあるなら事前に弾いとく
listが空のケースがあるなら事前に弾いとく
804デフォルトの名無しさん
2013/12/17(火) 12:51:54.00 >>803
それ先頭が違う月だったらどうするのさ
それ先頭が違う月だったらどうするのさ
805デフォルトの名無しさん
2013/12/17(火) 12:53:09.61 ああ、違うのがあるかどうかだけでどれか特定しなくてもいいのか
806デフォルトの名無しさん
2013/12/17(火) 13:00:42.01807デフォルトの名無しさん
2013/12/17(火) 23:45:08.01 Linq超便利なのに実際の開発現場では直接DB参照できなくて使えない罠
しかし今時4.0使っときながらEFあるのにO/RMも使わずに汎用性のない独自マッピングをXMLに書くとか今の現場糞すぎるわwww
しかし今時4.0使っときながらEFあるのにO/RMも使わずに汎用性のない独自マッピングをXMLに書くとか今の現場糞すぎるわwww
808デフォルトの名無しさん
2013/12/18(水) 08:49:03.89 O/Rなにそれおいしいの?という現場もあるからまだましだよ
809デフォルトの名無しさん
2013/12/19(木) 09:57:31.91 LINQ to Entityは大して絶対的なもんじゃないだろ
独自XMLマッピングはないけど
独自XMLマッピングはないけど
810デフォルトの名無しさん
2013/12/19(木) 10:16:46.64 見事に使われなくなった悲しい技術。
811デフォルトの名無しさん
2013/12/19(木) 11:16:39.10 Entity FramworkをLinqなしで使うとなると、
Query Builderにご登場願わなくてはならないが、
正直あれはない・・・;
Query Builderにご登場願わなくてはならないが、
正直あれはない・・・;
812デフォルトの名無しさん
2013/12/19(木) 12:06:53.80813デフォルトの名無しさん
2013/12/19(木) 12:07:24.58 ×時期
○次期
○次期
814デフォルトの名無しさん
2013/12/19(木) 13:41:08.86 そもそも汎用性のない独自マッピングとか存在価値がわからない
DB覗いてテーブルとデータ把握しないといけないのにラップする意味ないだろ
DB覗いてテーブルとデータ把握しないといけないのにラップする意味ないだろ
815デフォルトの名無しさん
2013/12/19(木) 15:47:37.88 クエリ構文が要らんというなら分かる
816デフォルトの名無しさん
2013/12/19(木) 17:54:32.34 拡張メソッドがあればクエリ構文は不要。
そう思っていた時期が私にもありました。
そう思っていた時期が私にもありました。
817デフォルトの名無しさん
2013/12/19(木) 18:10:53.57 クエリ構文はキモい
拡張メソッドは正義
拡張メソッドは正義
818デフォルトの名無しさん
2013/12/19(木) 20:29:32.26 じゃあお前にクエリ構文で書かれたjoinを拡張メソッドに書き直す仕事をやろう
819デフォルトの名無しさん
2013/12/20(金) 15:34:34.73 クエリ構文もメソッド構文もキモくないけど
混ぜ書きがキモい
混ぜ書きがキモい
820デフォルトの名無しさん
2013/12/24(火) 19:27:31.94 しかしクエリ構文で何故selectを最初にしなかったんだろ
SQLと一緒にすればいいのに
SQLと一緒にすればいいのに
821デフォルトの名無しさん
2013/12/24(火) 19:29:25.67 インテリセンスが利かないから
822デフォルトの名無しさん
2013/12/27(金) 06:53:18.24 代々木
栃木
横浜湖
岐阜
兵庫
栃木
横浜湖
岐阜
兵庫
823デフォルトの名無しさん
2013/12/31(火) 20:57:12.59 もしかしてTableAdapterって製品版誘導のためのブラックボックスですか?
824デフォルトの名無しさん
2014/01/05(日) 07:29:28.09 にほんごでOK
825デフォルトの名無しさん
2014/01/07(火) 00:27:37.75 Entity FrameworkをSQLiteで使い始めたんだが、
カラムが文字列とか数値とか5個くらいのテーブルにテスト用として1行入れたデータを1行取り出す処理に1.4秒もかかるんだが・・・
どうなってるんだ?
Table per hierarchyの継承を使っているせいか?
var query = context.Superclass.OfType<Subclass>().Where( obj => obj.Id == 1);
foreach (Superclass obj in query)
{
Console.WriteLine(obj.Id);
}
Idプロパティはエンティティキー。
実行しなくてもデータがあれば、明らかに結果は「1」なのだが、これで1.4秒もかかってしまう。
ちなみにSubclassの判定には、あるBLOBのカラムがNULLでなければSubclassの行。
もちろん、
SELECT * FROM Superclasses WHERE Id = 1;
というSQLをsqlite3.exeというコマンドラインインターフェイスで投げると0.1秒もかからない。
実際に行いたい処理はこんなもんじゃなくて別のプロパティで検索してリレーションをたどるのだが、どれだけ条件を削っても遅くて・・・
カラムが文字列とか数値とか5個くらいのテーブルにテスト用として1行入れたデータを1行取り出す処理に1.4秒もかかるんだが・・・
どうなってるんだ?
Table per hierarchyの継承を使っているせいか?
var query = context.Superclass.OfType<Subclass>().Where( obj => obj.Id == 1);
foreach (Superclass obj in query)
{
Console.WriteLine(obj.Id);
}
Idプロパティはエンティティキー。
実行しなくてもデータがあれば、明らかに結果は「1」なのだが、これで1.4秒もかかってしまう。
ちなみにSubclassの判定には、あるBLOBのカラムがNULLでなければSubclassの行。
もちろん、
SELECT * FROM Superclasses WHERE Id = 1;
というSQLをsqlite3.exeというコマンドラインインターフェイスで投げると0.1秒もかからない。
実際に行いたい処理はこんなもんじゃなくて別のプロパティで検索してリレーションをたどるのだが、どれだけ条件を削っても遅くて・・・
826825
2014/01/07(火) 01:20:00.16 データベースファイルを作り直したところ、35ミリ秒程度に改善しました。
大変お騒がせしました。
大変お騒がせしました。
827デフォルトの名無しさん
2014/01/08(水) 08:49:14.97 EnumerableRowCollection<DataRow> query =
from row in contacts.AsEnumerable()
where IsContainArr(row[0].ToString(), fig)
select row;
の
bool IsContainArr(string s, string[] arr)
{
foreach (var a in arr)
{
if (!s.Contains(a)) return false;
}
return true;
}
って、メソッドで用意されてないんかな
from row in contacts.AsEnumerable()
where IsContainArr(row[0].ToString(), fig)
select row;
の
bool IsContainArr(string s, string[] arr)
{
foreach (var a in arr)
{
if (!s.Contains(a)) return false;
}
return true;
}
って、メソッドで用意されてないんかな
828デフォルトの名無しさん
2014/01/08(水) 22:37:35.19 Any All
829デフォルトの名無しさん
2014/01/12(日) 08:32:51.26 AND 演算子を LINQ サブクエリに結果が表示されますなし
http://ja.softuses.com/98912
http://ja.softuses.com/98912
830デフォルトの名無しさん
2014/01/13(月) 21:22:32.83 ORとか多次元配列は拡張メソッドを使うしかないな
831デフォルトの名無しさん
2014/02/25(火) 07:18:07.32 AndとOrって全部AndAlsoとOrElseに書き換えて大丈夫なの?
あとWhereで「A == B」と「A Equals B」の違いってなんなの?
あとWhereで「A == B」と「A Equals B」の違いってなんなの?
832デフォルトの名無しさん
2014/02/25(火) 21:01:27.85 大丈夫じゃない可能性はあるが
VBのAndとOrはビット演算以外ではもはや不要
置換してしまえ
VBのAndとOrはビット演算以外ではもはや不要
置換してしまえ
833デフォルトの名無しさん
2014/02/25(火) 21:22:16.17 値型の配列はIEnumerable<object>にキャストできない。
かといってIEnumerableだとLINQに流し込めなくてめんどくさい…。
どうしようかと悩んだ末にこうなった。
var obj = new[] { 1, 2, 3 };
var q = from object x in (IEnumerable)obj select x.ToString();
型指定してやればいけるんだね。
かといってIEnumerableだとLINQに流し込めなくてめんどくさい…。
どうしようかと悩んだ末にこうなった。
var obj = new[] { 1, 2, 3 };
var q = from object x in (IEnumerable)obj select x.ToString();
型指定してやればいけるんだね。
834デフォルトの名無しさん
2014/02/25(火) 21:27:32.63 >>831
ここはLINQスレなんでできればVB.NETのスレで聞いたほうが確実な回答を得られると思うよ。
And/Orのあとに副作用(グローバルな変数やDBの書き換えetc)のある関数の呼び出しをしていないのなら全置換しちまえ
Equalsの件はdobonなサイトで調べるがよろしいかと。
http://dobon.net/vb/dotnet/beginner/equality.html
ここはLINQスレなんでできればVB.NETのスレで聞いたほうが確実な回答を得られると思うよ。
And/Orのあとに副作用(グローバルな変数やDBの書き換えetc)のある関数の呼び出しをしていないのなら全置換しちまえ
Equalsの件はdobonなサイトで調べるがよろしいかと。
http://dobon.net/vb/dotnet/beginner/equality.html
835デフォルトの名無しさん
2014/02/25(火) 21:44:04.83 >>833
obj.Cast<object>()とかでいいんじゃね?
obj.Cast<object>()とかでいいんじゃね?
836831
2014/02/25(火) 22:37:27.65837デフォルトの名無しさん
2014/02/26(水) 03:55:31.47 >>835
IEnumerableにCastあったのか。
無いと思い込んでたよ…。
クエリ式でキャストできるのも知らなかったから、全くの無駄足ではなかったけど凹む。
var obj = (object)new[] { 1, 2, 3 };
var q = from int x in (IEnumerable)obj select x.ToString();
IEnumerableにCastあったのか。
無いと思い込んでたよ…。
クエリ式でキャストできるのも知らなかったから、全くの無駄足ではなかったけど凹む。
var obj = (object)new[] { 1, 2, 3 };
var q = from int x in (IEnumerable)obj select x.ToString();
838デフォルトの名無しさん
2014/02/26(水) 11:22:47.19 LINQ to EntityだとOrとOrElseとかは等価なんだろうな
839デフォルトの名無しさん
2014/02/27(木) 21:15:09.47 ■データセットAの内容
c1 c2 c3 c4
01 01 01 AA
01 01 02 BB
01 02 02 CC
02 02 02 DD
■データセットBの内容
c1 c2 c3 c4
01 01 02 sss
01 02 02 ttt
上のようなデータセットA・Bを列c1・c2・c3で結びつけた場合に
データセットAのみに存在するデータを取得するには
どのようなLINQを記述すればよいのでしょうか?
つまり下の結果を得たいのですが、お手上げ状態です…
■結果
c1 c2 c3 c4
01 01 01 AA
02 02 02 DD
c1 c2 c3 c4
01 01 01 AA
01 01 02 BB
01 02 02 CC
02 02 02 DD
■データセットBの内容
c1 c2 c3 c4
01 01 02 sss
01 02 02 ttt
上のようなデータセットA・Bを列c1・c2・c3で結びつけた場合に
データセットAのみに存在するデータを取得するには
どのようなLINQを記述すればよいのでしょうか?
つまり下の結果を得たいのですが、お手上げ状態です…
■結果
c1 c2 c3 c4
01 01 01 AA
02 02 02 DD
840デフォルトの名無しさん
2014/02/27(木) 22:04:56.98 >>839
ExceptとIEqualityComparer
ExceptとIEqualityComparer
841デフォルトの名無しさん
2014/02/28(金) 07:34:04.60 >>839
手元に開発環境がないので想像で書いてみた。
こんなんで動くかどうか?
DataSetA.AsEnumerable().Where(p => !DataSetB.AsEnumerable().Any(q => p["c1"] == q["c1"] && p["c2"] == q["c2"] && p["c3"] == q["c3"]))
手元に開発環境がないので想像で書いてみた。
こんなんで動くかどうか?
DataSetA.AsEnumerable().Where(p => !DataSetB.AsEnumerable().Any(q => p["c1"] == q["c1"] && p["c2"] == q["c2"] && p["c3"] == q["c3"]))
842デフォルトの名無しさん
2014/02/28(金) 09:32:52.42 LINQとは関係ないけど、データが入ってるのはDataSetじゃなくてDataTableじゃね?
843デフォルトの名無しさん
2014/03/02(日) 01:29:42.61 VS2010 ExpressでもLINQって使うこと出来ますか?
844デフォルトの名無しさん
2014/03/02(日) 10:37:45.85 使える
845デフォルトの名無しさん
2014/03/03(月) 04:06:49.30 >>841
こんな見ただけでダメそうなLINQはそうみない
こんな見ただけでダメそうなLINQはそうみない
846デフォルトの名無しさん
2014/03/18(火) 19:59:38.45ID:KuFpHuZU LINQで二重ループってどうやるの
847デフォルトの名無しさん
2014/03/18(火) 20:28:03.79ID:fyZmNFyl 抽象的すぎるが
SelectManyとかfrom ... from ... とかか?
SelectManyとかfrom ... from ... とかか?
848デフォルトの名無しさん
2014/03/18(火) 21:59:24.11ID:t6+ilvFS >>846
今のところ拡張メソッドを使うのが一番すっきりする
今のところ拡張メソッドを使うのが一番すっきりする
849デフォルトの名無しさん
2014/06/24(火) 21:43:22.43ID:auzJY4V3 LinQ瑞稀もえ、契約解除で脱退
http://headlines.yahoo.co.jp/hl?a=20140624-00000026-nksports-ent
http://headlines.yahoo.co.jp/hl?a=20140624-00000026-nksports-ent
850デフォルトの名無しさん
2014/09/29(月) 13:43:24.17ID:WJqfJJMH クエリ式とメソッド式どっちが多いの?
DB苦手でメソッド式なら手続っぽくて難無く書けるんだがクエリ式はSQLに脳内変換しないと書けなくイライラするんだよね
DB苦手でメソッド式なら手続っぽくて難無く書けるんだがクエリ式はSQLに脳内変換しないと書けなくイライラするんだよね
851デフォルトの名無しさん
2014/09/29(月) 14:13:48.21ID:LeZLkHlG クエリ式はPro*Cっぽくて好き
852デフォルトの名無しさん
2014/09/29(月) 14:45:40.59ID:AA4yap2H メソッドの方が一行プログラムみたいで好き
他のメソッドをあれだけ続けたら普通怒られるのにLINQだと怒られないから好き
他のメソッドをあれだけ続けたら普通怒られるのにLINQだと怒られないから好き
853デフォルトの名無しさん
2014/09/29(月) 20:06:06.06ID:GUUpSYqu SQLと同じ単語使いながらも文法違うのがきついので専らメソッドです
854デフォルトの名無しさん
2014/09/29(月) 21:44:36.61ID:rcWkwNUG コンパイルで結局メソッド式に変換されるし
クエリ式で出来ないメソッドもあるし
他の部分のコードと見た目が変わるし
SQLと順序が違うからメソッド式だな
クエリ式で出来ないメソッドもあるし
他の部分のコードと見た目が変わるし
SQLと順序が違うからメソッド式だな
855デフォルトの名無しさん
2014/09/29(月) 22:49:21.60ID:UhIIV3Gj fromが2つ以上出てくるときはクエリ式かな
SelectManyはめんどい
SelectManyはめんどい
856デフォルトの名無しさん
2014/10/05(日) 19:55:39.42ID:2wdLebDo SQLならなんとか基本を覚えたけどLINQとかXMLってめんどうなら覚えなくても生きていけるんでしょ?
857デフォルトの名無しさん
2014/10/05(日) 21:49:59.61ID:ecfyL29T 別にSQL覚えなくても生きる世界を選べば生きていけるよ
858デフォルトの名無しさん
2014/10/05(日) 21:59:45.14ID:FUXuY2e6 このスレの最初の方見れば、覚えるのと覚えずにいるのとどちらが面倒か判ると思うんだが
859デフォルトの名無しさん
2014/10/05(日) 22:26:58.92ID:IdZmMisI やはり普及しなかったか。
860デフォルトの名無しさん
2014/10/11(土) 21:04:00.40ID:GwKKohNt Java8でStramAPI導入されたし、今後増えてくんじゃね。
個人的には今の時点でも普及してると思うけど。
個人的には今の時点でも普及してると思うけど。
861デフォルトの名無しさん
2014/10/14(火) 07:44:14.82ID:wStWNn2s もうLINQ知らんVB厨でも知らずに呼び出してそうだが
862デフォルトの名無しさん
2014/10/14(火) 21:09:42.81ID:Qn24ycet ForEachとかParallel.Forとか
高度なことを簡単に書けるから凄いよな。
入社して既存ソース見てへーと思って
バンバン使ってる若い人とか多そう
高度なことを簡単に書けるから凄いよな。
入社して既存ソース見てへーと思って
バンバン使ってる若い人とか多そう
863デフォルトの名無しさん
2014/10/15(水) 12:40:46.07ID:N3j8OVMy 屁ぇとも思わない
864デフォルトの名無しさん
2014/10/15(水) 13:09:50.89ID:SsPXo7Vr Rxなんかは初めての人は戸惑うだろうけど
LINQは拡張メソッドで逐次処理してるだけで難しい所なんてないだろ…。
LINQは拡張メソッドで逐次処理してるだけで難しい所なんてないだろ…。
865デフォルトの名無しさん
2014/10/15(水) 19:34:24.02ID:BXVP11cM それが未だにラムダ式の記述とかに嫌悪感示す人多いんだな・・・
この記事見て段階的に覚えるのも手だと思うんだが、結果一緒なら別に良いって人相手にはどうもにならん
http://www.atmarkit.co.jp/fdotnet/chushin/roadtolinq_01/roadtolinq_01_02.html
この記事見て段階的に覚えるのも手だと思うんだが、結果一緒なら別に良いって人相手にはどうもにならん
http://www.atmarkit.co.jp/fdotnet/chushin/roadtolinq_01/roadtolinq_01_02.html
866デフォルトの名無しさん
2014/10/15(水) 20:11:42.55ID:+Cxhex9V 大手SIer()とかでラムダ式禁止ってコーディング規約が出てくるのはむしろこれからが本番。
867デフォルトの名無しさん
2014/10/15(水) 20:24:32.94ID:hrBmyTxM そういう奴等が死に絶えるまで、どうやって生き延びるかだよなw
868デフォルトの名無しさん
2014/10/16(木) 13:52:30.47ID:6vjTSFjE ポインタが理解できずにCから逃げたコボラーとか実際に存在するから
Linq程度が理解できなくても不思議じゃないわ
Linq程度が理解できなくても不思議じゃないわ
869デフォルトの名無しさん
2014/10/16(木) 19:39:02.40ID:i0dYtbuj 保守、テストに向かないラムダ式が業務コードに採用されることはない。
採用okした馬鹿SEがいたら初めから保守する気がないやっつけプロジェクトだと客は思え。
採用okした馬鹿SEがいたら初めから保守する気がないやっつけプロジェクトだと客は思え。
870デフォルトの名無しさん
2014/10/16(木) 20:34:37.25ID:6YdcwtfE 保守、テストに向く向かないの基準は?
871デフォルトの名無しさん
2014/10/16(木) 21:13:46.98ID:i0dYtbuj 当然予算である。分りきったこと。
872デフォルトの名無しさん
2014/10/16(木) 21:22:34.15ID:6YdcwtfE お前の言ってること理解するの無理そうだわ
873デフォルトの名無しさん
2014/10/16(木) 21:26:50.67ID:i0dYtbuj おまえがPMになる頃に分るよ。LINQ?ないでしょ!!と言うようになる。
874デフォルトの名無しさん
2014/10/16(木) 21:32:16.90ID:6YdcwtfE PMってアスペでもできるんだ…
875デフォルトの名無しさん
2014/10/16(木) 21:33:13.95ID:JIq8zDai 相手を納得させる説明ができない場合、相手の理解能力の不足へと責任を転嫁します
876デフォルトの名無しさん
2014/10/16(木) 21:44:06.18ID:i0dYtbuj >>874
ほんとアスペ連呼厨はアスペはだったな。じゃあ予算以外に何の基準あると言うの?
何の説明もなしに理解できない連呼して突然に脈絡もなくアスペとか言われてもな意味不明。
それとも基準と言ってるのはもしかして、
LINQが保守しにくいという理由が分らないという素人PGレベルの話?w
さすがにそれはこっちも想定外。相手は素人の客ではなくPGだと思って話しているから。ブログラム板だし。
ほんとアスペ連呼厨はアスペはだったな。じゃあ予算以外に何の基準あると言うの?
何の説明もなしに理解できない連呼して突然に脈絡もなくアスペとか言われてもな意味不明。
それとも基準と言ってるのはもしかして、
LINQが保守しにくいという理由が分らないという素人PGレベルの話?w
さすがにそれはこっちも想定外。相手は素人の客ではなくPGだと思って話しているから。ブログラム板だし。
877デフォルトの名無しさん
2014/10/16(木) 22:54:35.36ID:6YdcwtfE プログラム板だから技術的な観点から保守・テストの向き不向きを聞いたつもりだったんだが、唐突に予算の話だからさっぱりだったんだ…
聞き方が悪かったな
聞き方が悪かったな
878デフォルトの名無しさん
2014/10/16(木) 23:18:46.93ID:/G2R7ViG879デフォルトの名無しさん
2014/10/17(金) 01:41:05.30ID:jEl4dhul プログラム技術の板なのになんでいきなりプログラム技術のレイヤーすっ飛ばして予算がどうこう言い出すんだ
いずれにしろ「分かりきった事だ」しか言ってないし
いずれにしろ「分かりきった事だ」しか言ってないし
880デフォルトの名無しさん
2014/10/17(金) 01:43:38.66ID:KUlLf+fJ LINQが分かる保守要員は単価が高いとか
881デフォルトの名無しさん
2014/10/17(金) 04:18:11.25ID:y4CtUirl 多少単価が上がっても、それを上回る生産性があればペイするわけで
規模も生産性も無視して予算って言われてもなぁ
まともなマネージャーの発言とは思えん
まあ俺がプログラマなら、クエリ式はともかく今時メソッド式すら禁止でプログラム組みたくないが
規模も生産性も無視して予算って言われてもなぁ
まともなマネージャーの発言とは思えん
まあ俺がプログラマなら、クエリ式はともかく今時メソッド式すら禁止でプログラム組みたくないが
882デフォルトの名無しさん
2014/10/17(金) 06:28:12.62ID:BQDquYYG883デフォルトの名無しさん
2014/10/17(金) 09:09:57.62ID:O3Ha9Xaq 他に誰も読めないからC言語禁止、BASICで書け、とか言って滅んでいった馬鹿が
たくさんいたわけだが、滅んでいった奴のことは誰も覚えてないから、あとからあとから
同じような馬鹿は居るわけだよなw
たくさんいたわけだが、滅んでいった奴のことは誰も覚えてないから、あとからあとから
同じような馬鹿は居るわけだよなw
884デフォルトの名無しさん
2014/10/17(金) 11:26:54.10ID:ztI0lRaF 適切な粒度のLINQが一番保守しやすい。
でもLINQで複雑なの組むと保守し辛いのには同意する。
かと言って何重にもネストしたforeachの保守性が優れているかって言うとそうでもないしなー。
チーム開発では、副作用あるようなのはforeachに任せて、LINQではデータの抽出に専念するみたいな何らかの指標は必要だと思う。
「馬鹿には扱えないから禁止な!」って言われるような地獄じゃなかった事を心底嬉しく思うわ…そういう環境の人はご愁傷様。
でもLINQで複雑なの組むと保守し辛いのには同意する。
かと言って何重にもネストしたforeachの保守性が優れているかって言うとそうでもないしなー。
チーム開発では、副作用あるようなのはforeachに任せて、LINQではデータの抽出に専念するみたいな何らかの指標は必要だと思う。
「馬鹿には扱えないから禁止な!」って言われるような地獄じゃなかった事を心底嬉しく思うわ…そういう環境の人はご愁傷様。
885デフォルトの名無しさん
2014/10/18(土) 08:25:15.69ID:N4WCWzJQ COBOLのプロジェクトに必ずいるよな。Perlでいいじゃんという馬鹿が。
886デフォルトの名無しさん
2014/10/18(土) 10:47:32.67ID:z8db1sck887デフォルトの名無しさん
2014/10/19(日) 06:28:27.49ID:Ug95Fahb >>886
何それ?と思ってググってきた。
http://gushwell.ldblog.jp/archives/52257023.html
痒いところに手が届く感じが嬉しいな。
この中のいくつかは自分で似たようなの作って使ってたわ
何それ?と思ってググってきた。
http://gushwell.ldblog.jp/archives/52257023.html
痒いところに手が届く感じが嬉しいな。
この中のいくつかは自分で似たようなの作って使ってたわ
888デフォルトの名無しさん
2014/10/19(日) 13:32:20.74ID:fmyCWKK2 ラムダ式禁止ってLINQのIEnumerableな拡張メソッドまでならいいのか?
889デフォルトの名無しさん
2014/10/19(日) 14:47:06.09ID:TzxHDjoa 昔懐かしき匿名デリゲート使えばいいとかご苦労さんだよな
int[] arr = { -3, -2, -1, 0, 1, 2, 3 };
var e = arr.Where( delegate( int n ){ return n < 0; } );
int[] arr = { -3, -2, -1, 0, 1, 2, 3 };
var e = arr.Where( delegate( int n ){ return n < 0; } );
890デフォルトの名無しさん
2014/10/19(日) 14:51:24.13ID:OT6uOxYP891デフォルトの名無しさん
2014/10/19(日) 17:46:05.17ID:Ug95Fahb var arr = { -3, -2, -1, 0, 1, 2, 3 };
foreach (var item in arr.Where( x => x < 0 ))
arrをvarにしてラムダ式の()とreturn省略してforeachに突っ込んだら発狂して死ぬんじゃなかろうか?
foreach (var item in arr.Where( x => x < 0 ))
arrをvarにしてラムダ式の()とreturn省略してforeachに突っ込んだら発狂して死ぬんじゃなかろうか?
892デフォルトの名無しさん
2014/10/20(月) 00:00:11.38ID:sNo35b4/ >>887
準公式でForEachが定義されているだけでも使う価値がありますわ
準公式でForEachが定義されているだけでも使う価値がありますわ
893デフォルトの名無しさん
2014/10/20(月) 02:40:31.01ID:dDC6hlm3 このスレはオワコン臭が半端ねーな。
894デフォルトの名無しさん
2014/10/20(月) 10:59:30.63ID:grN5nCeO 出たばっかりの2008年当時は、皆手探りで専用スレに情報を集約する必要があったけど
今では.NET開発者の間に根付いて、初心者質問スレで普通にやり取りされるようになってるからね。
LINQ専用スレは役目を終えた感がある。
今では.NET開発者の間に根付いて、初心者質問スレで普通にやり取りされるようになってるからね。
LINQ専用スレは役目を終えた感がある。
895デフォルトの名無しさん
2014/11/07(金) 19:33:17.04ID:Uqmk+GoL LINQの大冒険てなに?
896デフォルトの名無しさん
2014/11/08(土) 05:44:51.34ID:4oPVaJN5 リンクの冒険ならゼルダの伝説2作目
897デフォルトの名無しさん
2014/11/08(土) 06:09:31.24ID:/bwN1tJ/ 最初のころ友人に「リンク?リンキューって読むんだよ」って教えられて信じた俺は負け組
898デフォルトの名無しさん
2014/11/08(土) 14:37:10.40ID:6TnQOBwl >>897
おれなんかラインキュー?だったぞw
おれなんかラインキュー?だったぞw
899デフォルトの名無しさん
2014/11/08(土) 15:44:34.92ID:tdIoNnK+ LINQってどう使うんだろうと思ってたけど、
使い方が解ると糞便利過ぎて吹いた。
使い方が解ると糞便利過ぎて吹いた。
900デフォルトの名無しさん
2014/11/08(土) 16:14:34.06ID:SdfgCKME linqとかgenericとかそんなもん覚えて
嬉しそうに使っている奴らは馬鹿じゃあ
ないかと思う。俺みたいなレベルになると
そんなもんは使わない。何故なら難しいから。
嬉しそうに使っている奴らは馬鹿じゃあ
ないかと思う。俺みたいなレベルになると
そんなもんは使わない。何故なら難しいから。
901デフォルトの名無しさん
2014/12/28(日) 13:29:00.59ID:u+9X44C3 つまんね
11点
11点
902デフォルトの名無しさん
2015/02/01(日) 01:19:30.25ID:h1yaZPC8 でる でる
でる でる
でる でる
903デフォルトの名無しさん
2015/02/10(火) 19:06:51.43ID:8+t6RdsT なんだこれPLINQで何がどう並列化されるか理解してない典型じゃん…
ttp://www.atmarkit.co.jp/fdotnet/csharp4/csharp4_03/csharp4_03_03.html
ttp://www.atmarkit.co.jp/fdotnet/csharp4/csharp4_03/csharp4_03_03.html
904デフォルトの名無しさん
2015/02/12(木) 11:54:05.46ID:RvtVdJIV PLINQは「C#によるマルチコアのための非同期/並列処理プログラミング」を読んで理解した
他にも多数
他にも多数
905デフォルトの名無しさん
2015/02/14(土) 13:20:03.23ID:+2HgOaot906デフォルトの名無しさん
2015/07/02(木) 08:51:48.28ID:D2cUXZKe >>903
この人内容もさることながら毎回オーバーな言い回しが好きだよね。もっと淡々と書いてほしい。
この人内容もさることながら毎回オーバーな言い回しが好きだよね。もっと淡々と書いてほしい。
907デフォルトの名無しさん
2015/07/23(木) 13:28:14.95ID:8sgAL201 LINQ初心者なんですが、JOIN ON の後に固定文字の条件(o.type_flg Equals "1")を追加したいのですが、
以下の様に書くとエラーになります。
どの様に書けば良いか教えて頂けないでしょうか?
From l In db.table_sub _
Join m In db.table_hist.DefaultIfEmpty On l.cd Equals m.cd _
Join n In db.table_type.DefaultIfEmpty On m.cd_type Equals n.cd_type _
Join o In db.table_jobtype.DefaultIfEmpty On m.cd Equals o.cd And _
m.startdate Equals o.startdate And o.type_flg Equals "1" _ ←"1"この部分
Join p In db.table_office On m.officeid Equals p.officeid _
Where _
l.officeid = pofficeid(cnt) And _
l.startdate <= pDate And _
l.enddate > pDate
以下の様に書くとエラーになります。
どの様に書けば良いか教えて頂けないでしょうか?
From l In db.table_sub _
Join m In db.table_hist.DefaultIfEmpty On l.cd Equals m.cd _
Join n In db.table_type.DefaultIfEmpty On m.cd_type Equals n.cd_type _
Join o In db.table_jobtype.DefaultIfEmpty On m.cd Equals o.cd And _
m.startdate Equals o.startdate And o.type_flg Equals "1" _ ←"1"この部分
Join p In db.table_office On m.officeid Equals p.officeid _
Where _
l.officeid = pofficeid(cnt) And _
l.startdate <= pDate And _
l.enddate > pDate
908デフォルトの名無しさん
2015/07/23(木) 19:33:32.73ID:lwPsZC44 メソッドチェイン以外は分りかねます
909デフォルトの名無しさん
2015/07/23(木) 20:03:25.61ID:Lq9yJ8hV クエリ構文は拒否反応が出てしまう
910デフォルトの名無しさん
2015/07/23(木) 20:28:21.62ID:7HbY3dvy 俺ゃVBに虫酸が走るんだがそれはともかく
JOINの意味分かってっか?
2つのテーブルをお互いの同じ値の列で結合するものだぞ
定数とどうやって結合すんだよ
そういう時はサブクエリ使え
JOINの意味分かってっか?
2つのテーブルをお互いの同じ値の列で結合するものだぞ
定数とどうやって結合すんだよ
そういう時はサブクエリ使え
911デフォルトの名無しさん
2015/07/23(木) 20:54:22.15ID:8sgAL201 ありがとうございます。
試してみます。
試してみます。
912デフォルトの名無しさん
2015/08/02(日) 21:53:38.84ID:wrwHaPDN VB.NETとかダセーもんで
LINQを使おうって発想が凄いな。
LINQを使おうって発想が凄いな。
913デフォルトの名無しさん
2015/08/03(月) 06:58:51.39ID:gHG/w8Da >>912
それで夏休みの宿題はC#にしたのか
それで夏休みの宿題はC#にしたのか
914デフォルトの名無しさん
2015/12/03(木) 01:30:32.82ID:R7RcesKX しばらく.Netから離れてたけどこんなものができてたのか
これはSQLに慣れてる人ならいいけど、文字列クエリーではなく
複数の言語が生で書かれてるソースなんか見たら
初心者にはまったく意味が分からず憤死しそうだな
これはSQLに慣れてる人ならいいけど、文字列クエリーではなく
複数の言語が生で書かれてるソースなんか見たら
初心者にはまったく意味が分からず憤死しそうだな
915デフォルトの名無しさん
2015/12/12(土) 01:59:59.54ID:DzcDIrny すーーぐSQLと同じだと思う輩わくよな
メソッド式で覚えろや
mapやfilterも無い言語やってましたってバレバレだぞ
メソッド式で覚えろや
mapやfilterも無い言語やってましたってバレバレだぞ
916デフォルトの名無しさん
2015/12/12(土) 16:59:58.44ID:5wAisFzW データ型がDBに依存しないSQL風インターフェースってだけやで
こんなの業務では怖くて使えんだろう
こんなの業務では怖くて使えんだろう
917デフォルトの名無しさん
2016/03/22(火) 00:38:41.34ID:b9snC88Q >>916
うわ…
うわ…
918デフォルトの名無しさん
2016/03/22(火) 06:20:38.49ID:2k6rwd23 私の年収低すぎ…?
919デフォルトの名無しさん
2016/04/03(日) 00:17:32.34ID:AE7hevoP 上杉謙信:「うわ・・・私の名前・・・うえすぎ・・・」
920デフォルトの名無しさん
2016/04/03(日) 01:07:42.06ID:Nd9Yarcw >>916
いまだにこんなやついるんだな
いまだにこんなやついるんだな
921デフォルトの名無しさん
2016/04/03(日) 21:14:37.69ID:Idd70VLN WPF同様、普及に失敗したのは紛れもない事実。
922デフォルトの名無しさん
2016/04/03(日) 22:32:25.91ID:Nd9Yarcw >>921
何が?
何が?
923デフォルトの名無しさん
2016/04/04(月) 03:30:04.72ID:yiUZrBzl >>921
普及に失敗したんじゃなくてお前みたいな頭の固い奴に理解できないだけの話
普及に失敗したんじゃなくてお前みたいな頭の固い奴に理解できないだけの話
924デフォルトの名無しさん
2016/04/04(月) 18:28:45.10ID:49o5DZm/ >>921
ここでは触れてはいけいなことをw 馬鹿が発狂するだろw
ここでは触れてはいけいなことをw 馬鹿が発狂するだろw
925デフォルトの名無しさん
2016/04/04(月) 19:40:00.45ID:jTJ+Sr63 >>924
日本語www
日本語www
926デフォルトの名無しさん
2016/06/24(金) 12:23:58.14ID:g5yuDP9p 普及したかどうかはどうでもいい
便利なことに変わりはない
便利なことに変わりはない
927デフォルトの名無しさん
2016/10/08(土) 09:23:14.30ID:vL+1Z5yj MSは、クエリ式とVB.NETを、そろそろ整理して良いんじゃね?
役目は果たしたよ。
役目は果たしたよ。
928デフォルトの名無しさん
2016/10/10(月) 16:21:53.01ID:tK6m98b5 何回何回負けたって〜
まだ夢の途中〜
生まれ育った地元のために
歌って歌って踊るんだ
イエィ!
まだ夢の途中〜
生まれ育った地元のために
歌って歌って踊るんだ
イエィ!
929デフォルトの名無しさん
2016/10/24(月) 04:53:33.41ID:tBsMM9XP LINQに書き換えるとすげー遅くなるな。foreachにif分のほうが全然速い。
930デフォルトの名無しさん
2016/10/24(月) 23:06:14.75ID:bra729J0 かわりにすげー早く書けるからいいじゃん
931デフォルトの名無しさん
2016/10/27(木) 00:34:11.36ID:VLwewB4m 実行速度よりも実装速度のほうが多くの場合大事だもんね
富豪的プログラミングしよう
速度向上は執事に任せればよい
富豪的プログラミングしよう
速度向上は執事に任せればよい
932デフォルトの名無しさん
2016/10/27(木) 00:52:45.70ID:o19fKtn+ 実行速度とか実装工数なんかどうでもいい
単純に保守の楽な方がいい
単純に保守の楽な方がいい
933デフォルトの名無しさん
2016/10/29(土) 06:52:22.29ID:OuiJcyYe それが普及失敗の原因か・・・
934デフォルトの名無しさん
2016/10/29(土) 10:20:51.57ID:dpmyBZLi linqは保守もしやすい
ループ構造は間違えやすいしなにをやってるかわかりにくい
Linqなら上から順に読んだ通りに動くから理解が簡単
ループ構造は間違えやすいしなにをやってるかわかりにくい
Linqなら上から順に読んだ通りに動くから理解が簡単
935デフォルトの名無しさん
2016/11/01(火) 04:46:14.83ID:rs3aEitj 保守ができないから採用されないわけで
936デフォルトの名無しさん
2016/11/02(水) 02:24:52.83ID:mhG4I3n/ 普及に失敗したんじゃなくてお前みたいな頭の固い奴に理解できないだけの話(キリ
937デフォルトの名無しさん
2016/11/02(水) 05:47:13.45ID:TUD+TNMg 実際の話、C#使っててSystem.LinqとかSystem.Xml.Linq名前空間が使われてない開発現場なんてあるの?
938デフォルトの名無しさん
2016/11/02(水) 08:48:47.99ID:t5KdzDu6 日本は2.0以前に書かれたクソシステムが現役で稼働してるIT後進国だしそりゃあるだろ
939デフォルトの名無しさん
2016/11/03(木) 02:34:33.00ID:iotxcKjl 糞遅くて禁止された。2.0コード速すぎ。
940デフォルトの名無しさん
2016/11/04(金) 06:07:35.20ID:ELmvCmHq LINQ使いは自称レベルが高い。
941デフォルトの名無しさん
2016/11/05(土) 12:27:36.93ID:z/qQe3IW 別にレベル高くねーよ
文法が新しくて理解できない老害がブーブー行ってるだけだ
LINQのメソッドについて個々に勉強すればすぐに理解できるのに
それを怠って文句言ってるだけ
文法が新しくて理解できない老害がブーブー行ってるだけだ
LINQのメソッドについて個々に勉強すればすぐに理解できるのに
それを怠って文句言ってるだけ
942デフォルトの名無しさん
2016/11/05(土) 12:43:33.36ID:PXYcOtjJ Linq否定派なんて存在しなく否定派を語る連中はただスレに活気を呼び込みたいだけの愉快犯ということはわかってる
943デフォルトの名無しさん
2016/11/08(火) 07:12:19.04ID:vur9C45Y List<string> strList
があって、それを10個ごとの部分に分けて
List<List<string>> にするLINQを教えてくれ。
があって、それを10個ごとの部分に分けて
List<List<string>> にするLINQを教えてくれ。
944デフォルトの名無しさん
2016/11/08(火) 20:19:21.57ID:t3tssHtU s.Buffer(10).Select(x => x.ToList()).ToList()
945デフォルトの名無しさん
2016/11/09(水) 03:54:58.44ID:A4E1noEd サンキュウ。
でも
List<string>にBuffer(10)は使えなかった。
でも
List<string>にBuffer(10)は使えなかった。
946デフォルトの名無しさん
2016/11/13(日) 10:01:09.04ID:sNDrzqcx LINQでZIPファイルのサーチをするにはどうしたらいいんだ? ファイル名だけ
でいいんだけど。
でいいんだけど。
947デフォルトの名無しさん
2016/11/13(日) 11:53:01.79ID:y11O8OBy ファイルの配列をListにしてWhereとか?
でもLinq使う必要ない気がするが?
でもLinq使う必要ない気がするが?
948デフォルトの名無しさん
2016/11/13(日) 12:17:11.01ID:sNDrzqcx あっすまん。でけた。Compressionでできるよ。
意味あるとおもうよ。大量にめもりーがいるのに配列にいれると意味ないでしょ。
せっかくLINQつかうんだから。
意味あるとおもうよ。大量にめもりーがいるのに配列にいれると意味ないでしょ。
せっかくLINQつかうんだから。
949デフォルトの名無しさん
2016/11/13(日) 12:43:52.51ID:sNDrzqcx >66
>LINQとSQLの違いのひとつにプランナの有無がある。
>LINQは処理順に書かなくてはならないし、必ず記述順で処理される。
>LINQはSQLの類似品と考えるより、
>Enumeratorやコールバック(ラムダ)を使ったパイプライン処理であり
>コレクション処理の延長だと思ったほうが誤解がない。
俺もこの理解なのだが、
LINQでDBをアクセスした場合どうなるの? パーフォーマンスは無茶苦茶落ちるって
こと? シーケンシャルに処理してるだけだものな。
>LINQとSQLの違いのひとつにプランナの有無がある。
>LINQは処理順に書かなくてはならないし、必ず記述順で処理される。
>LINQはSQLの類似品と考えるより、
>Enumeratorやコールバック(ラムダ)を使ったパイプライン処理であり
>コレクション処理の延長だと思ったほうが誤解がない。
俺もこの理解なのだが、
LINQでDBをアクセスした場合どうなるの? パーフォーマンスは無茶苦茶落ちるって
こと? シーケンシャルに処理してるだけだものな。
950デフォルトの名無しさん
2016/11/13(日) 12:54:46.07ID:fBLfWj6L >>949
EFは内部的に動的クエリを生成してDBにアクセスするからそんな負荷はかからない
EFは内部的に動的クエリを生成してDBにアクセスするからそんな負荷はかからない
951デフォルトの名無しさん
2016/11/13(日) 13:17:46.59ID:sNDrzqcx そりゃまそうだろうね。でも動的に生成したんでは予想外のことが起こりそう。
パーフォーマンスを致命的に落とす書き方ってあるんじゃなかろうか?
パーフォーマンスを致命的に落とす書き方ってあるんじゃなかろうか?
952デフォルトの名無しさん
2016/11/13(日) 13:24:00.80ID:fBLfWj6L あるよ
そこは生産性とのトレードオフ
そこは生産性とのトレードオフ
953デフォルトの名無しさん
2016/11/13(日) 15:26:48.72ID:PMfnb6vA >>949
プランナの有無とか、あくまでも今のLINQの実装なら、て前提があると思うが
基本的にはLINQは遅延実行なので、プランナ入れて最適化する余地はあると思うぞ
DBアクセスに限るなら、LINQがやるのは最終的なSQLを作るだけとも言えるので
後はそのDBのオプティマイザ次第、ってのが理想じゃないかとは思うが
まあSQLの書き方でパフォーマンス差が出るのは事実だし
LINQで最適化されてないSQLが出力されるのもある程度しょうがない
プランナの有無とか、あくまでも今のLINQの実装なら、て前提があると思うが
基本的にはLINQは遅延実行なので、プランナ入れて最適化する余地はあると思うぞ
DBアクセスに限るなら、LINQがやるのは最終的なSQLを作るだけとも言えるので
後はそのDBのオプティマイザ次第、ってのが理想じゃないかとは思うが
まあSQLの書き方でパフォーマンス差が出るのは事実だし
LINQで最適化されてないSQLが出力されるのもある程度しょうがない
954デフォルトの名無しさん
2016/11/14(月) 07:06:28.58ID:OCTkBwGI LINQはコレクションを順番に処理するだけのことだからXMLのような文書を検索なんて
実質できないでしょ。誇大広告じゃないかな。
コレクションにすればLINQがつかえるけど、IEnumerableにできなければ使えない。
そこがむつかしいのでは?
実質できないでしょ。誇大広告じゃないかな。
コレクションにすればLINQがつかえるけど、IEnumerableにできなければ使えない。
そこがむつかしいのでは?
955デフォルトの名無しさん
2016/11/14(月) 12:45:24.50ID:OCTkBwGI つーかやってみると奥が深いな。あんまり深入りしないほうがいいな。
select,whereを適当につかうくらいにしておいたほうがいいとおもった
select,whereを適当につかうくらいにしておいたほうがいいとおもった
956デフォルトの名無しさん
2016/11/14(月) 14:29:26.19ID:OCTkBwGI var query = from f in FileList
let matches = rx.Matches(f.DirectoryName )
where (matches.Count > 0)
orderby f.CreationTime descending
group f by f.DirectoryName;
これをdesendigとaescendigを切り替えようとおもうと、まるまる2回書かないと
いけないな。
なんかいい方法ないのか?
モードでクエリを切り替えるのって大変だな。
let matches = rx.Matches(f.DirectoryName )
where (matches.Count > 0)
orderby f.CreationTime descending
group f by f.DirectoryName;
これをdesendigとaescendigを切り替えようとおもうと、まるまる2回書かないと
いけないな。
なんかいい方法ないのか?
モードでクエリを切り替えるのって大変だな。
957デフォルトの名無しさん
2016/11/14(月) 20:35:23.23ID:ODUYDX4V >>954
Linqで全てのクエリを賄うのは厳しいよ
パフォーマンスもそうだけど検索対象に特化したDSLの方がやっぱり機能面でも強力だ
ただしそういう場合でも結果をIEnumerableに帰着させるだけでLinqの恩恵を得られるってのは大きいね
そうすれば省メモリかつ高速かつ柔軟に検索した上で後は同じインターフェースを通じて結果をお手軽に処理といった事ができる
Linqで全てのクエリを賄うのは厳しいよ
パフォーマンスもそうだけど検索対象に特化したDSLの方がやっぱり機能面でも強力だ
ただしそういう場合でも結果をIEnumerableに帰着させるだけでLinqの恩恵を得られるってのは大きいね
そうすれば省メモリかつ高速かつ柔軟に検索した上で後は同じインターフェースを通じて結果をお手軽に処理といった事ができる
958デフォルトの名無しさん
2016/11/16(水) 03:40:03.88ID:wnKhXXqD せっかくLINQ覚えてもJAVAではつかえないのか? 残念。
959デフォルトの名無しさん
2016/11/16(水) 06:12:37.05ID:sZ2S0G8X Java8の関数型、Stream がLINQと同じ
960デフォルトの名無しさん
2016/11/16(水) 12:14:52.63ID:wnKhXXqD Javaにもあったのか? 本が古すぎた。
ところでクエリー式とメソッド式はどっちが有利なのだ? どっちかにして
ほしいよ。それでなくても覚えることが多いのだから、、
ところでクエリー式とメソッド式はどっちが有利なのだ? どっちかにして
ほしいよ。それでなくても覚えることが多いのだから、、
961デフォルトの名無しさん
2016/11/16(水) 20:05:50.19ID:gtmrvLDz 散々既出だけどメソッド形式だけでいいよ
クエリ形式はレガシーコードの保守で修正しなきゃならない場合にだけ考えればいい
クエリ形式はレガシーコードの保守で修正しなきゃならない場合にだけ考えればいい
962デフォルトの名無しさん
2016/11/17(木) 03:40:19.26ID:B+vLCAoF 既出でしたか? 最近LINQを知ったばかりなので、知りませんでした。
963デフォルトの名無しさん
2016/11/17(木) 21:48:26.39ID:1A2/m07v ギャグは顔だけにしてくれ。
964デフォルトの名無しさん
2016/12/09(金) 06:57:30.84ID:9zXSWeUB var q = from cn in (from n in a select conversion(n))
from m in b select cn + m;
var q = a.Select((n) => new { n, cn = conversion(n) })
.SelectMany((c)=>b, (d,m)=>d.cn + m);
等価らしいが意味が分からない。dはどこからでてきたのだろうか?
from m in b select cn + m;
var q = a.Select((n) => new { n, cn = conversion(n) })
.SelectMany((c)=>b, (d,m)=>d.cn + m);
等価らしいが意味が分からない。dはどこからでてきたのだろうか?
965デフォルトの名無しさん
2016/12/09(金) 14:49:56.91ID:NMzYP4JF >>964
http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_08/csharp30_08_04.html
くこか
letの代わりにInt32を取るSelectManyだろ
呼び出されるたびに+1されていく
cとdがそれぞれnとcnに対応する
mがInt32
http://www.atmarkit.co.jp/fdotnet/csharp30/csharp30_08/csharp30_08_04.html
くこか
letの代わりにInt32を取るSelectManyだろ
呼び出されるたびに+1されていく
cとdがそれぞれnとcnに対応する
mがInt32
966デフォルトの名無しさん
2016/12/11(日) 11:53:49.51ID:vFkR62Wj いやいや違うだろ
http://devlights.hatenablog.com/entry/20100715/p1
この例のようにSelectManyの、ここでは2番目のオーバーロードを使っている
つまり
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
Console.WriteLine(conversion(a[i]) + b[j]);
Console.WriteLine($"conversion called: {count}");
と同じことをSelectManyを使って一本化してるだけ
1番目のオーバーロードが同じclassのメンバなのでcollectionselectorを使ってないが
ここではa[]とb[]という別々の配列に対して計算結果の二重ループを平坦化したいので
collectionselectorが必要になりこのような書き方になっている
http://devlights.hatenablog.com/entry/20100715/p1
この例のようにSelectManyの、ここでは2番目のオーバーロードを使っている
つまり
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
Console.WriteLine(conversion(a[i]) + b[j]);
Console.WriteLine($"conversion called: {count}");
と同じことをSelectManyを使って一本化してるだけ
1番目のオーバーロードが同じclassのメンバなのでcollectionselectorを使ってないが
ここではa[]とb[]という別々の配列に対して計算結果の二重ループを平坦化したいので
collectionselectorが必要になりこのような書き方になっている
967デフォルトの名無しさん
2017/05/25(木) 00:30:45.34ID:hLFywp3s 今更ながらlinqは美しいな。
968デフォルトの名無しさん
2017/05/26(金) 10:25:31.49ID:W7QTy6fz 糞遅い。市ね。
969デフォルトの名無しさん
2017/06/08(木) 10:57:09.59ID:0C/h20Gd970デフォルトの名無しさん
2017/06/10(土) 00:30:52.81ID:iwxerOOa 速くなるわけがない。
971デフォルトの名無しさん
2017/06/14(水) 01:47:53.79ID:osSxyyDu ちゃんとベタに書いたコードに比べたら無駄なコードが入るので速くはならいよ。
比べたらそりゃ遅いに決まってる。
比べたらそりゃ遅いに決まってる。
972デフォルトの名無しさん
2017/06/15(木) 07:42:14.92ID:pzpB7PXh 副作用を検知して、自動で並列化するようになれば、
linqで書いといた方が速いってことにもなりそうだけど
linqで書いといた方が速いってことにもなりそうだけど
973デフォルトの名無しさん
2017/06/17(土) 05:54:49.47ID:Q2thxGyP 他でドヤ顔してLINQ書いてる馬鹿がいて、
for + if でそのまま仕様どおり書いたら何倍も速かったってオチがあったな。
for + if でそのまま仕様どおり書いたら何倍も速かったってオチがあったな。
974デフォルトの名無しさん
2017/06/17(土) 16:13:15.19ID:O4zo0eqa 可読性より速度が大事ならいいんじゃない
975デフォルトの名無しさん
2017/06/22(木) 06:38:35.83ID:v39t46ad 違いが分かるほど差が出るってどんな用途だよ??
そんなに速度欲しいならC++で書いたほうがいいんじゃないの
そんなに速度欲しいならC++で書いたほうがいいんじゃないの
976デフォルトの名無しさん
2017/06/30(金) 09:16:50.65ID:VRcvSEbT C#は糞遅いからな。
C#でもJavaでもPythonでもライブラリはみんなC++で書かれてるのは他が糞遅いから。
C#でもJavaでもPythonでもライブラリはみんなC++で書かれてるのは他が糞遅いから。
977デフォルトの名無しさん
2017/06/30(金) 10:32:08.74ID:YD6uFwbU C#より速い言語をあげてください
978デフォルトの名無しさん
2017/07/02(日) 05:05:09.61ID:oEcBkrJ7 LINQが遅いのは分るがC#自体はそれほど遅くはない。
979デフォルトの名無しさん
2017/07/04(火) 13:43:58.23ID:VgVQ93XC C#ってネイティブコード吐けるの?
980デフォルトの名無しさん
2017/07/05(水) 07:02:18.26ID:0I1uRl92 C#自体の遅い速いじゃなくて
LinQと普通のベタコードの違いが分かるくらい速度を求める処理するなら
最初から素直にC++使えって事だろ
LinQと普通のベタコードの違いが分かるくらい速度を求める処理するなら
最初から素直にC++使えって事だろ
981デフォルトの名無しさん
2017/07/05(水) 12:56:08.45ID:SCEaR+bW LINQ使うから遅くなるだけで普通に書けばまぁまぁ速度は出る。ガチのC++には勝てないがね。
982デフォルトの名無しさん
2017/08/09(水) 07:30:25.84ID:0sQ4qce6 C#より(開発環境インストールするのにかかる時間が)速い言語をあげてください
983デフォルトの名無しさん
2017/08/22(火) 17:35:45.83ID:NIBb7Mxl 当然のことながら、結局、普及しなかったな。
984デフォルトの名無しさん
2017/10/23(月) 21:57:55.15ID:budLyErM >>975
LINQの句理解せずに適当に使って無駄なループしてたってオチじゃね
LINQの句理解せずに適当に使って無駄なループしてたってオチじゃね
985デフォルトの名無しさん
2017/10/24(火) 20:03:02.29ID:dTnbV75y LINQは川俣本でいいから読んどくべきだな
実行時間を削る事にかけてはストイックなほどの本
実行時間を削る事にかけてはストイックなほどの本
986デフォルトの名無しさん
2017/10/25(水) 10:51:42.48ID:hJQiC82m このスレといい関数言語スレの過疎っぷりといい、
C#スレで暴れてたキチガイって結局一人だけだったんだな。
C#スレで暴れてたキチガイって結局一人だけだったんだな。
987デフォルトの名無しさん
2017/11/05(日) 18:36:31.69ID:GvmpunB7 987
988デフォルトの名無しさん
2017/11/05(日) 18:37:02.13ID:GvmpunB7 988
989デフォルトの名無しさん
2017/11/05(日) 18:37:27.51ID:GvmpunB7 989
990デフォルトの名無しさん
2017/11/05(日) 18:37:57.71ID:GvmpunB7 990
991デフォルトの名無しさん
2017/11/05(日) 18:38:21.67ID:GvmpunB7 991
992デフォルトの名無しさん
2017/11/05(日) 18:38:46.11ID:GvmpunB7 992
993デフォルトの名無しさん
2017/11/05(日) 18:39:11.03ID:GvmpunB7 993
994デフォルトの名無しさん
2017/11/05(日) 18:39:35.87ID:GvmpunB7 994
995デフォルトの名無しさん
2017/11/05(日) 18:40:01.28ID:GvmpunB7 995
996デフォルトの名無しさん
2017/11/05(日) 18:40:25.86ID:GvmpunB7 996
997デフォルトの名無しさん
2017/11/05(日) 18:40:51.30ID:GvmpunB7 997
998デフォルトの名無しさん
2017/11/05(日) 18:41:15.86ID:GvmpunB7 998
999デフォルトの名無しさん
2017/11/05(日) 18:41:40.95ID:GvmpunB7 999
1000デフォルトの名無しさん
2017/11/05(日) 18:42:08.10ID:GvmpunB7 1000
10011001
Over 1000Thread このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 3556日 18時間 50分 34秒
新しいスレッドを立ててください。
life time: 3556日 18時間 50分 34秒
10021002
Over 1000Thread 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
ニュース
- 備蓄米、小売店へ流通しているのは放出量の1.97%どまり [お断り★]
- 【コメ】日本人の主食が変わる?価格高騰収まらない米に代わり 麺類、シリアルなど売り上げ増 [ぐれ★] ★2 [ぐれ★]
- 日本経済低迷の理由は日本人の意地悪さ説、前澤友作氏が私見「よく分かる」 [少考さん★]
- 「スマホをカーナビ代わり」手持ち操作で一発免停のケースも、ホルダーに固定は安全運転義務違反も [お断り★]
- 東海道新幹線 運転見合わせ範囲拡大 上り新大阪~浜松 下り東京~新大阪 岐阜羽島~米原で停電発生 [ぐれ★]
- “強気価格”も納得か!「ダウンタウンチャンネル」に「ごっつ」「松本紳助」など“過去作アーカイブ”案 [ネギうどん★]
- 【悲報】議員「AIにクリエイターの仕事奪われたらどうすんの?」政府「ハロワに行け」 [445972832]
- 大阪万博内の8ヶ所のトイレを巡るトイレツアーを開催 [931948549]
- ▶4期生の人気徹底考察🏡
- さっき公園でカラスがカラスの上に乗っかってたんだけど
- 死にたい
- 【悲報】トランプ大統領の対中制裁関税、中国の工場をグレートアメリカではなくインドへ移転させてしまう。バカみたいな関税だな [519511584]