• 締切済み

VB LinqでGroup By,Selectする

VB初心者です。 データが格納済みのデータセット・テーブルからLinqで新たなデータセット・テーブルを作成しようと試みておりますが、どうも上手くいかず困っています。以下にどんな事をやりたいか例示しますので、コードでご教示下さいますようお願いいたします。 データ格納済みのデータセット・テーブル(DataSet1.DataTable1)の内容 YYYYMMDD/HHMMDD/HighPrice/LowPrice/Volume ------------------------------------------ 20100103/000000/100.10/100.05/10△ 20100103/000100/100.15/100.10/10 20100103/000200/100.20/100.15/10 20100103/000300/100.30/100.25/10○ 20100103/000400/100.20/100.10/10 20100103/000500/100.20/100.45/10 20100103/000600/100.35/100.25/10 20100103/000700/100.25/100.15/10 20100103/000800/100.45/100.30/10○ 20100103/000900/100.00/99.90/15△ 20100104/000000/100.50/100.45/15○ 20100104/000100/100.50/100.40/15 20100104/000200/100.45/100.45/15 20100104/000300/100.37/100.35/15 20100104/000400/100.30/100.20/15△ 20100104/000500/100.25/100.20/30 20100104/000600/100.35/100.25/15 20100104/000700/100.50/100.05/20○△ 20100104/000800/100.45/100.40/20 20100104/000900/100.10/100.10/20 以上のデータを新たなデータセット・テーブル(DataSet1.DataTable2)を作成する必要があります。 抽出条件 (1)YYMMDD毎 (以上の例では20100103と20100104となります。) (2)HHMMDDが500毎(以上の例では次の2つの組合せとなります。000000~000400、000500~000900) (3)HighPriceは(1)と(2)の最大値 (以上の例ではレコードの横に○を付けています) (4)LowPriceは(1)と(2)の最小値 (以上の例ではレコードの横に△を付けています) 結果出力。注意点としてはHHMMDDは500毎となります。つまり、00000~000400は000500となり、000500~000900は001000となります。なおVolumeは不要となります。 YYYYMMDD/HHMMDD/HighPrice/LowPrice ------------------------------------------ 20100103/000500/100.30/100.05 20100103/001000/100.45/99.90 20100104/000500/100.50/100.20 20100104/001000/100.50/100.05 非常にややっこしいですが、コードで教えてくださいますようお願いいたします。

みんなの回答

回答No.1

(1)は通常のEnumerable.GroupBy一発。 (2)は(1)の各グループに対してEnumerable.GroupBy。この時に500で割った商をセレクタに利用。  匿名クラスで(1)のキーと(2)のグループをまとめておく。 (3), (4)は(2)のグループについてEnumerable.MaxおよびEnumerable.Min。 あとは,これらをObjectの配列にして,DataRowを作ればできあがり。

tsutomu0111
質問者

お礼

ありがとうございます。 匿名クラスの使い方がわからないので、勉強していきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C# DataGridViewにデータを追加したい。

    C# DataGridViewにデータを追加したい。 DataGridViewにレコードを追加したいのですが、Formのロードイベントで以下コードを実行しています。 // テーブルを作成 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); DataColumn dataClumn1 = dataTable1.Columns.Add("ID", typeof(int)); DataColumn dataClumn2 = dataTable1.Columns.Add("名前", typeof(int)); // テーブルにデータを追加 dataTable1.Rows.Add(new Object[] { 1, name1}); dataTable1.Rows.Add(new Object[] { 2, name2}); dataGridView1.DataSource = dataTable1; としています。 Formにボタンを配置し、ボタンクリック時にテキストボックス[txtProName]のデータを レコード追加したいのですが、記入の仕方がわかりません。 まず、 DataSet dataSet1 = new DataSet("商品マスター"); DataTable dataTable1 = dataSet1.Tables.Add("製品テーブル"); をロードイベントメソッドに記入しているのも問題がありそうなのですが、 良く理解できません。 ボタンイベントでデータを挿入する方法等、記入方法のご教授よろしくお願いいたします。 当方、超初心者なので、出来れば、ソースコードもお願いいたします。m(_ _)m

  • DataSetから、DataTableを取得したい。

    C♯環境です。 DataSetに格納されている1つのテーブルを、DataTableとして 取得したいと思っています。 VB.NETではたしか出来たと思うのですが… DataTable Dt= DataSet.Tables(0); 以上のように書くと、「~Tablesはプロパティですがメソッドのように 使用されています」と怒られます。 出来ないのでしょうか…? 誤りをご指摘いただけるとありがたいです。 宜しくお願いします。

  • VB2005のデータグリッドビューとデータテーブルについて

    いつもお世話になっています。 独学でVBの勉強をしているのですが、 どうしてもわからないことがあるので教えて下さい。 現在行なおうとしていることは、 mdbからデータテーブルにレコードを取得して、 それをデータグリッドビューに設定し、 値の一部をコードで変更するということです。 DataGridView1.DataSource = DataTable1 とすれば、データテーブルのデータを データグリッドビューにて表示させることができるのですが、 コードでデータグリッドビューの値を変更すると、 データテーブルの値も一緒に変更されてしまうんです。 DataGridView1.DataSource = DataTable1.Clone とすると、今度はレコードが表示されなくなってしまって・・・ 何か良い方法がありましたら、教えて下さい。 よろしくお願いします。

  • データテーブルの使い方に関して

    MySQLからデータを取得し、その情報を加工した後、データセットへ格納したいと考えています。 単純にMySQLから直接データをデータセット等へ格納する方法は、FILL等を使えば 実現できましたが、1件1件加工しながらセットする方法がわかりません。。。 ※ 加工しながらというよりは、加工した後の結果データ 今現在、以下のようにデータセットとデータテーブルを作成しましたが、どのように データを追加すれば良いのでしょうか??? 《記述内容》   DataSet myds = new DataSet();   DataTable mytable = myds.Tables.Add("MyTable"); それに関連して教えて頂きたいのが、上記のようにデータテーブルをデータセット内に 作成しましたが、データテーブルというのは、そもそもテーブルの中に項目?フィールド?を作成しないと データというのは格納できないのでしょうか。。。 初歩的な質問で申し訳ありませんが、教えて頂きたいと思います。

  • visual basic 2005 のルックアップフィールドについて

    データセット上にSQL SERVER 2005 で作成しましたTable_Customerというテーブルアダプターを持っています。そこで下記のコードでデータグリッド上にルックアップフィールドを作成しようとしたのですが検索されずにデータセットにNULLが返されしまします。下記のコード上では[みつからない]と返されます。 --------------------------------------------------------------- If (e.Column.ColumnName = Me.お客様IDColumn.ColumnName) Then  Dim dr As DataSet1.Table_CustomerRow  dr = Form1.DataSet1.Table_Customer.FindByお客様ID(10)  If dr Is Nothing Then MsgBox("みつからない") Else Form1.DataTable1DataGridView.CurrentRow.Cells(6).Value = dr.名称 End If    End If ----------------------------------------------------------- データセット上のTable_Customer上でプレビューを見てみると確かに主キーを10としてレコードが登録されているのですが・・・・・SQLSERVER2005の設定がおかしいものなのでしょうか。。。。非常に困っています。よろしくおねがいします。

  • C#で、LINQを使ってデータベースに書き込みたい

    C#で、LINQを使ってデータベースに書き込みたい LINQに関して、全くの初心者なのでお手柔らかにお願いします。 データベースのテーブル "A" の中身は、 id (string型) hoge (string型) 以上の二つ。 このテーブルに対して、データを書き込むには using (var db = new DataContext()) { db.Log = Console.Out; var storSales =db.A.Select(st => new { st.id, st.hoge }); } このような感じではないかと思いましたが、全然、分かりません。 SQLの構文も分からないのも、起因していますか・・・。 id と hoge にデータを書き込むには どのようにしたらいいでしょうか。 また、参考になりそうなWebページや、お勧めの参考書も教えてください。 以上、よろしくお願いします。

  • バグがとけません・・・

    現在私はVB2005で4択のクイズ形式のプログラムを作成しています。 データセットに問題、解答群などを格納しています。 それをフォームで表示してラジオボタンで4択のなかから正解と思うものを1つ選びボタンをクリックして次の問題へ移行する・・・というような流れのプログラムです。 今ためにしに問題を十問出題し最後の問題を終えたら10問中何問正解したかを表示するプログラムを作成しています。 データセットの内容はそれぞれ下記のとおりです。 Answer1~4・・・選択肢1~4 SelectAnswer・・・選択した選択肢を格納する CorrectAnswer・・・予めデータセットに格納してある正解 Loadで最初の一問目だけを読み込んで後はボタンを押すごとに問題が進んでいきますが全問正解するようにしても結果表示が正しく表示されません。 どこがバグかわかる方、もしくはさらに効率のいいコードがわかる方がいましたら助けてください。どうかよろしくお願いしますm(_ _)m Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If IO.File.Exists(filePath) Then DataSet1.ReadXml(filePath) End If Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 '正誤確認 If Answer1.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ア" ElseIf Answer2.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "イ" ElseIf Answer3.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ウ" ElseIf Answer4.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "エ" End If If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then total = total + 1 End If i = i + 1 End Sub Private Sub NextQuestion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextQuestion.Click 'Static i As Integer = 0 'UStatic total As Integer = 0 'MsgBox(i)デバッグ '問題の読み込み Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 '正誤確認 If Answer1.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ア" ElseIf Answer2.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "イ" ElseIf Answer3.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ウ" ElseIf Answer4.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "エ" End If If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then total = total + 1 End If '終了 If i = 10 Then MsgBox("あなたの正解数はは10門中" & total & "問です!") Me.Close() End If i = i + 1 Answer1.Checked = True End Sub

  • VB2005のデータテーブルFillについて

    いつもお世話になります。 VB2005で開発しています。素朴な疑問なんですが、 Form1にデータソースウィンドウからデータテーブルをドラッグしてはりつけると、 'TODO: このコード行はデータを 'DataSet1.test' テーブルに読み込みます。必要に応じて移動、または削除をしてください。 Me.testTableAdapter.Fill(Me.DataSet1.test) と、自動でコードが生成されますが、「Me.」って必ずいるのでしょうか? 参考書を見てみると、データを呼び込むコードが testTableAdapter.Fill(DataSet1.test) となっており、「Me.」がありませんでした。 自動で生成されたコードの「Me.」を削除して使うと何か支障があるのでしょうか?

  • 4択問題のプログラムで「次の問題」に移行する処理で困っています

    現在私は画像のような4択の問題のを解答し最後に何問正解していたかを表示するプログラムを作成しています。 データテーブルに「問題(Question)」「選択肢(Answer1~4)」「解答(SelectAnswr)」「正解(CorrectAnswer」「正解の解説(Explanation)*今質問中では使用させません」を格納しています。 画像はプログラムを立ち上げた直後のものです。 「次の問題」ボタンをクリックするとデータテーブルに格納された問題、選択肢が表示され順次解答をしていくのですが今現在の「次の問題」ボタンのプログラムではデータテーブルの「解答」と「正解」に1つずれが生じてしまいます。 「解答」に一番最初に格納されているのが毎回「ア」になってしまいます。 下記に「次の問題」ボタンのプログラムを示します。 Private Sub NextQuestion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NextQuestion.Click '選択肢を選択可能にする GroupBox1.Enabled = True Question.Text = DataSet1.DataTable1(i).Question Answer1.Text = DataSet1.DataTable1(i).Answer1 Answer2.Text = DataSet1.DataTable1(i).Answer2 Answer3.Text = DataSet1.DataTable1(i).Answer3 Answer4.Text = DataSet1.DataTable1(i).Answer4 '正誤確認 If Answer1.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ア" ElseIf Answer2.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "イ" ElseIf Answer3.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "ウ" ElseIf Answer4.Checked = True Then DataSet1.DataTable1(i).SelectAnswer = "エ" End If If DataSet1.DataTable1(i).SelectAnswer = DataSet1.DataTable1(i).CorrectAnswer Then total = total + 1 End If i = i + 1 '終了 If 10 = i Then MsgBox("あなたの正解数は10門中" & total & "問です!") Me.Close() End If Answer1.Checked = True End Sub *変数iはPublicで宣言しています。 このバグを解消するのに4日ぐらい四苦八苦しているのですが限界が近いです。 知恵をかしてください。おねがいします。

  • VB.NETでDataTableにデータ追加したい

    VisualStugio.Net2003でソースコードを記述しており、コード内でSQLのSELECT文を実行して、実行結果をDataTableに格納する処理をしています。 今回、とあるテーブルに対し2パターンのSQLを実行し、それぞれの実行結果を1つのDataTableに格納したいのですが、どのようにすれば良いでしょうか? 自分で調べたところ、先に実行したSQL結果に、後から実行したSQL結果を1行ずつ追加するといった方法は見つかりましたが、1行ずつではなく、一括で追加する方法が知りたいです。 前提として、2回のSQL実行では、同じテーブルの同じ項目をSELECTしております。 下記に簡単ですがコード記述の概要を補足しておきます。 ・コード記述概要 【変数宣言】 Dim DB1 As DataTable Dim DB2 As DataTable 【SQL文1】 SELECT A,B,C FROM テーブル1 WHERE 条件文1 DB1 = SQL文1の実行結果 【SQL文2】 SELECT A,B,C FROM テーブル1 WHERE 条件文2 DB2 = SQL文2の実行結果 【DB1にDB2のデータを追加】←ここのやり方を知りたいです DB1 = DB1 + DB2 よろしくお願いいたします。