【VB.NET】LINQ友の会【C#, C♯, C#】
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/02/09(土) 23:51:34統合言語クエリ (LINQ : Language Integrated Query)
ちょっと使ってみると、意外と難しいし、テクニック的にも奥が深いものです。
関数型言語にしかないような機能ラムダ式(Lambda式)などはオブジェクト指向とは一味違う機能です。
DataBaseの操作にも、Xmlの操作にも、さらにもっと単純な配列なコンテナにさえ機能する
言語共通・高汎用な統合言語クエリを皆で一緒にマターリ勉強しましょう。
質問、便利なマイテクニックの発表、いろいろやっちゃってください。
0002デフォルトの名無しさん
2008/02/09(土) 23:52:340003デフォルトの名無しさん
2008/02/10(日) 00:05:21LINQってなあに、という所で、これは以下のような事ができます。
このコードは配列から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);
とてもすっきりかけます。
0004デフォルトの名無しさん
2008/02/10(日) 00:20:06どーなんだろ、便利か?これ
0005デフォルトの名無しさん
2008/02/10(日) 00:25:18そこらじゅうにばら撒かれたきわめて保守し辛いプログラムが量産されるような気が
する。
0006デフォルトの名無しさん
2008/02/10(日) 00:34:33CLR自体に新しい何かが加わったの?
.NET層のインターフェイス?
シンタックスシュガーにも見えなくもない。
全然c#に触れてないので見当違いなこと言ってたらごめんよ。
0007デフォルトの名無しさん
2008/02/10(日) 00:53:14ラムダ式のシンタックスシュガーですよ、かなりなんでも出来ます。
0008デフォルトの名無しさん
2008/02/10(日) 00:55:570009デフォルトの名無しさん
2008/02/10(日) 01:15:380010デフォルトの名無しさん
2008/02/10(日) 07:20:460011762
2008/02/10(日) 12:42:26var 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で遊んでみた
0012デフォルトの名無しさん
2008/02/11(月) 15:15:26従来コードから徐々に LINQ に書き換えて行って見ました。
データは、Microsoft SQL Server 2005 に最初から入っているものです。
こちらの使用環境は Professional エデッションで、二枚付いているディスクはフルインストール
ウインドウズ認証でインストールして特に変わった設定がしてなければ、"貴方のPC" を自分のPC名に書き換えれば動くと思います、多分。
データベースは、最初から入っているサンプルデータ AdventureWorks の中の Location(Production) を使ってみました。
DataGridView コントロールを二つ貼り付けて、ボタンを一つ用意して、ボタンプッシュのイベントで実行しています。
0013デフォルトの名無しさん
2008/02/11(月) 15:16:32次のように変換されます。
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
0014デフォルトの名無しさん
2008/02/11(月) 15:17:26// 従来方式
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;
}
}
0015デフォルトの名無しさん
2008/02/11(月) 15:18:11// 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;
}
}
0016デフォルトの名無しさん
2008/02/11(月) 15:19:25// 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;
}
}
0017デフォルトの名無しさん
2008/02/11(月) 15:25:03// 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;
}
}
0018デフォルトの名無しさん
2008/02/11(月) 15:28:13誰も来なければそろそろ諦めるかw
0019デフォルトの名無しさん
2008/02/11(月) 17:33:56http://www.microsoft.com/japan/msdn/net/bb308959.aspx
Part4 LINQで変わるデータベース開発:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20080116/291140/?P=1&ST=develop
スレ立てるの早すぎだと思われ
然程使ってもいないのに意見の交換なんて出来ませぬ
0020デフォルトの名無しさん
2008/02/11(月) 18:16:461行に詰め込まないでインデントしようよ。
0021デフォルトの名無しさん
2008/02/11(月) 18:58:15private 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();
}
}
0022デフォルトの名無しさん
2008/02/11(月) 19:11:14http://www.microsoft.com/uk/msdn/nuggets/nugget/227/Decomposing-LINQ.aspx
0023デフォルトの名無しさん
2008/02/12(火) 16:11:50今日は System.Data.Linq.DataContext を使ったさらなる単純な例。
データベースへのアクセスの高速化もやりたいと思ったんですが、そんなの興味無い人多いと思うので、思いとどまって簡単化の方のみとします。
まずテーブルと同じ形式を持つクラスを作成します。
中身の無い { get; set; } は、event に対するdelegateのように、自動的にその型のインスタンスを生成してアクセスできるようにする物です。
C#の言語仕様書を見てください。
0024デフォルトの名無しさん
2008/02/12(火) 16:12:29// 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; }
}
0025デフォルトの名無しさん
2008/02/12(火) 16:13:13private 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);
}
}
}
0026デフォルトの名無しさん
2008/02/12(火) 16:14:20データベースを知らない人にも解りやすい、データベース不使用例もそのうち作ってみます。
0027デフォルトの名無しさん
2008/02/12(火) 21:46:14追加されるけど知らない人多いよね。これで>>24のを自動生成してくれる。
0028デフォルトの名無しさん
2008/02/13(水) 13:39:40驚きました、プロジェクトから 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;
}
}
0029デフォルトの名無しさん
2008/02/13(水) 13:49:37自前で動的にテーブルやDBを作成するにしても、一旦SqlSever上でダミーテーブルを作って
コードを生成しておいて、それをコピペで取ってきて変更する方が効率が良いように思えてきました。
0030デフォルトの名無しさん
2008/02/13(水) 14:02:30http://pc11.2ch.net/test/read.cgi/db/1173880885/l50
0031デフォルトの名無しさん
2008/02/13(水) 14:09:09マの人がほとんど居ないから余計伸びないです。
プログラム的な事は聞いても答えが返ってくることまずないですし。
0032デフォルトの名無しさん
2008/02/15(金) 00:07:33遅くても(・ε・)キニシナイ!!。
0033デフォルトの名無しさん
2008/02/15(金) 03:30:140034デフォルトの名無しさん
2008/02/15(金) 08:59:250035デフォルトの名無しさん
2008/02/15(金) 10:20:31普通のコレクションに対してロジックを実行するクエリのサンプルを示してみます。
>>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);
}
}
003635
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() };
003735
2008/02/15(金) 10:26:11var 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 };
とりあえず以上です。
もっと気の利いた例を作ったら、また書き込みます。
003835
2008/02/15(金) 11:52:15次のメソッドが存在するという前提です。
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();
}
}
003935
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);
}
}
004035
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と同じです)
}
}
0041デフォルトの名無しさん
2008/02/16(土) 00:03:52おお >>1 です、いらっしゃいまし、どんどん布教してあげてください。
let とか小技聞いていて面白いですね。
私の方は、まだ初めて一週間と初心者なので、もっと基本的でつまらない物やっていきます。
今日は、下手をすれば、C#さえ初心者の人向けのQ&Aを作ってみようと思います。
結果の簡単な確認方法と、選択・ソートです。
明日以後、表の結合等をやってみます、そのあとは、ググればありそうなのに無いLINQの文法の詳細解説あたりをやってみます。
0042デフォルトの名無しさん
2008/02/16(土) 00:04:35ツールバーにある 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 } };
0043デフォルトの名無しさん
2008/02/16(土) 00:05:16IList 等に変換してしまうのが便利です。
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();
0044デフォルトの名無しさん
2008/02/16(土) 00:05:53where句を使います。
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();
0045デフォルトの名無しさん
2008/02/16(土) 00:06:241.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();
0046デフォルトの名無しさん
2008/02/16(土) 00:15:04class 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();
0047デフォルトの名無しさん
2008/02/16(土) 00:15:29class 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();
0048デフォルトの名無しさん
2008/02/16(土) 09:02:200049デフォルトの名無しさん
2008/02/16(土) 09:48:380050デフォルトの名無しさん
2008/02/16(土) 17:51:350051デフォルトの名無しさん
2008/02/16(土) 17:52:36Row1の表に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 の結果
赤 青
赤 緑
青 青
青 緑
この機能、一見は使い道がなさそうですが、これをフィルターしてゆく事により価値が出てきます。
0052デフォルトの名無しさん
2008/02/16(土) 17:53:19Row1の表に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
0053デフォルトの名無しさん
2008/02/16(土) 17:54:00let を使って、選択した行を保持する事により実現できます。
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
0054デフォルトの名無しさん
2008/02/16(土) 17:54:50こうやって、Q&A を作ってみると、LINQは集合の積的な演算は強いのに和の方は至って貧弱なんですね。
全部LINQにしなくても適当にメソッドを使えば良いという話もありますが……
0055デフォルトの名無しさん
2008/02/16(土) 18:39:49まあ、リレーショナルデータベースがそういうものだからね<テーブル積を多用
0056デフォルトの名無しさん
2008/02/16(土) 18:59:05他にも同値分割とか余りとか(袋の中身を色で割ると、それぞれの色で分類された集合と、色なし集合になるといった概念です)、まだまだ綺麗にできる所があるなと >>1 は感じてます
マイクロソフトリサーチの人たちに、ぜひ圏論(この種の概念の理論がいっぱいあります)の研究をしてみてもらいたいなと……
そしてこの恐ろしげな概念を誰の手にも簡単に使える直感的で便利機能に仕上げて欲しいものです。
0057デフォルトの名無しさん
2008/02/16(土) 19:11:27作り手だけでなくて、使い手にも圏論の知識を強要することにならないかな。
LINQ は、リレーショナルデータベースの文化を
OOP 言語に導入したものだから、
少なくとも SQL チックに select とか where ってキーワードを使ってる限り、
リレーショナルデータベースの文化を大きく逸脱するようなことは
しない方がいいと思う。
ヘジたんがクエリ式否定派(関数形式ばっかり使う)な理由も
そういうところにあるのかもね。
0058デフォルトの名無しさん
2008/02/16(土) 19:11:51ちょっとだけ短くしたよ。
var table1 = from row1 in tableOrg1
let 評価 = tableOrg2.First(row2 => row2.以上 <= row1.得点 && row1.得点 < row2.未満)
select new { row1.氏名, 評価.評価 };
0059デフォルトの名無しさん
2008/02/16(土) 19:15:04006058
2008/02/16(土) 19:24:17パターンマッチっぽくしてみたよ。
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.氏名, 評価 };
0061デフォルトの名無しさん
2008/02/16(土) 20:13:38>>57
概念を導入することと、どう表現してどう使わせるかは違うと思うんですよ
高度な概念も、図にしてみれば、あんたバカ、何当り前の事をと思わずにはいられない概念は多いと思うんですよ。
圏論のそんな物の内の一つだと思っています。
ちなみにヘジたん理論無視の直感実装大好きです、実装は理屈じゃないですよ、いいと思ったらそれがいいんだと思ってます。
理屈は後付け、原爆の爆縮レンズが開発される時に、火薬職人が二種類の火薬使えばいいじゃんといって、頭でっかちのノイマンが計算するっていうのは悪くないと
ここでは、火薬職人がヘジたんで、頭でっかちがリサーチの人たちですね。
>>60
ありがとさんです、なるほどなるほど、いろいろ参考になりますです。
まだまだ初心者なんで今後ともよろしくお願いします。
0062デフォルトの名無しさん
2008/02/16(土) 20:26:54あれってとどのつまりは、引数が添え字になっている唯のベクトルですよね。なにやら要素が並んでいるだけの物です。
よく無限次元になってしまうので、普通に書けないからああ書いたというだけで……
もっと解り易くならないかなと思ったりします。
0063デフォルトの名無しさん
2008/02/16(土) 21:07:54変にSQLの知識あるとちょっと慣れそうにないなぁ、これは
0064デフォルトの名無しさん
2008/02/17(日) 00:29:39俺も一応オラクルマスター持ちなんだが(システム屋から足を洗って長いけど)、
それはそれ、これはこれだな。
DBとだけ使っている限りは、SQL以上のことができるわけじゃないから「ただのキモいSQL」という見方も、そう間違ってはいないだろう。
SQLを基準にして見れば、SQLとの違いが気持ち悪いのは確か。しかし、メモリ上のデータのグループ化やら結合やら、定型的なわりに再利用しづらいコードを
いちいち書いては「こんな処理、SQLならSELECT文一発なのに」と思っていた人にとっては、むしろSQLに近づいた感じなのではないだろうか。
0065デフォルトの名無しさん
2008/02/17(日) 00:53:13(より「意図通りに書ける」ようになった)も重要だし、
in-memory オブジェクト、XML、DB に対して
ほぼ同じ書式でクエリが書けることも重要かと。
0066デフォルトの名無しさん
2008/02/17(日) 20:41:50LINQは処理順に書かなくてはならないし、必ず記述順で処理される。
LINQはSQLの類似品と考えるより、
Enumeratorやコールバック(ラムダ)を使ったパイプライン処理であり
コレクション処理の延長だと思ったほうが誤解がない。
0067デフォルトの名無しさん
2008/02/17(日) 21:31:55いずれ統一化できる下準備になるのではないかと思っています。
最終的には、コンパイル済みの.NETのコードを直接 DB に送り込み、DBがそれを直接解釈するという形になるのではと想像しています。
そうしますと、C#/VB.NETで書かれたSQLとDBのSQLの微妙な解釈の違いが完全になくなると思うので、これは安心できると思うのですがどうでしょう?
あと、コンパイル済バイトコードを送りつけるなら、DBのスピードもあがるかもとかとか・・・
また、セキュリティーの関係ではSQLインジェクションの類は完封できそうです。
>>1 です、今日は、表の分割、行の分類のやり方を紹介します。
0068デフォルトの名無しさん
2008/02/17(日) 21:32:46LINQの文法は、例えば以下のような形式になっています。
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
0069デフォルトの名無しさん
2008/02/17(日) 21:33:19var 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 などとする事により複雑なふるい分けが可能です。
0070デフォルトの名無しさん
2008/02/17(日) 21:34:14項目に大小比較ができれば、ソートしてしまえば良いのですが、それが無い場合には少し困った事になります。
ここでは、前出の「表を分割したい」と組み合わせた方法を紹介します。
それは、前出の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();
0071デフォルトの名無しさん
2008/02/17(日) 21:35:03この query-body-clause* の部分が複数になると急に難解になりますね。
どういう時に、使うと見通しが良くなるのか、あるいはどういう時にろくな事にならないのか
パターンとアンチパターンを揃える必要がある気がします。
0072デフォルトの名無しさん
2008/02/17(日) 21:40:18>この query-body-clause* の部分が複数になると急に難解になりますね。
とりあえず改行とインデントとletで工夫かな。
0073デフォルトの名無しさん
2008/02/18(月) 18:11:36一通りざらっと見てみて、LINQの文法はひょっとして質が悪いのでは?という疑惑が湧いてきました。
LINQの核心部分は、from join その他 LINQ キーワードではなく、実際の処理が記述されている System.Linq.Enumerable であるので
これが致命傷になるとは思えないのですが、簡単に使うための上っ面としては今一な気がします。
このキーワードと文法には、変な汎用性があり、相当な広範囲にわたって複雑な処理が可能ですが
それを行うなら、メソッドベースで行ったほうが良さそうな気がします。
1.方向性としては、良くある定型について、LINQ 文法を使って完結に記述。使用例一覧に纏めておき、サクッと使う。
2.例外的なクエリについては、メソッドを使い、一つ一つ区切りながらクエリを完成させる。
こういう使い方が良いのではと思い始めました。
皆さんはどんな意見をお持ちでしょうか?
0074デフォルトの名無しさん
2008/02/18(月) 18:13:51今日はこれを、初心者向けの説明にしようと思ったのですが……難しすぎ
区切り無く、際限なく、限りなく書き方が広がるとマニュアル化ができません。
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)? ,)*
0075デフォルトの名無しさん
2008/02/18(月) 18:52:44LINQ って言葉の指す範囲は広くて、クエリ式もメソッド形式もどっちも LINQ よ。
from x in list みたいなのはクエリ式。
クエリ式でないと書きづらいのは、多重 from と join と let くらいかな。
まあ、transparent な変数が絡むとクエリ式使わないときつい。
逆に、クエリ式で書けないことも実に多い。
まあ、個人的には、
クエリ式で書けるものは全部クエリ式で、
それ以外だけメソッド形式で書いてる。
0076デフォルトの名無しさん
2008/02/18(月) 18:56:38俺は
基本的に、select と group by は最後に来る。
その後ろにさらにクエリを続けたい場合は into x を置いてからさらに続ける。
と説明してる。
0077デフォルトの名無しさん
2008/02/18(月) 19:00:39from 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 の後ろにさらにメソッドが続く
0078デフォルトの名無しさん
2008/02/20(水) 00:08:01お前社員だろwwwwwww
こんなの広めてどうするwwwwww
0079デフォルトの名無しさん
2008/02/20(水) 04:36:320080デフォルトの名無しさん
2008/02/20(水) 10:09:28後出しじゃんけんの分強い
対象が Java か .NET か
LINQ では、C# や VB の言語仕様もいじったから書きやすい
0081デフォルトの名無しさん
2008/02/20(水) 18:48:34Linq to SQL , Linq to XML , 生Linq と全部使い込みをしないと見えてきにくいですね。
>>78
おれ社員じゃないよ、ボーランド大好きヘジたん信者の可能性は高いけど(笑
それと食わず嫌いはどうかなwwww
問題もそれなりに多そうだなというのも見えてきましたけど開発効率めちゃくちゃ高いよぉ。
0082デフォルトの名無しさん
2008/02/20(水) 20:25:54簡単に言うと、O/Rマッピングは対症療法、LINQは原因療法、みたいな。
なんでこんなのが必要かってのは、
ttp://d.hatena.ne.jp/fromdusktildawn/20060216/1140064918
を読むと理解が深まるかも。
0083デフォルトの名無しさん
2008/02/20(水) 21:16:01データベースから、XMLから、果ては適当なクラスや構造体まで統一手法で操作可能という点。
O/Rマッピングと目指すところがそもそも違うと思う
0084デフォルトの名無しさん
2008/02/20(水) 22:14:52これだけはほかのと系統が違う。これで使うラムダ式は特殊なもの。
0085デフォルトの名無しさん
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-");
}
}
0086デフォルトの名無しさん
2008/02/21(木) 01:06:410087デフォルトの名無しさん
2008/02/21(木) 01:43:020088デフォルトの名無しさん
2008/02/21(木) 07:12:47遅くなるというのは1件あたりの処理時間が増えるということかな?
それだったらCompact Editonなのが影響してるのかもしれない。
2005Expressで実行してみたらどうだろう。
db.SubmitChanges(); は5000件まとめての方が速いと思う。
メモリがきついようなら500件くらいまとめてで。
0089デフォルトの名無しさん
2008/02/21(木) 08:46:06百件のインサートごとにその間にかかった時間を書いてるんですが、それがリニアに増えてきます。
Express or Serverで試してみます。
実際の実行時はまとめたほうがよさげですね。
0090デフォルトの名無しさん
2008/02/21(木) 10:05:01> 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)じゃね?
最近プログラミングしてないんで間違ってたらスマソ
0091デフォルトの名無しさん
2008/02/21(木) 10:13:41下のWriteLine()の中で上のを呼んでる。
0092デフォルトの名無しさん
2008/02/22(金) 00:11:14クエリ式はとりあえず放って置いて、メソッドでしか表現できないタイプのものを解説してみようと思っているのですが
まずは一発目で Aggregate あたりからやってみようかと思ってます。
ただ、このメソッドあまりにも関数型言語らしい仕様をしています。
何か良い説明方法はないかと色々さがしているのですが、良いのがあったら誰か紹介してください。
http://d.hatena.ne.jp/blanketsky/20071129/1196329379
とりあえず、この辺りとか見てみたのですが……
こんなの見せられたら初心者さん気絶するよなとか思いつつ、何かいいのはないかなと……
0093デフォルトの名無しさん
2008/02/22(金) 00:32:05forループからの置き換えで解釈してみては。
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
これをAggregateで記述するとどうなるか、とか。
009485
2008/02/22(金) 00:39:5910000件ぐらいまではまとめたほうがトータルの実行時間が短くなった。
もっと多くした場合はどうなるかは今度試します。
ほかのデータベース試してないけれど、なんかCompactのせいっぽい匂いが・・・
0095デフォルトの名無しさん
2008/02/22(金) 01:20:37その情熱がどこから来るのかわからんが、Aggregateなら
・sum、factあたりを通常の再帰関数で書く
・共通する部分を抜き出す
・これがAggregateです
っていうのがわかりやすいんじゃないの?
0096デフォルトの名無しさん
2008/02/22(金) 11:23:52http://ufcpp.net/study/csharp/sp3_stdqueryo.html#aggregate
0097デフォルトの名無しさん
2008/02/22(金) 19:46:15コレクションに対するアルゴリズムは絶対に必要だ
XMLやSQLは別になくても生きていけるとは思うが
0098デフォルトの名無しさん
2008/02/22(金) 22:13:520099デフォルトの名無しさん
2008/02/23(土) 01:08:33>>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# が普及するようにとの願いを込めて当コンテンツを作成することにしました。
実は自分も全く同じ境遇です、でも研究者じゃありません、ただのプログラマですが……
関数型言語をやっていて思うところで、こんなの一発なのにというコードがオブジェクト指向のスタイルでは全くまともにかけなくて歯がゆい思いをしていました。
今日からお休みなので、これから練ってみます、明後日辺りから書き始めるかもしれません。
0100デフォルトの名無しさん
2008/02/23(土) 01:09:33これをみて理解できる人間が一体何人いるんだろうか……
Aggregate<(Of <(TSource, TAccumulate>)>)(IEnumerable<(Of <(TSource>)>), TAccumulate, Func<(Of <(TAccumulate, TSource, TAccumulate>)>))
この表現からぱっと見た目に使い方がわかる人は一体何人いるんだろうと、首を傾げそうになります。
ドキュメントのつくりを一度見直すべきだと思う……強力なのに……
>世間の C# への関心が低ければ、C# は普及することなく消え去ってしまうでしょう。
こんな状態になって欲しくないです
これを使えば、エクセルで小計等をやるような操作を一行で書き下せますが、使える人が居なくなってしまう。
0101デフォルトの名無しさん
2008/02/23(土) 01:22:13LINQもそういうことになってしまうのは嫌だな。
0102デフォルトの名無しさん
2008/02/23(土) 02:31:52これ流行らないよ・・・
from の位置とか外人さんでも気持ちわるいんじゃないかな
010395
2008/02/23(土) 02:36:28あー、ごめん、関数型言語とごっちゃになってた。
C#なら95の最初の手順を
・sum、factあたりを通常の関数で書く
でいいな。確かに再帰とかいらない。
蛇足ですが、あなたの対象とする「初心者」像がいまいちわからないのが
少し気になります。
0104デフォルトの名無しさん
2008/02/23(土) 03:22:34発売後15日にして大分経っていたのか、それはショックだw
ごみレスつけるな、よそ行けよ
0105デフォルトの名無しさん
2008/02/23(土) 10:15:51duck typing(?)とかいう手法で Map :: X[] -> (X -> Y) -> Y[] を作っちゃった
拡張性も結構あるしガクジュツ的ではなくちゃんと実務に沿って開発しやすくなるような言語拡張だからLINQは流行ると思う
0106デフォルトの名無しさん
2008/02/23(土) 13:41:160107デフォルトの名無しさん
2008/02/23(土) 14:51:390108デフォルトの名無しさん
2008/02/23(土) 14:52:380109デフォルトの名無しさん
2008/02/23(土) 14:56:380110デフォルトの名無しさん
2008/02/23(土) 15:10:50foreach(T item in source) action(item);
}
ただこれだけのことだけど
こんなことしちゃうとコード全体がガラッと変わるから非公式にやるのは抵抗がある
0111デフォルトの名無しさん
2008/02/23(土) 15:17:25foreachぐらい分けて書こうぜ
0112デフォルトの名無しさん
2008/02/23(土) 15:42:04ヘジ自ら書いてる
これが俺のバイブル
0113デフォルトの名無しさん
2008/02/23(土) 16:44:36foreach( var row in table ) 文 ;
これ以上何かをする必要はないだろうと思う、逆にややこしいだけだし。
はなしは変わって、http://ufcpp.net/study/csharp/sp3_stdqueryo.html#aggregate によると
> でも、メソッド提供だけでは、 join や let などがどうしてもきれいに表現できなかったので、
<やむなく SQL 風のクエリ式を導入したそうです。
>(プログラミング言語の中に別に言語を埋め込むというのはデメリットも大きくて、
>言語制作者にとっては結構ためらわれる行為。)
>(join や let をきれいに書くためには、どうしても透過識別子のような考え方が必要だった。)
という事らしいのですが、私は、むしろ逆で、これを見た瞬間λ式消滅、これは素晴らしい!!
と思ったものなんですが……
"Language Integrated" Query というぐらいですから、最初こちらがあったのだと想像していのですが逆だったんですね。
foreach にはλ式は登場しないので十分だと思っています。
0114デフォルトの名無しさん
2008/02/23(土) 16:47:27ダブルクリックすれば勝手にコード登場となって、こういうややこしいものは後回しにして使い方を最初に知ることができる。
これがC#の良い点だと思うんですよ。
0115デフォルトの名無しさん
2008/02/23(土) 16:50:49匿名メソッドよりも,普通のメソッドを直接渡すときに気持ちいいんだよね
list.ForEach(Console.WriteLine);みたいに
初めてみたときはびっくりしたけど
0116デフォルトの名無しさん
2008/02/23(土) 16:59:23それらを書くぶんにはクエリ式でなく拡張メソッド+ラムダ式の方がシンプルに書ける
ラムダ式は他にもプログラミングのあらゆる局面で使うと便利なことが多い
対してクエリ式はSelectManyやJoinなんかで使うとシンプルに書けるけど
そんなん滅多に使わん
0117デフォルトの名無しさん
2008/02/23(土) 17:43:25new[] { 1, 2, 3, 4, 5 }.Select(
x => {
Console.WriteLine(x);
return x;
}
).ToArray();
0118デフォルトの名無しさん
2008/02/23(土) 18:06:36あなたがその値を見るまでは値は計算されていませんって、まるでシュレディンガーの猫のような現象がありました。
0119デフォルトの名無しさん
2008/02/23(土) 18:24:470120デフォルトの名無しさん
2008/02/23(土) 18:29:180121デフォルトの名無しさん
2008/02/23(土) 18:30:330122デフォルトの名無しさん
2008/02/23(土) 18:32:42ものすごく面白いが、万人にお勧めではない。
0123デフォルトの名無しさん
2008/02/23(土) 18:35:440124デフォルトの名無しさん
2008/02/27(水) 19:00:07ちょっとスタイル変更、くだすれC#だと、配列よりも List クラスの方が需要ありそうだったので。
実際、実用上は配列って事はありえない気がしますし。
名前は全部漢字にして、型名には末尾に"型" と付けてみました。
0125デフォルトの名無しさん
2008/02/27(水) 19:00:49Aggregate が便利です。
以下の例では、合計原価と合計売価を求めます。解りやすさ優先で、型をすべて書ききったバージョンです。
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; }
}
0126デフォルトの名無しさん
2008/02/27(水) 19:01:50省けそうな型名は省略したバージョンです
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[] { 合計表 };
0127デフォルトの名無しさん
2008/02/27(水) 19:03:01上記のコードが何をしているのかといいますと、以下のコードのような処理をしています。
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[] { 直前の合計 };
0128デフォルトの名無しさん
2008/02/27(水) 19:04:24これを使うと簡単になるケース
合計型と売上帳の行型が同じなら、コードは単純になります
var 売上帳 = new System.Collections.Generic.List<売上帳の行型>();
売上帳.Add(new 売上帳の行型() { 品名 = "デスクトップPC", 数量 = 1, 原価 = 100000, 売価 = 120000 });
売上帳.Add(new 売上帳の行型() { 品名 = "ノートPC", 数量 = 2, 原価 = 250000, 売価 = 280000 });
// 合計の計算
var 合計行 = 売上帳.Aggregate((直前の合計, 現在の行) => new 売上帳の行型() { 原価 = 直前の合計.原価 + 現在の行.数量 * 現在の行.原価, 売価 = 直前の合計.売価 + 現在の行.数量 * 現在の行.売価, 品名 = "合計" });
売上帳.Add(合計行);
// お試し表示
dataGridView1.DataSource = 売上帳;
0129デフォルトの名無しさん
2008/02/27(水) 19:05:23駄目だ、どうあがいても単純になりません。
3 番目を書いてみたら、foreach で書いたほうが見通しがよさそうな感じすらしてきます。
綺麗になるのは、アキュムレーターの型とコンテナ要素の型が一致しているとき
もしくはアキュムレーターの型が int のような単純型で有る場合に限られます。
メソッド方式にはやはり何かが足りない感じがします。
LINQの新規キーワードとして、それも foreach をイメージできるような構文にして
"aggregate 売上帳" と書いたら、型名、その他をインテリセンスがズバズバッと書き出して、
作る側は中身をを書くだけといった具合になれば使えそうな気がするのですが……
もしくは Excel の、式のコピーのようなイメージができれば、やる事は一番上の式を書く事となるのですが。
0130デフォルトの名無しさん
2008/02/28(木) 02:02:300131デフォルトの名無しさん
2008/02/28(木) 11:52:140132デフォルトの名無しさん
2008/02/28(木) 12:47:55XMLリテラルが売りですのじゃ
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
0133デフォルトの名無しさん
2008/02/28(木) 13:15:08VBのラムダ式は糞だけど
0134デフォルトの名無しさん
2008/02/28(木) 17:54:04Aggregateは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}", 合計表.合計原価, 合計表.合計売価);
0135デフォルトの名無しさん
2008/03/07(金) 01:17:17見やすいのは当たり前
0136デフォルトの名無しさん
2008/03/07(金) 11:55:15できたらおかしいのはわかるけどDynamicMethodの簡易版として使うには貧弱だな
0137デフォルトの名無しさん
2008/03/07(金) 12:01:30そういう用途だと、LINQ の Expression から DLR の AST Expression に変換してしまうのがいいかも。
0138デフォルトの名無しさん
2008/03/07(金) 17:40:05現在、DataTableに対してグループ化ってかなり無理矢理やらないと出来ないと思うんですが、
これができると、DataTableがかなり使いやすくなりそうです。
.NET3.5をインストールさせる動機になりそうなくらい・・・
0139デフォルトの名無しさん
2008/03/12(水) 12:24:53実際に使ってみるとなかなかスイーツ(笑)な簡単さじゃないか。
List<T>なんか作って追加していって最後にToArray()してるようなのも
Linqで書き換えたら全部一行に出来そうだ。
0140デフォルトの名無しさん
2008/03/13(木) 01:52:230141デフォルトの名無しさん
2008/03/13(木) 11:30:560142デフォルトの名無しさん
2008/03/13(木) 13:24:300143デフォルトの名無しさん
2008/03/13(木) 15:06:20むしろ新機能はLINQ以外にあったっけか?
まぁ銀光とかあるけど
0144デフォルトの名無しさん
2008/03/13(木) 15:07:510145デフォルトの名無しさん
2008/03/13(木) 15:16:040146デフォルトの名無しさん
2008/03/13(木) 15:18:190147デフォルトの名無しさん
2008/03/13(木) 16:24:25使う奴っている?
今一歩使い道が見つからん・・・
0148デフォルトの名無しさん
2008/03/13(木) 21:19:44タイミング良くっつーかこんな記事がでてるね。
.NETプログラマーにとって、XSLTは終焉なのか?
ttp://www.infoq.com/jp/news/2008/03/XML-Literals
>XML Literalsは最初Haskell向けに開拓され、
>のちにMicrosoftにおいてC#で使用するために開発された。
>どちらの言語においてもうまく いかないことが判明したので、
>Visual Basicチームが飛び付いて、VB 9の礎石にした。
>これはそれほどまでに驚くことではない。
>というのもHaskell構文がVBScriptのインラインHTML表記の影響を
>もろに受けて いたからである。
まあヘジたんなら拒否るだろし、事実拒否ったんだろうなぁ。
0149デフォルトの名無しさん
2008/03/14(金) 22:40:14実行したら、
ストアド プロシージャはクエリ内では使用できない。ってエラーになるんだよ。
これバグじゃないかな。
0150デフォルトの名無しさん
2008/03/15(土) 00:46:01IsComposable=true がなかったのが原因みたいです。
なんだかなあ。
0151デフォルトの名無しさん
2008/04/06(日) 03:35:460152sage
2008/04/13(日) 01:33:35SELECT
A.KEY1, A.COL1, B.COL2
FROM
(
(SELECT * FROM TBL1) A
INNER JOIN
(SELECT * FROM TBL1) B
ON B.KEY1 = A.KEY1
)
0153デフォルトの名無しさん
2008/04/13(日) 02:32:31var 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 };
こんな感じだけど、この例だとサブクエリ必要なくね?
0154デフォルトの名無しさん
2008/04/13(日) 02:36:53それ、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
0155デフォルトの名無しさん
2008/04/13(日) 14:50:18保守が容易な綺麗なコードを書けるから
(゚�听)イラネ
0156デフォルトの名無しさん
2008/04/13(日) 16:44:19コードが見通しよく整理されていく中盤からの展開は見てて痛快だなぁ
0157デフォルトの名無しさん
2008/04/24(木) 21:22:230158デフォルトの名無しさん
2008/04/24(木) 21:41:48Visual LINQ Query Builder
VS2008用のアドインか
0159デフォルトの名無しさん
2008/05/24(土) 20:45:08SQLでおなかいっぱいで
0160デフォルトの名無しさん
2008/05/24(土) 21:01:08LINQ の価値は速度じゃなくて、
OOP パラダイムと RDB パラダイムの懸け橋になること。
SQL でおなかいっぱいって人にこそ LINQ がいいんじゃないか。
0161デフォルトの名無しさん
2008/05/24(土) 23:11:23お母さんが子供に教えるように教えてください
0162デフォルトの名無しさん
2008/05/24(土) 23:23:16C# の中で、オブジェクト指向言語の感覚からあまり外れることなく、
データベース問い合わせが書けるってことが大事。
0163デフォルトの名無しさん
2008/05/25(日) 00:22:260164デフォルトの名無しさん
2008/05/25(日) 04:39:07条件次第で内容が大きく変わるようなクエリを構成するときに、文字列の連結を間違えて
バグを作り込んでしまうような、つまらないミスを防げる。
DataContextの定義にあわせて自動でCREATE DATABASEしてくれるとか、生産性の向上に
つながる要素がいろいろあるよ。
俺もほとんど把握してないけどさ。
0165デフォルトの名無しさん
2008/05/25(日) 09:04:21C/C++やらで何らかのデータ処理を行う場合、その度毎にアルゴリズムを考え、設計し、
コードを作りこまなくちゃいけないけど。
RDBだと、ちょこっとSQLを定義するだけで実際の処理はRDBのエンジンがやってくれる。
例えるなら文字列の正規表現みたいな感じで。
それが言語組み込みの文法として、RDBだとDBサーバを立て、テーブルを作り、データをインポートして
からじゃないと使えないのが、RDBに限らずC#言語上の任意のコレクションデータで使えてしまう
ってのは便利。
0166デフォルトの名無しさん
2008/05/25(日) 09:41:44インピーダンスミスマッチでぐぐれ
0167デフォルトの名無しさん
2008/05/25(日) 11:12:57逆に今あるオブジェクトからテーブルとかを生成するツールってあったっけ?
0168デフォルトの名無しさん
2008/05/25(日) 14:02:32方法 : データベースを動的に作成する (LINQ to SQL)
http://msdn.microsoft.com/ja-jp/library/bb399420.aspx
0169デフォルトの名無しさん
2008/05/25(日) 14:39:10これでも読め
http://www.microsoft.com/japan/msdn/net/bb425822.aspx
0170デフォルトの名無しさん
2008/06/02(月) 22:49:47感謝しろビル
0171デフォルトの名無しさん
2008/06/04(水) 08:38:010172デフォルトの名無しさん
2008/06/09(月) 11:06:000173デフォルトの名無しさん
2008/06/15(日) 19:33:30Linqも人気ないけど
ダメ技術のかほりがすっぞ
0174デフォルトの名無しさん
2008/06/17(火) 02:07:550175デフォルトの名無しさん
2008/06/17(火) 07:25:18XMLとかにもいいと思うよ。
0176デフォルトの名無しさん
2008/06/17(火) 21:00:53クエリ形式は「さあLINQ使っちゃうぞー」って感じになっちゃって好きじゃない
0177デフォルトの名無しさん
2008/06/17(火) 22:19:070178デフォルトの名無しさん
2008/06/18(水) 03:55:30クエリ式を使ってる
けど、それ以外ではクエリ式は全然使ってない
0179デフォルトの名無しさん
2008/06/19(木) 22:35:19ポテンシャルは高い気がする。
0180デフォルトの名無しさん
2008/06/20(金) 00:55:26微妙なところだ。
PLINQとかになるとまた話は違うだろうけれど。
0181デフォルトの名無しさん
2008/06/20(金) 08:43:29from 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 の問題は解消しない。
0182デフォルトの名無しさん
2008/06/20(金) 09:05:06DryadLINQみたいにExpressionを直接扱う計算エンジンが要るね。
PLINQは所詮IEnumerableベースだし。
ttp://research.microsoft.com/research/sv/DryadLINQ/
ポテンシャルはDryadLINQ>>>>>PLINQなんだろうけど、
出荷までにかかる時間を考えるとPLINQ>>>DryadLINQだろうねぇ。
C# 3.0もお披露目から1年半ぐらいかかったし。
出荷までの時間短縮はお金じゃ解決しづらいんだろうな。
0183デフォルトの名無しさん
2008/06/20(金) 09:07:06不等号逆だった……
ポテンシャル: DryadLINQ>>>>>PLINQ
出荷までにかかる時間: PLINQ<<<DryadLINQ
0184デフォルトの名無しさん
2008/06/20(金) 09:10:04あとこれもお披露目から2年半の間違い。
0185デフォルトの名無しさん
2008/06/21(土) 10:41:480186デフォルトの名無しさん
2008/06/26(木) 01:03:410187デフォルトの名無しさん
2008/07/07(月) 22:42:170188デフォルトの名無しさん
2008/07/07(月) 22:53:070189デフォルトの名無しさん
2008/07/07(月) 23:23:38一言レスって周りにも意図伝わらないからヤメレ
0190デフォルトの名無しさん
2008/07/07(月) 23:26:55リレーション張っても参照のプロパティでアクセス出来るのも簡単すぎて涙が出る。
長ったらしいデータセットのクラス名で変数宣言してたら、varで省略できるのにも涙が出た。
0191>>188 じゃないよ
2008/07/07(月) 23:30:39自分で書けばわかるって事だろ?
意図理解できないのは君だけだと思うが。
0192デフォルトの名無しさん
2008/07/08(火) 10:10:04XmlReaderと比べるあたり自分では何も調べずに
思いつきで書き込んだと証明してるようなものだ。
0193デフォルトの名無しさん
2008/07/08(火) 23:25:23二つコードを書けということですね、わかります
0194デフォルトの名無しさん
2008/07/08(火) 23:47:33ごめんなさい
>>192
違いの話なんかしてないっすよ?
あれからbuilderってサイトのサンプルを読んで勉強してみてる。
ちょっと興奮で震えてます。
皆ありがとう
0195デフォルトの名無しさん
2008/07/09(水) 03:40:44Linq for XMLで使うXElement系のクラスはDTDやXMLスキーマをサポートしない。
構造の検査、実体やデフォルトの属性を展開することが必要という意味で複雑なXMLだったら手も足も出ない。
XDocument/XElementはXMLパーサーとしての機能をしぼっている。
簡単なXMLの読み書き加工は簡単にかつスマートに書ける、Linq for XMLはその為のもの。
XmlDocment/ElementはDOMとしてのすべての機能をもつ。多機能ではあるが何をするにも大掛かり。
XmlReader/Writerは StAX型の前方参照型で高速。
使用メモリが少なくてすみ全部メモリに読み込むのが問題になるような大きなXMLも対応できる。
扱いは当然ややこしい。
0196デフォルトの名無しさん
2008/07/11(金) 13:29:590197デフォルトの名無しさん
2008/07/19(土) 20:38:17LINQテクノロジ入門
http://ec.nikkeibp.co.jp/item/books/A04100.html
・07/22発売 3,360円(税込み) B5変 280P
0198197
2008/07/27(日) 00:32:31図表を多く使っていて、C#/VBのサンプルコードも多いのは○
内容的には結構踏み込んで丁寧に解説されていて、実際に発行されるT-SQLまで触れられてたりする。
・C#/VB・SQLに関する基本的な理解は必須。
・開発経験のない初心者が読むには少し難しい。
・何となくLINQを使っているが、使いこなせていないと感じてる人 にはおすすめ。
0199デフォルトの名無しさん
2008/07/27(日) 01:55:180200デフォルトの名無しさん
2008/07/27(日) 11:06:25単に .Select メソッド(あるいは拡張メソッド)とか実装するだけ。
LINQ to SQL みたいなことしたければ、
LINQ の勉強というよりは、Expression Trees の勉強が必要。
で、LINQ がらみの記事は結構おおいけど、
Expression Trees はあんまり見ないなぁ。
0201デフォルトの名無しさん
2008/07/27(日) 12:23:14それです、それ。
具体的にどこまでのExpressionTreeをどんな風に実装したらいいのかが・・・
0202デフォルトの名無しさん
2008/07/27(日) 12:55:38http://ufcpp.net/study/csharp/sp3_linqreconstruct.html
LINQ to SQL みたいなことしたければ、IQueryable でググってみるといいんじゃないかと。
0203デフォルトの名無しさん
2008/07/27(日) 13:14:37ttp://msdn.microsoft.com/ja-jp/library/bb546158.aspx
ttp://msdn.microsoft.com/ja-jp/library/bb882640.aspx
0204デフォルトの名無しさん
2008/08/31(日) 11:34:15LINQの本が少ない中、この本はお薦め。
LINQを構成する基礎や、現在のバージョンで、できる事できない事、
やってはダメな事が書かれている。
.netとSQLを使って仕事している人ならLINQがどういう物か理解できる。
少なくともこの本レベルの事を理解していないと知らずに地雷を埋め込むことになる。
0205デフォルトの名無しさん
2008/08/31(日) 18:22:460206デフォルトの名無しさん
2008/08/31(日) 23:44:430207デフォルトの名無しさん
2008/09/01(月) 00:10:28消えていくと言う運命もあるから、俺はもう少し様子見。
0208デフォルトの名無しさん
2008/09/01(月) 00:59:300209デフォルトの名無しさん
2008/09/01(月) 06:48:16新規には誰も使わなくなって結局放置と言うこと。
まあ、特攻する人も必要だから、>>208 は頑張ってくれ。
0210デフォルトの名無しさん
2008/09/01(月) 09:00:39そのほかはともかく
0211デフォルトの名無しさん
2008/09/01(月) 21:35:34俺はなくてもあまり困ってないし、「残らない可能性もある」ので
ちょっと様子見してるだげ。
いいと思う人はどしどし使って広めてくれ。
0212デフォルトの名無しさん
2008/09/01(月) 23:25:27特にLINQtoSQL。XMLはしらんがたぶん便利だろう。
今のだと出来ないこともあるけれど、出来るところのはかなり楽だ。
0213デフォルトの名無しさん
2008/09/01(月) 23:38:08今後、LINQ to SQL とか LINQ to XML が廃れるようになろうとも、
コレクションとかサーバ問い合わせ系のライブラリ書く人は
おそらくほぼ LINQ の規約に従ってメソッド名を付けると思う。
そういう意味では、廃れないと思うんだが。
クエリ式とか、IQueryable を介したサーバ問い合わせとかが廃れようとも、
命名規約の部分に関しては絶対残る。
0214デフォルトの名無しさん
2008/09/01(月) 23:43:37MS がエンタープライズ相手の商売してるから、
個人で趣味で開発してる人へのアピール弱いせい。
あんまりホビープログラムでDBアプリとか書かないし。
0215デフォルトの名無しさん
2008/09/02(火) 00:10:13まだまだこれからの技術。
0216デフォルトの名無しさん
2008/09/03(水) 00:23:39みたいなLINQ書くとselect newの部分でvalue1とvalue2を生成するためにSQLサブクエリが生成されるんだけど、
これってgroup byだけで上手く書き直す方法ないんかなぁ。
というより、生成したクエリを最適化してくれる関数みたいなものはないんだろうか。
0217デフォルトの名無しさん
2008/09/03(水) 08:19:42今後 Entity Fx の側がよっぽど大ごけしないと
LINQ to SQL のグレードアップは見込めない気もする。
LINQ とは別に、SQL 文の最適化ライブラリみたいなの探す方が早いかも。
0218デフォルトの名無しさん
2008/09/03(水) 08:25:31今のLINQのEntityうんたらがもっとしっかりしたものになるということ?
0219デフォルトの名無しさん
2008/09/03(水) 08:44:14同じ LINQ クエリ式を書いたときに、
実際にどういう SQL 文が発行されるかという、
実装上の最適化の部分に関して、
LINQ to SQL の今後にはあんまり期待しない方がいいんじゃないかってこと。
まだ手をつけてる人が少なくて情報少ないけども、
将来を期待したいなら LINQ to Entity Framework の方使うこと考えるのがいいんじゃないかと。
0220デフォルトの名無しさん
2008/09/03(水) 08:46:060221デフォルトの名無しさん
2008/09/11(木) 20:45:390222デフォルトの名無しさん
2008/09/17(水) 20:13:37ソートするのははどうすればいいですか?
var v = from e in GetFoo() orderby e.Age, e.Name select e
OrderBy二回せずに一回でさくっと書きたいです。
0223デフォルトの名無しさん
2008/09/17(水) 22:32:24OrderBy(1つ目の条件).ThenBy(2つ目の条件)
OrderBy 1回というのは無理。
0224デフォルトの名無しさん
2008/09/18(木) 20:14:01ThenByって知らなかった。ありがと。
0225デフォルトの名無しさん
2008/09/19(金) 01:50:550226デフォルトの名無しさん
2008/09/19(金) 03:17:060227デフォルトの名無しさん
2008/09/19(金) 07:24:560228デフォルトの名無しさん
2008/09/28(日) 23:54:29Aggreegate戻り値はIntegerだし、クエリ機能あれば十分なのでは。
LINQ TO XMLとか開発の現場でまず使うのは小数だろうし、可用性が低いよ。
VBチームの自己満足だね。いつものことだけど。
0229デフォルトの名無しさん
2008/09/29(月) 12:49:16VBのAggregate構文のことかEnumerable.Aggregateのことを言ってるのかわからない。
Integerってどういう意味だろう、集計対象の型で集計されると思うけど。
VBのLinqは使いやすくしようと、文法やキーワードを増やしすぎて
収集がつかなくなってるという感じはする。C#と同じにしておけば良かったような。
0230デフォルトの名無しさん
2008/09/29(月) 14:30:310231デフォルトの名無しさん
2008/09/29(月) 14:54:49やっぱりC#のyield知らないとわかりにくいのかな
0232デフォルトの名無しさん
2008/09/29(月) 23:02:22即時実行でないのに違和感を感じるのも分かるな。
0233デフォルトの名無しさん
2008/09/30(火) 11:58:270234デフォルトの名無しさん
2008/09/30(火) 23:43:430235デフォルトの名無しさん
2008/09/30(火) 23:47:50Windows2x時代のAPIは関係ないと思う。
0236デフォルトの名無しさん
2008/10/01(水) 02:17:48Fiberはいつのまにか消えていたってオチかな
0237[Fn]+[名無しさん]
2008/10/02(木) 00:00:540238デフォルトの名無しさん
2008/10/02(木) 00:06:530239デフォルトの名無しさん
2008/10/02(木) 01:54:39standaloneのXMLや部分的なXMLを簡単に扱えることを目指したもの。
はじめからDTDやXMLSchemaはサポートしないことになっていた。
もっともnamespaceを中途半端なサポートはチトいただけないから改良は欲しい。
いっそなくすか、もっと充実させるかどちらかで。
0240デフォルトの名無しさん
2008/10/02(木) 08:21:03ぶっちゃけあれ下層に XmlReader が使えるからでは
ないのかと
0241デフォルトの名無しさん
2008/10/02(木) 13:10:43FOR EACH書かなくてすむし、べた書きのXMLもコードとして扱える。
0242デフォルトの名無しさん
2008/10/03(金) 00:46:470243デフォルトの名無しさん
2008/10/03(金) 10:10:47まあx86にすりゃいいんだけど、デフォがAnyCPUだからなあ。
0244デフォルトの名無しさん
2008/10/11(土) 23:59:110245デフォルトの名無しさん
2008/10/12(日) 00:58:14LINQ to Entity の出た今となってはね。
MS SQL Server でしか使えないって言われてたのは、
SP1 入る前、LINQ to SQL の時代の話。
0246デフォルトの名無しさん
2008/10/12(日) 02:57:11でも Linq -> Entity SQL がサポートされたから、Entity SQL ->
ネイティブ SQL だけでいいじゃん=皆やる気ナスなだけで。
0247デフォルトの名無しさん
2008/10/12(日) 20:47:400248デフォルトの名無しさん
2008/10/13(月) 00:46:17そうじゃないならログ見りゃいいと思うけど・・・
0249デフォルトの名無しさん
2008/10/13(月) 17:15:00実行時でかまいません。
Linq to SQLのようのDataContext.Logプロパティにあたるものが見当たらないようです。
またSystem.DiagnosticsのTraceやDebugでも確認できませんでした。
探し方が悪いのかもしれませんがSQLのログを出力する方法を教えてください。
0250デフォルトの名無しさん
2008/10/13(月) 21:39:14と記憶を頼りにぐぐって気づいたんだが Express にはないのか
このツール。おおう。それとごめんトレースだった
2005 ならこんなの見つけたけど
ttp://code.google.com/p/sqlexpressprofiler/
0251デフォルトの名無しさん
2008/10/17(金) 03:19:46ttp://d.hatena.ne.jp/higayasuo/20081014/1223969275
拡張メソッドとラムダ式と式木と匿名型とvarとあって良かったと思える瞬間。
0252デフォルトの名無しさん
2008/10/17(金) 17:46:420253デフォルトの名無しさん
2008/10/17(金) 19:35:37ああいう風にせざるをえないんだよな。
0254デフォルトの名無しさん
2008/10/17(金) 22:35:240255デフォルトの名無しさん
2008/10/17(金) 22:53:010256デフォルトの名無しさん
2008/10/18(土) 10:13:170257デフォルトの名無しさん
2008/10/27(月) 22:19:23という訳でみんなこれ勉強しろ!!
とりあえずアドバイス、まずは yield return / yield break が自在に使いこなせるようになるといいです。
使い方のコツ
1.シーケンス( IEnumerable<T> 、データベースで言えばテーブル)の生成
2.from ... または System.Linq.Enumerable で加工(繰り返し)
3.ToArray() , ToList() , ToDictionary() , All() , Any() 等で結果生成。
これが標準パターン
元の列を作る → 加工 → 加工 ・・・ → 加工 → 配列化
基本的にこればっかりです。
ちなみに LINQ が真の力を発揮するのはデータベースではなく、日常的に使う配列やオブジェクトです。
いままではデータベースではクエリで簡単に実行できても、プログラム中ではできずと
やむなくデータベースに一旦突っ込んでやるか、フルスクラッチで同等機能を作り出すかと、
無意味なプログラム実行環境の大規模化を引き起こしていました、これが無くなります。
02581
2008/10/27(月) 22:20:21という訳でシーケンスの作り方のコツ
配列や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 に準備して欲しい・・・
02591
2008/10/27(月) 22:21:211.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 に準備して欲しい・・・
02601
2008/10/27(月) 22:22:051.Excelを使うと良く登場するパータンで、前後の要素にアクセスしながら新しい列を作るような手段が実はない
[ ][0]
[3][=A2]
[4][=B2+A3]
[6][=B3+A4]
[2][=B4+A5]
[5][=B5+A6]
左の列を元に、右の列のようなシーケンスを作る関数を作っておくと便利、汎用関数も簡単につくれる。
これなかった頃よく似た関数をあたりにぶちまけてしまった .Net Framework に準備して欲しい・・・
2.ツリー構造の全要素列挙、汎用関数も簡単につくれる。
これなかった頃よく似た関数をあたりにぶちまけてしまった .Net Framework に準備して欲しい・・・
3.コントロールブレイク(コボラーの必殺技)も作っておくと便利。
COBOLは実は触ったことが一度もないのですが、どうも色々便利ノウハウが彼らにはあるようです。
現在鋭意開拓中
0261デフォルトの名無しさん
2008/10/27(月) 22:22:31シーケンスを混ぜて一つのシーケンスを作る系
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()
マニュアルが余りに理解不能な文書なので、動作を確かめながら自分の言葉で整理しておくと便利です。
生成用関数、加工用関数、結果生成用関数の三つに分類してみると、すっきりしてきます。
0262デフォルトの名無しさん
2008/10/27(月) 23:24:32http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=46703&forum=7&2
ぶっちゃけ、この常連しんさんと全く同じ質問なのですが、
この人、質問して、自己解決して、回答書いてないので‥‥
0263デフォルトの名無しさん
2008/10/27(月) 23:38:240264デフォルトの名無しさん
2008/10/28(火) 01:43:360265デフォルトの名無しさん
2008/10/28(火) 03:14:06最も基本の Select, SelectMany が抜けてる
>>262
多分、LINQ to SQLだよな
Add がどこから出てきたのか知らんが、対象がTable<T>なら
データ操作にはInsert〜とかDelete〜あたりをつかう
0266262
2008/10/28(火) 13:58:59どうもありがとうございます。>>262のサイトからさらっと試し始めたので‥‥
InsertOnSubmitを使うんだと分りました。
たぶん、あのサイトは記述が古いんですね。
とっても面白いので、本でも買って真面目に勉強します‥‥
0267デフォルトの名無しさん
2008/10/28(火) 17:52:37基本といえば Where もないね
クエリ式で書けるものは入れてないのかな?
0268デフォルトの名無しさん
2008/10/31(金) 16:20:090269デフォルトの名無しさん
2008/10/31(金) 19:53:08ラムダで書くと見た目が不必要に複雑になるからな
0270デフォルトの名無しさん
2008/10/31(金) 19:59:39データ操作まで無理やりオブジェクト指向にするとかえって記述がグダグダになるんだよ。
データ操作は特化した記述がいい。
0271デフォルトの名無しさん
2008/10/31(金) 20:27:08わざわざ特化した記述作って、新しく覚えないといけなかったら魅力感じないな
0272デフォルトの名無しさん
2008/10/31(金) 20:35:020273デフォルトの名無しさん
2008/10/31(金) 22:23:22全部クエリ式で書けない場合は,joinとかletとか使わない限りは全部拡張メソッドで俺は書いちゃうな
0274デフォルトの名無しさん
2008/11/01(土) 02:17:300275デフォルトの名無しさん
2008/11/01(土) 02:29:340276デフォルトの名無しさん
2008/11/01(土) 09:41:51foreachをネストさせた時の様に変数を扱えるのが便利だね。
これを拡張可能にすると・・・関数型っぽくなる気がする。
0277デフォルトの名無しさん
2008/11/01(土) 09:50:56しかしそれがいい・
>>276
調子に乗ってクエリ式つなげてくと遅くなるらしいからなぁ・・・
記述方法は大好きなんだが。
0278デフォルトの名無しさん
2008/11/01(土) 10:45:55遅くなるってのは意外と平気。
かなりバカに書かない限りはforeach書くのと比べて1割くらいしかパフォーマンス落ちない。
0279デフォルトの名無しさん
2008/11/01(土) 11:38:480280デフォルトの名無しさん
2008/11/01(土) 11:49:52非常に細かいパフォーマンスを気にしているなら、
ラムダ式(デリゲート)を使うので関数の呼び出しがインライン化されないとか、
SumやMaxなど集計系メソッドを複数使った場合にちょっと効率の悪いことをしているとか
そんなところだね。
0281デフォルトの名無しさん
2008/11/01(土) 12:18:38最初のMoveNextの呼び出しの時点ですべての結果が決まるから遅延実行になるのか
速い遅い気にするならどういう実装になってるか気にしないといけないね
0282デフォルトの名無しさん
2008/11/01(土) 12:31:550283デフォルトの名無しさん
2008/11/01(土) 12:37:470284デフォルトの名無しさん
2008/11/01(土) 12:44:360285デフォルトの名無しさん
2008/11/01(土) 12:50:21来年早々にも出してくれんかな・・・
0286デフォルトの名無しさん
2008/11/01(土) 13:11:040287デフォルトの名無しさん
2008/11/05(水) 00:04:480288デフォルトの名無しさん
2008/11/05(水) 00:12:26ちなみに、パスを1段削って、
http://channel9.msdn.com/pdc2008/
にするとPDCのセッションの一覧が出てくる。
0289デフォルトの名無しさん
2008/11/05(水) 00:31:160290デフォルトの名無しさん
2008/11/06(木) 01:31:480291デフォルトの名無しさん
2008/11/06(木) 09:38:50http://ufcpp.net/study/csharp/sp3_linqreconstruct.html#iterator
これ?
foreach で置き換えるだけじゃたいして性能変わらない。
ここで違いが出てるのはそれの次の節の話で、
「if をループの外に出せ」と同じ原理で
「可能な限り where を from の上に」ってやるとパフォーマンス結構変わる。
0292デフォルトの名無しさん
2008/11/06(木) 10:16:15クエリ式は書いた順番どおりに処理していくが、
SQLはプランナが最適な実行計画を立てる。
0293デフォルトの名無しさん
2008/11/06(木) 10:39:15いや書く気毛頭無いですが
0294デフォルトの名無しさん
2008/11/08(土) 12:26:240295デフォルトの名無しさん
2008/11/09(日) 21:52:31出だしだけでもKWSK
0296デフォルトの名無しさん
2008/11/11(火) 17:07:42なんつーか、ぶちまければ良いってもんじゃねぇだろ。
そんなのはオプソ系に任せとけよ。
0297デフォルトの名無しさん
2008/11/11(火) 18:08:390298デフォルトの名無しさん
2008/11/11(火) 18:35:18別に今のところは対して書き方が違うわけじゃないし
Linq to Entity完成までの代打的存在として十分用を果たしたような。
0299デフォルトの名無しさん
2008/11/11(火) 22:44:48ストーリーにちゃんと沿わないと痛い目あうがなwww
0300デフォルトの名無しさん
2008/11/11(火) 23:18:07開発が止まるだけで今後も当面は.NET Frameworkに標準搭載が続くんじゃないの?
0301デフォルトの名無しさん
2008/11/12(水) 00:12:05間違いない。
0302デフォルトの名無しさん
2008/11/12(水) 00:44:11まあVer.3ぐらいになるまでは毎回大変更の嵐だろうな。
0303デフォルトの名無しさん
2008/11/12(水) 17:23:24デザイナが使いにくすぎる。
RailsのActiveRecordみたいに
ちょこちょこっとクラスに属性を付ければモデル完成、
ってのフレームワークだったらよかったのに。
0304デフォルトの名無しさん
2008/11/20(木) 12:30:10更新系では、生のSQL文に完全なWHERE句を入れてくれるし、
非接続型・楽観的制御(←赤間さん流)では文句なし。
あと、生SQLのサブクエリ相当の組み合わせを段階を踏んで書けるのもいい。
デバッグも迅速になりそう。
0305デフォルトの名無しさん
2008/11/20(木) 15:06:450306デフォルトの名無しさん
2008/11/20(木) 21:51:19消える運命にあるが
0307デフォルトの名無しさん
2008/11/20(木) 22:15:10今のはちょっとSQL Serverに特化しすぎてるからディスコンかもしれないけどさ。
0308デフォルトの名無しさん
2008/11/20(木) 22:16:56この方向性で進化した結果がLinq to Entityなんだけど、今のところいまいちの出来。
0309デフォルトの名無しさん
2008/11/20(木) 22:32:43Entity Framework自体まだ手を付けてないのだが、どういまいち?
0310デフォルトの名無しさん
2009/01/04(日) 23:25:17Select Sum(col1),Sum(col2),Sum(col3) from Table1
なSQLだとLINQではどう書くの?
0311デフォルトの名無しさん
2009/01/04(日) 23:46:52そんな質問はつい最近掲示板で見た事あるな
0312デフォルトの名無しさん
2009/01/04(日) 23:59:48ttp://bbs.wankuma.com/index.cgi?mode=all&namber=30713
0313デフォルトの名無しさん
2009/01/05(月) 00:53:250315デフォルトの名無しさん
2009/01/07(水) 03:06:42from item in Table1
select new {Sum1 = item.col1.Sum(), Sum2 = item.col2.Sum(), Sum3 = item.col3.Sum(), }
でいいんじゃね?
0316デフォルトの名無しさん
2009/01/07(水) 04:16:091回のループで計算したいなら、アキュムレータ使うしかないはず
var sum = Table1.Aggregate(new[] { 0, 0, 0 }, (y, x) => {
y[0] += x.col1;
y[1] += x.col2;
y[2] += x.col3;
return y;
});
0317デフォルトの名無しさん
2009/01/07(水) 05:35:25それはクエリプロバイダ次第じゃなかろうか。
確かに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でも最適化されたと思うが。
0318デフォルトの名無しさん
2009/01/07(水) 08:09:530319デフォルトの名無しさん
2009/01/07(水) 08:21:29Linq to Entityかもしれない。
0320デフォルトの名無しさん
2009/01/07(水) 10:45:440321デフォルトの名無しさん
2009/01/07(水) 12:34:27考え方はいいとして、>>315のコードが間違っているのは無視か
var sum1 = Table1.Sum(item => item.col1);
var sum2 = Table1.Sum(item => item.col2);
var sum3 = Table1.Sum(item => item.col3);
やるならこうだろ
0322デフォルトの名無しさん
2009/01/07(水) 14:07:35確かに間違ってるな。
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();
0323デフォルトの名無しさん
2009/01/07(水) 14:08:380324デフォルトの名無しさん
2009/01/31(土) 19:41:18初心者なりに考えてみた。
全然スマートじゃないけど勘弁してね。
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)
});
0325デフォルトの名無しさん
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)
});
0326デフォルトの名無しさん
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のスレにもレスさせて頂きます。ご了承くださいませ。
0327デフォルトの名無しさん
2009/02/20(金) 07:06:29マルチ乙
0328デフォルトの名無しさん
2009/02/20(金) 18:50:070329デフォルトの名無しさん
2009/02/21(土) 04:59:59中国のばったものの会社?
0330デフォルトの名無しさん
2009/02/21(土) 21:28:410331デフォルトの名無しさん
2009/02/23(月) 00:42:52<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から順番になるように保つ、という感じです
0332デフォルトの名無しさん
2009/02/23(月) 00:53:410333デフォルトの名無しさん
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>
0334デフォルトの名無しさん
2009/02/23(月) 02:42:54<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を直接変更してもいいと思う。
0335デフォルトの名無しさん
2009/04/14(火) 23:27:35Linq の機能(Where メソッドとか)を使いたいのですが、
UIElementCollection にはそのメソッドがありません。
どうすれば Linq の機能が使えるでしょうか?
0336デフォルトの名無しさん
2009/04/14(火) 23:34:03いったん、 .OfType<UIElement>() っての通すと使える気がする。
0337デフォルトの名無しさん
2009/04/15(水) 11:49:27※foreach(UIElement item in collection)相当
OfTypeを使うのはOfType<Button>みたいに意図的に型をフィルタリングするときだけ
0339デフォルトの名無しさん
2009/04/19(日) 23:45:460340デフォルトの名無しさん
2009/04/20(月) 12:48:210341デフォルトの名無しさん
2009/04/20(月) 18:09:580342デフォルトの名無しさん
2009/04/20(月) 20:08:480343デフォルトの名無しさん
2009/04/20(月) 22:24:47a.ToList().ForEach(i => Trace.WriteLine(i) );
ForEach するために毎回 ToList() してるんだけど、
ToList() しなくてすむ方法ないの?
0344デフォルトの名無しさん
2009/04/20(月) 22:33:14素直に foreach (var i in a) するか、自分で IEnumerable 用の ForEach 拡張メソッド書くか。
0345デフォルトの名無しさん
2009/04/20(月) 22:35:220346デフォルトの名無しさん
2009/04/20(月) 22:59:17TargetName を指定したら、Style では TargetName は指定できないという
エラーが出てしまいました。
回避する方法はありますか?
0347346
2009/04/21(火) 06:16:250348デフォルトの名無しさん
2009/04/25(土) 15:04:390349デフォルトの名無しさん
2009/04/25(土) 15:04:530350デフォルトの名無しさん
2009/04/30(木) 20:23:27class Order
{
string syohin;
DateTime transactTime;
}
class SpecialInterval
{
string syohin;
DateTime applyDayFrom;
DateTime applyDayTo;
}
で、Orderは数万件以上、SpecialIntervalは数十件以上あります。
これで、Orderの中から、syohinが一致してなおかつtransactTimeがapplyDayFrom〜
applyDayToの間にあるOrderだけを取得したいのですが、どうしたら
いいでしょうか?
0351デフォルトの名無しさん
2009/04/30(木) 20:46:13join si in context.Special on order.shyohin equals si.syohin
where si.applyDayFrom < order.transactTime && order.transactTime < si.applyDayTo
select order
ではダメ?
0352デフォルトの名無しさん
2009/05/21(木) 21:21:06.NETの後継??
0353デフォルトの名無しさん
2009/05/21(木) 21:32:08Visual StudioはVisual Studio
0354デフォルトの名無しさん
2009/05/21(木) 22:07:370355デフォルトの名無しさん
2009/05/21(木) 22:08:10それだと、.NETは要らない子になっちまうじゃないか。
0356デフォルトの名無しさん
2009/05/21(木) 22:59:46吹いたww
0357デフォルトの名無しさん
2009/05/21(木) 23:13:020358デフォルトの名無しさん
2009/05/22(金) 13:52:090359デフォルトの名無しさん
2009/05/22(金) 14:38:39.NET = パイナップル
VS = 酢豚
っていう結論でいいのか?w
0360デフォルトの名無しさん
2009/05/30(土) 17:03:50VS = IDE
0361デフォルトの名無しさん
2009/06/01(月) 13:49:45ありがと!謎が解けました!!
0362デフォルトの名無しさん
2009/06/24(水) 16:09:020363デフォルトの名無しさん
2009/07/08(水) 22:18:41ふと「これ、何のために使っているんだろう」と思ってしまう。
旧.netと互換性がなくなる上に、実行速度は条件次第(そして多くの場合)落ちるし。
これらの目的は「可読性を上げる」って認識でおk?
0364デフォルトの名無しさん
2009/07/08(水) 22:31:05Generics もないので互換性気にするだけアレというか・・・
Linq to Objects は遅くなるのは確かだけどスケーラビリティは
あるんだよなぁ。Linq がといったほうがいいかもしれないけど
0365デフォルトの名無しさん
2009/07/08(水) 22:35:58思わないなら別に使わなくていいだろ。
自分はIEnumerable<T>系を自分のライブラリでも多用してるし、yield使わないでIEnumerable返すコードなんか書きたくもないが。
0366デフォルトの名無しさん
2009/07/08(水) 22:36:57yieldはフレームワークを作る人のための機能、LINQは使う人のための機能だな
0367デフォルトの名無しさん
2009/07/08(水) 22:38:09CTPで試したけど、お手軽並列化はかなり便利だった。
0368デフォルトの名無しさん
2009/07/08(水) 22:38:59確かに非常に楽にはなるし、拡張も楽だし、バグも入りにくいと思う。
でも、コードレビューに速度至上主義者がいるとそれが理解されないのよね。
0369デフォルトの名無しさん
2009/07/08(水) 22:48:23「なんか遅そうなコード」を見ただけで騒ぐのは
速度至上主義者じゃなくてただの阿呆や
0370デフォルトの名無しさん
2009/07/08(水) 22:49:54IEnumerableを返すメソッドを手で書いたところでyieldより効率のいいものができるとは考えにくい
LINQは素直すぎるだけだ
0371デフォルトの名無しさん
2009/07/08(水) 23:08:48一度実行されると、二回目からは高速化する構造になっているしね。
LINQを使わない場合は、平均して中速になる。
ある意味LINQを使わないというのはパフォーマンス的には使いやすいかもしれないが、コーディングの楽さとそこそこのパフォーマンスの両得確保を目指すなら
LINQは外せないはず
0372デフォルトの名無しさん
2009/07/08(水) 23:14:43LINQでのパフォーマンスの劣化なんてよっぽどの所でないと誤差の範囲。
0373デフォルトの名無しさん
2009/07/08(水) 23:20:03式木とクエリ式混同してない?
少なくとも、LINQ to object は動的生成一切ないよ。
foreach でコレクション操作するのに比べて、
静的メソッド呼び出しがちょっと増えて、その分のパフォーマンス落ちる程度。
静的メソッド呼び出しのコストなんてほんとたかが知れてて、
ほんの数%の最適化が必要な超クリティカルな場面以外は気にする必要ない。
0374デフォルトの名無しさん
2009/07/08(水) 23:24:03クエリ演算子を繋げることによってネストされた列挙子ができて、列挙自体のコストがちょっとだけ増えるんだよ
0375デフォルトの名無しさん
2009/07/08(水) 23:26:16かかるコストは静的メソッド呼び出し分じゃなくて、
仮想メソッド分になるか<列挙子のネスト。
0376デフォルトの名無しさん
2009/07/08(水) 23:27:55foreachなどでやる場合は、連続したシーケンス操作では計算した値を何処かに確保して
また計算してというのが繰り返されているのに対して、クエリをバシバシつなげた場合は、中間データが作られないで処理される。
データ処理が縦に輪切りで処理するか横に輪切りで処理するかが変わる
この時決定的な差として、キャッシュの使用量がLINQを使った場合の方が小さくなって結果的に高速化するケースは多い。
オレはこっちの効果を重要視している
0377デフォルトの名無しさん
2009/07/08(水) 23:29:27CPUのデータキャッシュの事ね、今のプロセッサではこれが決定的なパフォーマンスを決める
0378デフォルトの名無しさん
2009/07/08(水) 23:36:57Reverseみたいに、遅延実行の演算子の中にも危ないのがあるので注意
0379デフォルトの名無しさん
2009/07/08(水) 23:37:56配列を返させてたところはこれに変えられる。
0380デフォルトの名無しさん
2009/07/08(水) 23:38:06気にしなくていいと思うけどね、よほどの問題が発生しない限り
0381デフォルトの名無しさん
2009/07/09(木) 00:00:11実際のところ、測ってみたら速くならなくない?
1段ラッパーされてる分のペナルティの方が大きくて。
そういうレベルの話よりは、
データ列の処理ってのを1段階抽象化してるから、
LINQ to SQL/Entity みたいなクエリ化もできるし、
PLINQ みたいな並列化もできるしって辺りの
もっと抽象度高い話しないと LINQ の価値出ない気も。
0382デフォルトの名無しさん
2009/07/09(木) 00:09:58使い方を変えずにExpressionTreeで一つの大きな列挙子に展開することだって可能なわけで、
そういうところがLINQのポテンシャルなんだろうな
0383デフォルトの名無しさん
2009/07/09(木) 06:19:38サイズの小さい関数の呼び出しはJIT時にインライン化されるが、
デリゲートで呼び出された関数はどんなに小さいものでもインライン化されないようだった。
関数のサイズを大きなものに変えた場合はどちらもほぼ同じ結果になった。
こういう関数があった場合、
int Hoge1(int x) { return x * x; } // こっちはインライン化されるコード
インライン化されない関数の作り方としては、xは-10000以下にならないという前提で
int Hoge2(int x) {
if (x > -10000) return x * x;
: 実際には実行されない大量のコード
}
0384デフォルトの名無しさん
2009/07/09(木) 08:40:190385デフォルトの名無しさん
2009/07/09(木) 08:44:040386383
2009/07/09(木) 09:18:21Enumerable.Whereで条件を指定するところなどLinqの随所にdelegateが使われているわけだ。
その部分をdelegateを使わない形に書き直せば、yieldや拡張メソッドを使っていても、
多重ループで書いたのとそう変わらない結果がでる。
>>382の
>デリゲート呼び出しのコストがやっぱり大きいんじゃないかな
に同意と言いたかった。
>>385 おおありがとう。インラインの抑制はそのほうがスマートですな。
0387デフォルトの名無しさん
2009/07/09(木) 09:36:21ああいうページいつもどこ行ったか忘れちゃうんだよな・・・
0388デフォルトの名無しさん
2009/07/09(木) 09:50:59最適化できなくなるんだから
0389デフォルトの名無しさん
2009/07/09(木) 10:00:52そんだけ速いの欲しかったらアセンブラで書いとけよ。
0390デフォルトの名無しさん
2009/07/09(木) 13:22:470391デフォルトの名無しさん
2009/07/10(金) 01:06:06int index = 0;
var numbered =
from p in source
let gomi = (++index)
select new { Index = index, Data = p };
と、アホまっしぐらなコードに。
そもそも副作用のある式を入れている時点でマズイとは思うけど
これ以外に手はあるんでしょうか?
0392デフォルトの名無しさん
2009/07/10(金) 01:26:450393デフォルトの名無しさん
2009/07/10(金) 05:27:16クエリ構文だとやれることが少ないことに気づくと、だんだメソッド構文ばかり使うようになる
0394デフォルトの名無しさん
2009/07/10(金) 08:19:37こんな便利なバージョンがあったとは。
0395デフォルトの名無しさん
2009/07/10(金) 16:21:58ムキになってメソッドでやるのもどうかと思うんだが……
VBのXMLリテラルなんぞを見ていると、やっぱ便利だし読みやすいし。
あんまり拡張メソッドに拘って欲しくないんだけどな
0396デフォルトの名無しさん
2009/07/10(金) 22:45:31XLINQ自体は良いものだとは思うけどそんな普及するかどうかもわからない
実験的なものをいきなり言語に組み込むとか
0397デフォルトの名無しさん
2009/07/10(金) 23:20:370398デフォルトの名無しさん
2009/07/11(土) 00:00:36XMLリテラルはXDocumentやXElementといった
LINQ to XMLのクラスを使っているだけで。
って、LINQ to Schema for VB SUGEEEE!!こりゃ楽だわ。C#じゃ使えないのか。
0399デフォルトの名無しさん
2009/07/11(土) 00:09:02言語仕様レベルで依存してるんだから
それくらいしないとVBユーザーは新しいものを使おうとしないだろうとか考えたのかな
0400デフォルトの名無しさん
2009/07/11(土) 00:16:09使ったことないで言ってるでしょ。
0401デフォルトの名無しさん
2009/07/11(土) 01:13:05使ってるのはLinq to Objectの構文だけで、拡張はクラスライブラリだけ。
VBでは言語構文の拡張もやってて、XMLリテラルもその一種。
0402デフォルトの名無しさん
2009/07/15(水) 18:58:43書き方はすごく楽だね、こりゃ。
…けど、これってLINQ to XMLで書いてしまうと
XMLでデータの不整合や値のレンジ外が見つかった時に
XMLのエラー箇所を通知するのが難しい気がする。
例外できないんじゃ実用性って…
0403デフォルトの名無しさん
2009/07/15(水) 22:02:46LoadOptions.SetLineInfoを活用しようとして、
ToDictionaryの代わりにToLookup+重複のないことの検査したり、
Count != 1なら自前の例外を投げてから、Single呼んだりする羽目になっている。
0404デフォルトの名無しさん
2009/07/15(水) 22:18:29スキーマ検証周りならベースにまず XmlReader を使え。
XmlReaderSettings で XmlSchemaSet が指定できる
XLinq 上でもエラー処理したいときは、読み込み周りのオプ
ションで XmlReaderSettings の指定とさらに LoadOptions の
SetBaseUri や SetLineInfo オプションも忘れずに
0405デフォルトの名無しさん
2009/07/16(木) 00:18:20>>403
後、フィルタ以外を全部取り除いておいて最低限にしておいて
データ一個だけ処理する関数を作ってその中で処理したり
return from p in hoge.Elements("Hoge")
where (int?)p.Value < 0
select CreateHogeInstance(p); ←この中で整合性チェックして例外を投げる
結構マヌケな作りな気がする。
0406デフォルトの名無しさん
2009/07/16(木) 00:20:280スタートのindexがくっついてくるSelectWithCountとか自分的に便利。
0407デフォルトの名無しさん
2009/07/16(木) 04:16:14それって標準のと何が違うの?
http://msdn.microsoft.com/ja-jp/library/bb534869.aspx
0408デフォルトの名無しさん
2009/07/16(木) 08:01:45まったく同じ機能を再発明しちゃった人までいるのか。
0409406
2009/07/16(木) 08:29:31WhereWithCountとか色々作ったのに・・・
0410デフォルトの名無しさん
2009/07/16(木) 10:22:56Count() > 0とかやっちゃってる人も多そう
0411デフォルトの名無しさん
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);
}
0412デフォルトの名無しさん
2009/07/16(木) 14:51:150413407
2009/07/16(木) 17:27:01> Count() > 0とかやっちゃってる人
……、ごめんなさい。私です。
>>411
それ、自分はC++から来たからForEachって名前にしたい、特に後者。
0414デフォルトの名無しさん
2009/07/16(木) 17:42:570415デフォルトの名無しさん
2009/07/16(木) 19:36:16Count使うと最後まで読まないといけないからパフォーマンスが悪いはず
Anyは一件あるかないかだから速いはず
0416デフォルトの名無しさん
2009/07/29(水) 01:05:170417デフォルトの名無しさん
2009/09/12(土) 18:41:510418デフォルトの名無しさん
2009/09/12(土) 19:39:22IEnumerableを参照する全ての場所で例外が起こるかもしれない、
となると例外安全の確保をしなきゃならない範囲が滅茶苦茶広くなるし、
任意のtry-catchで捕まえることもできない。
自分は「LINQ中に例外を外に投げる処理は入れるな」で対応している。
0419デフォルトの名無しさん
2009/09/12(土) 23:31:270420デフォルトの名無しさん
2009/09/13(日) 00:16:470421デフォルトの名無しさん
2009/09/14(月) 20:55:08ruby の each_slice みたいなのがやりたいのですが。
0422デフォルトの名無しさん
2009/09/14(月) 21:12:59{
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); }
}
0424デフォルトの名無しさん
2009/09/15(火) 21:59:43source.Select((x, i) => new { Key = i / n, Element = x })
.GroupBy(x => x.Key, x => x.Element)
.Cast<IEnumerable<TSource>>();
0425デフォルトの名無しさん
2009/09/16(水) 06:48:18拡張メソッドはガンガン使うべきなのかは迷うところ。
0426デフォルトの名無しさん
2009/09/16(水) 21:47:09.NET4.0とラブプラスのことで頭が一杯です。
0427422
2009/09/17(木) 11:04:44static 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);
}
メモリは食うけどこっちの方が確実
0428デフォルトの名無しさん
2009/09/17(木) 11:22:16こんなの用意して代わりに使うか
static IEnumerable<TSource> SkipTake<TSource>(TSource[] source, int skip, int take) {
for (int i = 0; i < take; i++) yield return source[i + skip];
}
0429デフォルトの名無しさん
2009/09/17(木) 17:10:470430デフォルトの名無しさん
2009/09/17(木) 19:00:29422のyield return bufを
yield return buf.ToArray()に変えるだけで良いかと。
あと最後はbuf.Take(i)でいいかな。
0431デフォルトの名無しさん
2009/09/17(木) 19:07:120432デフォルトの名無しさん
2009/09/27(日) 19:20:03bar = foo.Select(i=>Baz(i) );
foo = foo.Select(i=>!Baz(i));
みたいに2回Selectしてるんですが、
1回で済む方法ないですか?
0433432
2009/09/27(日) 19:23:150434デフォルトの名無しさん
2009/09/27(日) 19:24:56両方ほしいなら2回しないといけないと思うけど。
やりたいことが見えない。
0435デフォルトの名無しさん
2009/09/27(日) 19:37:47Linqで同じようにできないか、っていう質問だろうね。
気持ちは分かるけど多分できないんだろうなあ。
Linqの想定用途はあくまで選択や射影の簡略化だろうし、振り分け処理で
無理矢理Linq使う必要無いんじゃない?と思う。foreachでいいじゃん。
0436デフォルトの名無しさん
2009/09/27(日) 19:49:14IEnumerable<T>受け取ってTuple<IEnumerable<T>, IEnumearble<T>>でもを返すようにしてさ。
0437432
2009/09/27(日) 19:58:37以下のように書きました。
foreach(var 条件 in 条件リスト){
var マッチしたもの = 集合.Where(条件)
集合 = 集合.Where(!条件)
(マッチしたものに対する処理)
}
というループを書いていたのですが、
ruby の partition メソッドみたいなのがあれば
一回ですむじゃん。
と思ったのですが、ヘルプをみてもわからず、
ググってもわからず、なので質問させていただきました。
処理が重いので1パスにしたいというわけではないので、
2回 Where するままにしておきます。
レスありがとうございました。
0438デフォルトの名無しさん
2009/09/27(日) 20:11:24Func<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);
0439デフォルトの名無しさん
2009/09/27(日) 21:04:04ruby の partition メソッドはズバりGroupBy。
ToLookupはその即時評価版。
0440デフォルトの名無しさん
2009/09/29(火) 02:41:06おもしろそうだからこれを使って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());
}
0441デフォルトの名無しさん
2009/10/10(土) 19:43:10C#のコード中に普通にselectとかfromとか書くのは違和感あるなぁ。
C#の予約語になってんのかね?
0442デフォルトの名無しさん
2009/10/10(土) 19:44:40文脈キーワード
0443デフォルトの名無しさん
2009/10/13(火) 12:02:58ほんのちょっと前までデータベースからデータを「SELECT * FROM TABLE」で持ってきて
コード内でデータの取捨を行うなんて、やっちゃだめの最右翼だったのに、すんげえ
富豪的プログラミングだなあ…。
0444デフォルトの名無しさん
2009/10/13(火) 12:30:06内部で式評価を最適化しているわけではない
0445デフォルトの名無しさん
2009/10/13(火) 12:54:50Linq to SQLやEntity Frameworkの場合はDBMSのSQLに翻訳されるから、
DBMSのプランナが機能する。
0446デフォルトの名無しさん
2009/10/13(火) 19:08:080447デフォルトの名無しさん
2009/10/13(火) 19:17:58とりあえずDataContext.Logで吐かれるSQLを確認するところから
はじめたらどうだ?
0448デフォルトの名無しさん
2009/10/13(火) 20:29:13>>443 のような酷い勘違いは初めて見たけど。
0449デフォルトの名無しさん
2009/10/13(火) 20:40:37コード生成のコストが高いからあんまり意味なさそう
0450デフォルトの名無しさん
2009/10/13(火) 21:37:17Whereの条件とかは式ツリーだけど、Where自体は式ツリーでない
>>447-448
まあ、LINQ to SQLで生成されるSQLも大概だがな
作成したクエリ(IQueryable)をそのまま変換してるからサブクエリが深すぎて何が何やら
0451デフォルトの名無しさん
2009/10/13(火) 23:25:35そう。ただ実行の度に発行される。ToList()すりゃ1回ですむけども。
0452デフォルトの名無しさん
2009/10/26(月) 18:34:12///) ノ´⌒`ヽ
/,.=゛''"/γ⌒´ \
/ i f ,.r='"-‐'つ ""´ ⌒\ )
/ / _,.-‐'~ \ / i ) こまけぇことはいいんだよ!!
/ ,i ,二ニ⊃ (・ )` ´( ・) i,/
/ ノ il゛フl (__人_). |
,イ「ト、 ,!,! \ `ー' /
/ iトヾヽ_/ィ" `7 〈
0453デフォルトの名無しさん
2009/11/07(土) 12:28:38キャッシュがないから遅延されても重くなるだけじゃないか?
結局はToList()しまくるハメになっている気がする。
0454デフォルトの名無しさん
2009/11/07(土) 13:04:29最適化とか考えてくとだんだんめんどくさくなりそうだけど。
つーかいい加減データアクセスモデルはナイスな奴一つにまとめてくれ。
Oslo?
0455デフォルトの名無しさん
2009/11/07(土) 19:58:090456デフォルトの名無しさん
2009/11/09(月) 14:02:34今のモデルで悪くないと思うがな。
そもそも本当にチューニングが必要な場所ならLinqは使わないだろ。
性能云々うるさいやつ向けに..Optimize()あたりを追加してみるか?
0457デフォルトの名無しさん
2009/11/09(月) 17:37:01パラダイムを混ぜこぜにするとよく起こる
0458デフォルトの名無しさん
2009/11/10(火) 17:39:440459デフォルトの名無しさん
2009/11/13(金) 00:55:32スケーラビリティ?だべ。要素数がドカーンって
なっても使えるという意味での。
0460デフォルトの名無しさん
2009/11/15(日) 02:05:16今は、
var list = new List<T>();
list.Add(item);
list.AddRange(foo.SelectMany(i => bar(i)));
のように書いてますが、なんか
冗長な気がします。
1個要素を足すためだけに List のインスタンスを
生成するのは無駄な気がするんですが、
避ける方法ないでしょうか?
0461460
2009/11/15(日) 02:16:19foo.SelectMany(i=>bar(i)).Concat(new[]{ item });
と書けた。
でも、配列生成してんのが無駄な気がするが、
回避する方法ないよね?
( new List<T>(){ item } とかは無しでw)
0462デフォルトの名無しさん
2009/11/15(日) 03:02:150463デフォルトの名無しさん
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;
}
0464デフォルトの名無しさん
2009/11/15(日) 11:46:45Enumerable.Repeat(item, 1) で回避。
0465デフォルトの名無しさん
2009/11/15(日) 12:01:400466デフォルトの名無しさん
2009/11/15(日) 12:17:350467デフォルトの名無しさん
2009/11/15(日) 16:28:58それたぶん配列作った方が効率的
Rangeで作られるイテレータよりも配列のイテレータの方がずっと速いはず
0468467
2009/11/15(日) 16:30:400469デフォルトの名無しさん
2009/12/11(金) 00:11:22Linq to Object では、抽出するだけなのでしょうか?
0470デフォルトの名無しさん
2009/12/11(金) 00:17:14List 自体の更新?
LINQ 以前に、GetEnumerator で列挙してる最中にリストのアップデートかけちゃダメ。
list[i] = xxx; 的なことがしたいって場合も、GetEnumerator じゃ無理。
list[i].Property = xxx; 的なことなら、
foreach (var x in list.Select(xxx)) x.Property = xxx; で可能。
0471469
2009/12/11(金) 23:15:10ありがとうございます。
LINQ は便利だなぁと(ソートもしてくれるし), PLINQ にもなるし;
抽出した内容を判別して、データを変更できるんだろうなぁと思っていました。
0472デフォルトの名無しさん
2009/12/12(土) 14:18:30それを認めると LINQ 中で副作用起こすのを推奨しちゃうことになるから避けたらしい。
list.Select(x => xxx).Foreach(x => x.Property = xxx);
みたいなのは邪道。
LINQ 中では副作用は起こさないこと推奨。
0473デフォルトの名無しさん
2009/12/12(土) 14:47:28int count = 0; var distList = from i in srcList select new { Val=i, Index=++count };
みたいな事をやっちゃうよねw
そういうノウハウってどこかにまとまっていないのだろうか?
MSDNにLINQの使い方ガイドラインってないよね?
0474デフォルトの名無しさん
2009/12/12(土) 15:48:41よほど理解して使わないと。
0475デフォルトの名無しさん
2009/12/12(土) 18:32:10msが言ってるの?
0476デフォルトの名無しさん
2009/12/12(土) 18:45:02「ifの中に副作用のある式を書くな」なんて昔から言われているし
0477デフォルトの名無しさん
2009/12/12(土) 18:50:51.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();
}
}
0478デフォルトの名無しさん
2009/12/12(土) 20:20:23標準的な使い方である「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するのが正解か
0479デフォルトの名無しさん
2009/12/13(日) 03:24:35何言ってんのw
0480デフォルトの名無しさん
2009/12/13(日) 03:41:07のは気をつけないと忘れてて、あれうごかねぇとかたまにやるw最近は体が覚えてきたが。
>478
うちのバカエンジニアとかでもおなじようなことしてそうでこえぇ。
0481デフォルトの名無しさん
2009/12/13(日) 19:31:28自分一人ならこういうノウハウもすぐに納得して「そりゃそうだ」で済ませれるが、
仕事でチームでやっていると全員がLINQを理解しているわけじゃないから、そうもいかないのよね。
気がつくと新人がコメントに「//なぜかこのToListを外すとぬるぽ」とか書いてたりするw
0482デフォルトの名無しさん
2009/12/14(月) 13:13:04未熟な人間にあわせてどうすんねんw
0483デフォルトの名無しさん
2009/12/14(月) 17:16:24そんなに大して問題にはならない。
クライアントサイドでリスト形式の一時データを参照をする場合になら使える程度だと思う。
0484デフォルトの名無しさん
2009/12/14(月) 17:30:49自分の理解できないものを嫌う気持ちもわからんではないがね。
そういう人はLinq以前にORMも使えないのだろう。
0485デフォルトの名無しさん
2009/12/14(月) 22:08:07新しい技術を導入したらアホがアホなことをしないように、
実装規約やガイドラインを用意しなきゃならんのよ。辛いことに。
0486デフォルトの名無しさん
2009/12/15(火) 06:45:06そしてDB更新系で落とし穴に。。。
0487デフォルトの名無しさん
2009/12/15(火) 22:32:420488デフォルトの名無しさん
2010/01/15(金) 22:13:23・想定外の値が返ってくると思ったら、LINQの遅延評価+キャプチャが原因だったでござる。
・新人が遅延評価+ソースの値の変更を前提としたコードを作っていたでござる
コードの各所に見えない依存関係ができてもうやだ…
自分のコードは副作用のないようにしているが、他人のコードはどこまで追っかけても分からん…
0489デフォルトの名無しさん
2010/01/16(土) 01:16:010490デフォルトの名無しさん
2010/01/16(土) 01:49:49後段に更に条件を繋げられるようになるのだから、指針としては悪くない。
キャプチャのほうは本当に注意深くやらなきゃいけないのに、無頓着な人いるよね……
0491デフォルトの名無しさん
2010/01/16(土) 10:37:330492デフォルトの名無しさん
2010/01/16(土) 10:40:55わからないから聞いちゃう><
0493デフォルトの名無しさん
2010/01/16(土) 14:50:190494デフォルトの名無しさん
2010/01/16(土) 14:50:23それを利用して長く状態持たせたりすると凶悪
0495デフォルトの名無しさん
2010/01/16(土) 14:55:39もしかしてunsafeがらみの話?
0496デフォルトの名無しさん
2010/01/16(土) 15:05:45int i = 0;
otherClass.Items = source..Where(x=>x.Value == i++);
こんなことされるともうどうなるか分からないだろ
OtherClassのItemsの評価回数に依存することになる
0497デフォルトの名無しさん
2010/01/16(土) 21:53:13いいたいことはわかるが動くコードかこうな。
説得力ないから。
0498デフォルトの名無しさん
2010/02/04(木) 18:12:53LINQには、バージョンはあるのでしょうか?
VS等のバージョンはどんどんとあがっていっていますが、
コードが同じもので動かなくなるかどうかを知りたいです。
例えば、CLRに完全依存の構造なので、CLRバージョンが変わる時に
注意が必要、など
0499デフォルトの名無しさん
2010/02/04(木) 20:54:490500デフォルトの名無しさん
2010/02/05(金) 13:27:50LINQで更新や削除は行えるのでしょうか?
たとえ行えたとしても、細かい制御が出来ないからADO.NETで
ExecuteNonQuery使った方が楽っていう結論になってたりするのかな?
0501デフォルトの名無しさん
2010/02/05(金) 13:29:30Linq to Entity
両方ともORMだから可能。
0502デフォルトの名無しさん
2010/02/05(金) 13:52:180503デフォルトの名無しさん
2010/02/05(金) 19:05:380504デフォルトの名無しさん
2010/02/05(金) 19:26:15結局はエンティティと対になるストアドプロシージャを組んでしまう。LINQ気持ち悪い。
0505デフォルトの名無しさん
2010/02/05(金) 21:36:190506デフォルトの名無しさん
2010/02/07(日) 17:03:06WHERE句を元にUPDATE句やDELETE句を組み立てて、DataContext.ExecuteCommand()を実行する
ような拡張メソッドを用意するのが良いと思うよ。
そうすれば、更新処理はADO.NETを使ってベタでとかやらずに、トランザクションや排他に
ついてはExecuteNonQueryと同じ考え方で設計出来るから。
っで、それ以上の事をやりたくなったらストアドで。
0507デフォルトの名無しさん
2010/02/08(月) 01:17:13結局はSQLを書くってこと?LINQの意味なくない?
0508デフォルトの名無しさん
2010/02/08(月) 06:55:49ttp://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
0509デフォルトの名無しさん
2010/02/13(土) 17:28:02取り出すには、どうすればいい
0510デフォルトの名無しさん
2010/02/13(土) 17:48:110511デフォルトの名無しさん
2010/02/13(土) 18:48:06int[] 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());
0512デフォルトの名無しさん
2010/02/13(土) 19:27:290513デフォルトの名無しさん
2010/02/13(土) 20:55:57ていうか拡張メソッドが面白いのか
0514デフォルトの名無しさん
2010/02/13(土) 20:59:490515デフォルトの名無しさん
2010/02/13(土) 21:50:24という使い分け。テーブルには絶対にLINQでアクセスしない。
MVVMデザインアプローチで組んでいるが、まずLINQの出番はない。
0516デフォルトの名無しさん
2010/02/13(土) 21:57:310517デフォルトの名無しさん
2010/02/13(土) 22:22:07やべえ調子に乗って使いまくるところだったww
0518デフォルトの名無しさん
2010/02/13(土) 23:04:13他のLINQ to ホゲホゲについてはまた別の捉え方だけど。
0519デフォルトの名無しさん
2010/02/13(土) 23:06:47メソッド形式で使ってる限りはループで書くのに比べて見づらくなることもまず無いし
0520デフォルトの名無しさん
2010/02/13(土) 23:16:260521デフォルトの名無しさん
2010/02/14(日) 00:03:100522デフォルトの名無しさん
2010/02/14(日) 00:14:49無理にLINQtoSQLを使うことはない。
0523デフォルトの名無しさん
2010/02/14(日) 00:24:090524デフォルトの名無しさん
2010/02/14(日) 00:25:340525デフォルトの名無しさん
2010/02/14(日) 00:36:00副作用起こす系統はLINQの標準には入れたくなかったんじゃないかと。
0526デフォルトの名無しさん
2010/02/14(日) 00:36:11>>472
まぁそれでも作ろうと思えば
public static void Foreach(this IEnumerable<T> source, Action<T> callback) { foreach(var i in source) callback(i); }
簡単に自作できちゃうが。
0527デフォルトの名無しさん
2010/02/14(日) 00:45:40なるほどー
>>526
それ作ったw
0528デフォルトの名無しさん
2010/02/14(日) 13:40:26激しくランタイムに依存するわけだけど全部言語仕様にハードコードするのかな
0529デフォルトの名無しさん
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ときて、これ以上、知識の習得に無駄な寄り道は出来れば
避けたいのですが。
みなさん、よろしくお願いします。
0530デフォルトの名無しさん
2010/02/15(月) 21:06:510531デフォルトの名無しさん
2010/02/15(月) 21:09:510532デフォルトの名無しさん
2010/02/15(月) 21:38:19なんで効率アップに繋がると思うのがよくわからんわ
0533デフォルトの名無しさん
2010/02/15(月) 22:07:190534デフォルトの名無しさん
2010/03/14(日) 22:49:42でTextReaderにS-jisエンコードを指定しているコードをみて困惑。
これってどういう意図なんでしょう?
0535デフォルトの名無しさん
2010/03/15(月) 02:22:37UTF-8固定ならDeclarationにencodingはいらん。
0536デフォルトの名無しさん
2010/03/16(火) 00:47:570537デフォルトの名無しさん
2010/03/18(木) 01:22:170538デフォルトの名無しさん
2010/03/30(火) 00:55:11Chapter16 LINQとメソッド構文
ttp://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_16/extremecs_16_01.html
でもこんな概略の説明なんて既に色々あるんだから、もっと深い奴、
例えばLINQの落とし穴とかそういうところを説明したドキュメントがホスィ
0539デフォルトの名無しさん
2010/03/30(火) 08:10:450540デフォルトの名無しさん
2010/03/30(火) 09:38:37いや、そんなことじゃいけないとは思うんだけどね(;´Д`)
0541デフォルトの名無しさん
2010/06/05(土) 19:53:02Listに格納したオブジェクトの並べ替えとフィルタが楽すぎて笑った。
並べ替え用のDatatable作ってたりいったい今まで俺は何をやっていたんだろう‥
0542デフォルトの名無しさん
2010/06/05(土) 19:57:34Listのソートやフィルタは別にLINQやDataTable使わなくても簡単にできる
0543デフォルトの名無しさん
2010/06/06(日) 00:08:23わざわざそういうクラスを実装した上でLISTを作ればの話だろ?
オブジェクト型のList作って、適当に格納したオブジェクトの対象としたいメンバさえ一致すれば、一行で書けてしまうは凄い。
わかっててやらないと危ういけど‥
0544デフォルトの名無しさん
2010/06/06(日) 00:18:400545デフォルトの名無しさん
2010/06/06(日) 01:05:19List<T>.Find()
とかないの?使えないの?
0546デフォルトの名無しさん
2010/06/06(日) 10:17:56LINQも同様に高階関数使ってるけどクエリ式で隠してるわけだ
0547デフォルトの名無しさん
2010/06/06(日) 13:33:230548デフォルトの名無しさん
2010/06/07(月) 00:43:25なるほど
まあC#使いでも foreach(){ if(current==target)...}ってやってるやつもいるな。
0549デフォルトの名無しさん
2010/06/07(月) 18:47:48あまりにもよく使われるパターンだったから手が覚えてるんだよね
0550デフォルトの名無しさん
2010/06/10(木) 07:41:28DbContextというのが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に変換できない」と怒られるし(当然だけど)。
0551デフォルトの名無しさん
2010/06/10(木) 14:35:370552550
2010/06/10(木) 15:29:40Hogeは、型は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")」
としてみたけど、だめだった。
0553550
2010/06/11(金) 10:16:21DbDataRecordで受け取るのが一般的なのか。
IQueriableなのに、後からWhereとか追加できない不思議仕様だ。
0554デフォルトの名無しさん
2010/06/13(日) 14:12:110555デフォルトの名無しさん
2010/06/15(火) 15:18:450556デフォルトの名無しさん
2010/06/15(火) 20:29:00var 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);
0557デフォルトの名無しさん
2010/06/15(火) 20:48:14せめてList<Object>で……。
0558デフォルトの名無しさん
2010/06/24(木) 02:06:34IEqualityComparer<FileInfo>を継承したMyCompareを使ってExceptしたのですがうまくいきません。
GetHashCode()で return 1;など定まった値を返せばうまくいくので、GetHashCode()の実装が悪いのかと思います。
しかし、オブジェクトを一意に特定するためのメソッドなのだからそういった実装は間違っていると思います。
もしかしたら全然勘違いをしているかもしれませんが、どなたか助け舟をいただけませんか?
よろしくお願いします。
ソース:http://ideone.com/Ttea4
0559デフォルトの名無しさん
2010/06/24(木) 04:14:11それが同じ値であったらEqualsで比較する、という動きをします。
なので、GetHashCodeはobj.FullName.GetHashCode()だけ返せばいいんじゃないのかな?
LastWriteTimeまで算出に含めるから希望通りに動かないのでは、と思ってみる。
あと、FullNameじゃそもそも「ファイル名」じゃなくてフルパスを取っちゃうから絶対に一致しない。
でも、なんというか、その用途にExceptは違う気もします。
0560デフォルトの名無しさん
2010/06/24(木) 04:17:390561559
2010/06/24(木) 04:24:52しかし回答がまるっきり一緒とは……。
0562デフォルトの名無しさん
2010/06/24(木) 21:15:15return obj.Name.GetHashCode();
でいけました。ありがとうございました。
過疎スレに質問をしてしまったと投稿してから思い、相談室にもマルチポストしてしまいました。
LINQが大好きなのでこのスレを監視している方がいてくださって嬉しいです。
0563デフォルトの名無しさん
2010/06/24(木) 21:22:28私は差集合で解決できる問題なのかなと素直に思いましたが。
単純にファイルの有無ならば差集合でとれる。
→Equalになる条件が違う
→ならばその条件を指定してやればいい
という段階を踏んでこのソースの形に.なりました。
0564デフォルトの名無しさん
2010/06/24(木) 21:32:300565デフォルトの名無しさん
2010/06/24(木) 21:35:41だからってIntersectを使うのも不適切だと思う
0566デフォルトの名無しさん
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)
こんな感じになると思います。
これって差集合と違います?
0567名無しさん@そうだ選挙に行こう
2010/07/11(日) 04:57:51つ ObjectContext.Translate<TEntity>
0568デフォルトの名無しさん
2010/11/10(水) 22:58:06しかも直感でわかりにくい
0569デフォルトの名無しさん
2010/11/10(水) 23:24:39つ関数型言語
0570デフォルトの名無しさん
2010/12/14(火) 07:21:36具体的にどんなふうになるのん?
0571デフォルトの名無しさん
2010/12/14(火) 20:57:111.エンティティを定義
[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();
0572デフォルトの名無しさん
2010/12/14(火) 22:52:23S2Daoとかなら簡単なSQLなら自動生成してくれるのに今更って感じだな
0573デフォルトの名無しさん
2010/12/14(火) 23:10:170574デフォルトの名無しさん
2010/12/14(火) 23:30:48�d
JOINとかどうするのだろうかとふっと思った
0575デフォルトの名無しさん
2010/12/14(火) 23:47:23もちろん出来る
http://msdn.microsoft.com/ja-jp/library/bb399397.aspx
0576デフォルトの名無しさん
2010/12/15(水) 00:45:15えーと自動生成してくれるんだが・・・
0577デフォルトの名無しさん
2010/12/20(月) 13:47:540578デフォルトの名無しさん
2011/01/27(木) 16:14:48TableA:
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()って値型はデフォルトの値入れてくれるんじゃないのかと
これってどうすれば?
0579デフォルトの名無しさん
2011/01/27(木) 18:31:190580578
2011/01/27(木) 21:54:36何故「多分」かと言うと、Entityとの違いがわからんからです
DBはSQL Server2005です
0581デフォルトの名無しさん
2011/01/27(木) 23:57:21Key1 Key2
hoge fuga
foo bar
[TableB]
Key1 Key2 Key3
hoge fuga 1
[Result]
Key1 Key2 Key3
hoge fuga 1
foo bar NULL
0582581
2011/01/28(金) 00:04:25例えばDB上でTableA,Bが上記のような場合、LEFT JOINしたらResultのようになるが、
これを(string, string, int)に入れようとすればエラーになって当然
とりあえず、匿名クラスを(string, string, int?)にすれば良い
0584デフォルトの名無しさん
2011/01/28(金) 18:22:36キャスト。
new{ Hoge = (int?)x } みたいに。
0586デフォルトの名無しさん
2011/02/08(火) 22:46:260587デフォルトの名無しさん
2011/02/08(火) 22:54:170588デフォルトの名無しさん
2011/02/18(金) 23:37:45にあるような複雑な消費税計算もLINQなら余裕ですよね?
0589デフォルトの名無しさん
2011/02/19(土) 03:20:210590デフォルトの名無しさん
2011/03/25(金) 21:47:03.67DataTable(DataViewだっけ?)のソート機能はいまいちわからない。
0591デフォルトの名無しさん
2011/03/25(金) 21:52:20.020592デフォルトの名無しさん
2011/03/25(金) 21:56:40.88そんなイミフな規約があるとはかわいそうに
0593デフォルトの名無しさん
2011/03/26(土) 09:15:06.03.NET Framework 2.0を切れない環境とか。
工場なんかだと今だにWin2K使ってたりするしなあ。馬鹿げた話だ。
0594デフォルトの名無しさん
2011/03/26(土) 09:58:37.70.NET 2だったら元より使えないじゃない
0595デフォルトの名無しさん
2011/03/26(土) 10:11:54.06なお除外申請をすればLINQは使えるけど拡張メソッドは全面禁止の模様
0596デフォルトの名無しさん
2011/03/26(土) 10:33:29.030597デフォルトの名無しさん
2011/03/27(日) 02:01:44.670598デフォルトの名無しさん
2011/03/27(日) 08:09:14.06規約の最後の「以下は使用を禁止する」ってリストに「拡張メソッド」「ラムダ式」「LINQ」って書いてあって、
下二つは申請すれば使えるって注釈があった
多分ユーザーに直接聞けば普通にOKされるとは思うが、リーダーと元請が事なかれ主義で申請を弾くんじゃないかと思う
最悪後出しで吊し上げられる可能性もあるから確認する気にもならん
0599デフォルトの名無しさん
2011/03/27(日) 08:28:01.170600デフォルトの名無しさん
2011/03/27(日) 12:02:56.770601デフォルトの名無しさん
2011/03/27(日) 12:21:50.11同じ規約に「stringは参照型だからconstじゃなくてstatic readonlyにしろ」って書いてあるんだぞ?
FxCopで何十個も警告出てみんな間違いだってわかってるのに、客がドヤ顔で提示してくるから誰も突っ込まないし
0602デフォルトの名無しさん
2011/03/27(日) 12:25:59.03privateやinternalならいいが、アセンブリの外から見えるconst定数は
バージョン管理上問題があるので非推奨
0603デフォルトの名無しさん
2011/03/27(日) 12:38:29.25そういう意味ならstatic readonlyでもダメだろ
0604デフォルトの名無しさん
2011/03/27(日) 12:48:55.51もちろんprivateの話
>>603
ビルド時に解決されるかどうかの違いだろ
0605デフォルトの名無しさん
2011/03/27(日) 13:17:12.35実際にはインターンされるから節約できるのは 文字列のサイズ×参照元のアセンブリの数 くらいかw
0606デフォルトの名無しさん
2011/03/27(日) 13:45:11.34馬鹿みたいな要求はそういう小手先だけの最適化()から出てくることが多かったり
0607デフォルトの名無しさん
2011/03/31(木) 14:49:08.100608デフォルトの名無しさん
2011/04/02(土) 21:40:07.080609デフォルトの名無しさん
2011/04/07(木) 22:52:52.610610デフォルトの名無しさん
2011/04/07(木) 22:57:19.290612デフォルトの名無しさん
2011/04/08(金) 01:19:05.230614デフォルトの名無しさん
2011/04/08(金) 23:54:00.10行かないでー
0615デフォルトの名無しさん
2011/05/16(月) 14:59:59.72自分はオライリーのクックブック(LINQは30ページほど)しか持ってないから参考にしたい。
0616デフォルトの名無しさん
2011/05/18(水) 17:03:55.24プログラミングMicrosoft LINQ
LINQテクノロジ入門 >>197-198
0617デフォルトの名無しさん
2011/05/18(水) 19:19:33.390618デフォルトの名無しさん
2011/06/02(木) 19:50:13.550619デフォルトの名無しさん
2011/06/04(土) 10:32:14.82もう他の言語では開発する気が起きない身体になってしまいました
javaがforを回しているのを見るだけで不整脈になります
Microsoftはどう責任をとるつもりですか?
0620デフォルトの名無しさん
2011/06/04(土) 12:53:35.380621デフォルトの名無しさん
2011/06/04(土) 18:17:29.27世の中には適材適所って言葉がだなw
0622デフォルトの名無しさん
2011/06/04(土) 23:25:36.070623デフォルトの名無しさん
2011/06/05(日) 00:01:06.960624デフォルトの名無しさん
2011/06/05(日) 01:42:03.340625デフォルトの名無しさん
2011/06/05(日) 02:02:23.62DBとかつかうんならまた話は別なんだが、おbじぇctとXMLはつかわんでいい。
0626デフォルトの名無しさん
2011/06/05(日) 02:14:45.27ObjectsはSeqがあるから使わないのは当然だと思うけど
XMLのほうはLinq to Xml使わなくてどうするの?
0627デフォルトの名無しさん
2011/06/05(日) 09:55:46.24SQLはクエリーにしないといけないのでそういうわけにはいかんけど。
まぁF#でもうちっとLinqがきれいに書ければいいんだけどね。TypeProvider来たらもう少し変わるんか?
0628デフォルトの名無しさん
2011/06/05(日) 11:58:43.360629デフォルトの名無しさん
2011/06/06(月) 07:34:52.230630デフォルトの名無しさん
2011/06/09(木) 23:12:42.43さっきざっくり見た時にvarcharをncarcharに変換するので引っかからないうんたらとか書いてるもあったような気がしたんだが。
0631デフォルトの名無しさん
2011/06/09(木) 23:21:51.44自分でDataContext.Log設定して実行計画確認しろよ
0632デフォルトの名無しさん
2011/06/10(金) 00:45:13.06ちなみにちょと違うかもしれんがこんなのあった。
http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/cfa263a0-fc7b-4da5-982c-901da60236db/
0633デフォルトの名無しさん
2011/06/11(土) 07:50:22.350634デフォルトの名無しさん
2011/06/26(日) 21:45:11.580635デフォルトの名無しさん
2011/06/28(火) 13:00:23.68#テーブル1,2はファイル1、テーブル3,4,5はファイル2など。
このような場合でもLinq to Entitiesで全てのテーブルを連携した検索等を行うことは可能でしょうか?
Linq自体これから勉強するところなのですが、仕様を先に決めなければなりません。
ご教示よろしくお願いします。
0636デフォルトの名無しさん
2011/06/28(火) 13:09:40.13コードの見た目上は連携したように見えるものは書けると思うけど、
sdf ファイルごとにそれぞれ個別のクエリが動くと思う。
0637デフォルトの名無しさん
2011/06/28(火) 21:01:46.09Item
Count
SelectedIndices
Item
上記はそれぞれどのような機能を果たすのですか?その機能を教えてほしいです。
初心者で申し訳ありません。
0638デフォルトの名無しさん
2011/06/29(水) 00:47:53.20レスありがとうございます。
EDM(Entity Data Model)を作るときに工夫すれば出来そうですね。
個別のクエリが動くのは目を瞑ることにします。
0639デフォルトの名無しさん
2011/06/29(水) 02:54:06.930640デフォルトの名無しさん
2011/06/29(水) 08:46:14.33そもそも開発チームが違う。
LINQ to SQL は言語チームが IQueryable 版 LINQ の参考実装として作ったもの。
LINQ to Entities は ADO.NET チームが作った、ちゃんとした DB アクセスライブラリ。
当然、参考実装が今後保守されるわけがなく。
0641デフォルトの名無しさん
2011/06/29(水) 09:28:45.92で聞きたいのはEntityFrameworkを使ってこれから幸せになれるかなんだが…
まっとーなプロジェクトで使ってる人とかおるん?
0642デフォルトの名無しさん
2011/06/29(水) 09:33:23.620643デフォルトの名無しさん
2011/06/30(木) 00:31:39.64計測データの収集と抽出にDB使おうと考えてた。
0645デフォルトの名無しさん
2011/07/04(月) 00:35:22.65なくなるような懸念されてたけどどうもそんな感じではない。
0646デフォルトの名無しさん
2011/07/04(月) 00:39:45.530647デフォルトの名無しさん
2011/07/06(水) 09:51:37.05もともとDBに任せてた SELECT とかの処理をクライアント側でやるってこと?だよね?
テーブルのデータを全部クライアントに持ってくるの?
0648デフォルトの名無しさん
2011/07/06(水) 10:41:45.190649デフォルトの名無しさん
2011/07/06(水) 13:36:20.66その10件のデータに対してループ処理をしたいとき
LINQってまずDBから100件データ取ってきてコード内で指定された条件の10件分だけ選別してループするんじゃないの?
それともSQLを自動生成して必要分だけ取ってきてくれるの?
あれなんか根本的に間違ってる?
0650デフォルトの名無しさん
2011/07/06(水) 14:15:04.780651デフォルトの名無しさん
2011/07/06(水) 16:10:54.32全然違う。
LINQ to SQL とか LINQ to Entties は、
クエリ式とか db.Select(x => ...) みたいなメソッド呼び出しから、
式ツリー作って、その式ツリーから SQL 文組み立てて
DB サーバーに問い合わせ行う。
0652デフォルトの名無しさん
2011/07/06(水) 16:41:34.63まずはLINQ to ObjectとLINQ to SQLの違いを勉強してから来い
0653デフォルトの名無しさん
2011/07/06(水) 21:35:56.480654デフォルトの名無しさん
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 の保存処理;
}
一応これでも期待した動作はするんですが、もっときれいに一発でやれそうな気がします。
もっとよい方法があれば、ご教示いただけませんか?
0655デフォルトの名無しさん
2011/07/08(金) 01:21:39.32rows.OrderBy(e => e.value).GroupBy(e => e.group).Select(e=>e.First());
これでいけるが、groupってプロパティ名は・・・
0656デフォルトの名無しさん
2011/07/08(金) 01:41:10.34groupよりvalueがイヤだ
0657デフォルトの名無しさん
2011/07/08(金) 05:09:43.01from a in rows
group a by a.@group into g
select g.OrderBy(x => x.value).First();
0658654
2011/07/09(土) 00:03:39.81やっぱり出来たんですね。
それぞれの方法で動作を確認しました。
あのプロパティ名は、ここに書くためにわかりやすそうなのを適当につけただけなので。
ご心配には及びません。w 余計な心配をさせてしまったみたいで、すみません。
0659デフォルトの名無しさん
2011/07/19(火) 15:12:17.04に対して、並べ替えが
ia = {5,6,7,8,9,4,3,2,1,0}
となるようなLINQの書き方を教えてください。
0660デフォルトの名無しさん
2011/07/19(火) 15:16:43.87その例だけだとたくさんアプローチがあるんだが
0661デフォルトの名無しさん
2011/07/19(火) 15:28:28.71グループ2→グループ1の順に並べたいです。
0662デフォルトの名無しさん
2011/07/19(火) 15:47:10.410663デフォルトの名無しさん
2011/07/19(火) 15:47:48.840664デフォルトの名無しさん
2011/07/19(火) 15:48:45.380665デフォルトの名無しさん
2011/07/19(火) 15:53:57.02orderby i < 5 ? -i : i
orderby i < 5 ? 1 : 0
select i
0666デフォルトの名無しさん
2011/07/19(火) 16:00:37.66調べます。ありがとうございました。
0667デフォルトの名無しさん
2011/07/19(火) 16:04:18.40プログラム書いてる人なら初めてってこたないと思うが
まあ誰にでも最初はあるか
0668デフォルトの名無しさん
2011/07/20(水) 02:11:33.40var q = array.Where(x => x <= 4).Select(x => x);
配列から4以下の数値を、取り出す文の場合なんでWhereとSelectの中になんでラムダ式が入っているんですか?
それとxという変数っぽいのはなんなんですか?
0669デフォルトの名無しさん
2011/07/20(水) 02:35:06.43xはWhereのなかなどでラムダ式が呼び出される時にアイテムがセットされる。
0670デフォルトの名無しさん
2011/07/20(水) 02:53:47.23そのコードの場合、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 は配列中の各要素が来る。
0671デフォルトの名無しさん
2011/07/20(水) 19:13:40.41http://www.atmarkit.co.jp/fdotnet/chushin/roadtolinq_01/roadtolinq_01_02.html
↑これのFigure 9。
x はラムダ式(匿名関数)の引数。
0672デフォルトの名無しさん
2011/08/03(水) 06:46:39.84Selectの有無でqの戻り値が変わることもあるよ
0673デフォルトの名無しさん
2011/08/03(水) 11:18:41.760674デフォルトの名無しさん
2011/08/03(水) 19:11:17.24しいてそういうケースを考えるなら
ただの配列に.Select(x => x)だけを足したりなどをすると、
得られる結果は一見同じだけど
型が厳密なIEnumerable<T>に変わるのと、
当然Selectを通るのでパフォーマンスは落ちる。
ただ、今回の場合は前段階にWhereが挟まれているので、何も変わらないね。
0675デフォルトの名無しさん
2011/08/03(水) 20:44:38.31全く意味のない違いだけど
0676デフォルトの名無しさん
2011/08/03(水) 21:40:50.63普通しないと思うし。
0677デフォルトの名無しさん
2011/08/08(月) 01:02:05.320678デフォルトの名無しさん
2011/08/08(月) 01:26:27.260679デフォルトの名無しさん
2011/08/08(月) 19:29:01.070680デフォルトの名無しさん
2011/08/14(日) 00:44:37.920681デフォルトの名無しさん
2011/09/04(日) 02:37:18.36> ただの配列に.Select(x => x)だけを足したりなどをすると、
> 得られる結果は一見同じだけど
> 型が厳密なIEnumerable<T>に変わるのと
厳密なってどういう意味だ?
IEnumerable<T>の派生型である配列からIEnumerable<T>へと抽象化されるんだが…
0682デフォルトの名無しさん
2011/09/04(日) 02:50:26.040683デフォルトの名無しさん
2011/09/06(火) 13:26:26.01初心者です。
下記のようなXMLファイルを八百屋のIDを条件に
果物、野菜、缶詰の在庫の判定を行いたいのですが、
うまくいきません。
ご教示ください。
XMLの読み込みはLinqを使用しています。
0684デフォルトの名無しさん
2011/09/06(火) 13:29:04.49Dim 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
宜しくお願いします。
0685デフォルトの名無しさん
2011/09/06(火) 13:32:18.03<八百屋 ID="001">
<果物>
<リンゴ 在庫="YES"/>
<みかん 在庫="YES"/>
<メロン 在庫="NO"/>
</果物>
<野菜>
<大根 在庫="NO">
<白菜 在庫="YES">
</野菜>
<缶詰>
<桃 在庫="NO">
<みかん 在庫="YES">
</缶詰>
</八百屋>
</設定内容>
0686デフォルトの名無しさん
2011/09/06(火) 20:24:12.34「八百屋のIDを条件に」「在庫の判定」の具体的な条件は?
0687デフォルトの名無しさん
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の方がすっきりするような気がする…
0688デフォルトの名無しさん
2011/09/06(火) 21:59:22.20let 果物 = item.Element("果物")
let 野菜 = item.Element("野菜")
let 缶詰 = item.Element("缶詰")
select new
{
HasApple = 果物.Element("リンゴ").Attribute("在庫").Value == "YES",
HasPeach = 缶詰.Element("桃").Attribute("在庫").Value == "YES"
}
みたいな感じでしょうか?VBも多分同じ感じなはず。
0689デフォルトの名無しさん
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文字列中に親子を類推できる情報は一切ありません
よろしくお願いします
0690デフォルトの名無しさん
2011/09/08(木) 21:34:54.14private 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); });
0692デフォルトの名無しさん
2011/09/10(土) 03:26:25.430693デフォルトの名無しさん
2011/09/10(土) 16:31:03.33class Node {
uniqueidentifier ID { get; set; }
Node Node { get; set; } // ParentIDのリレーション (i.e. 親Node)
}
こんな感じのクラスになるはずだから、何も悩む必要はないと思うが?
0694デフォルトの名無しさん
2011/09/18(日) 10:53:41.53省略
init max = data.Where(e => 条件).Max();
このとき、条件に一致するのがなかったときシーケンスが空っぽだよって例外が出るよね
だからといって
var seq = data.Where(e => 条件);
if(seq.Count > 0) {
max = seq.Max
}
ってしようとするとintと比較できないってコンパイルエラー出るし、
結構不便だよね
0695デフォルトの名無しさん
2011/09/18(日) 13:26:40.48でも一つ含まれてればいいんだから if (seq.Any()) の方がいい
一行で書くなら
int? max = data.Where(e=>条件).Select(e=>(int?)e).DefaultIfEmpty().Max();
かな
0696デフォルトの名無しさん
2011/09/22(木) 05:59:38.55了解
0697 忍法帖【Lv=8,xxxP】
2011/11/10(木) 08:11:23.35■ このスレッドは過去ログ倉庫に格納されています