掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
可変長の2次元を配列をRedimなしで使うには (ID:140192)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 値が変わるのは何行目かわからないので可変長になりそうです。 その「変わった結果」を、いきなり配列に入れるのでは無く、 DataView で処理したり、あるいは一時的に「別の DataTable 等に入れなおす」ことで、 二次元配列化しやすくなるかと。 たとえば、こんなデータがあったとします。 '------------- Private Function CreateSampleData() As DataSet Dim ds As New DataSet() Dim t As DataTable = ds.Tables.Add("Table1") t.Columns.Add("日付", GetType(Date)) t.Columns.Add("地域") With t.Rows .Add(#8/1/2008#, "青森") .Add(#8/1/2008#, "埼玉") .Add(#8/1/2008#, "東京") .Add(#8/1/2008#, "京都") .Add(#8/1/2008#, "大阪") .Add(#8/2/2008#, "秋田") .Add(#8/2/2008#, "石川") .Add(#8/2/2008#, "東京") .Add(#8/3/2008#, "宮崎") .Add(#8/3/2008#, "那覇") End With ds.AcceptChanges() Return ds End Function '------------- そしてそこから、1列目の日付でグループ化して、 総件数:3 2008/08/01=5件 2008/08/02=3件 2008/08/03=2件 の結果を得たいとします。 これが VB2008 であれば、LINQ 一発なのですが…。 '------------- Dim query = _ From row In table.AsEnumerable() _ Group By dt = row.Field(Of Date)("日付") Into Group, cnt = Count() _ Order By dt Ascending Console.WriteLine("総件数:{0}件", query.Count) For Each q In query Console.WriteLine("{0:yyyy/MM/dd}={1,-5:#,0}", q.dt, q.cnt) Next '------------- 残念ながら今回は 2005 なので、上記のように簡単には書けず、自分で集計せねば なりませんが、たとえば、グループ化を管理するために、DataSet の「式列」や リレーション機能(DataRow.GetChildRows など)を使ってみては如何でしょう。 '------------- Private Shared Function CreateSampleData() As DataSet '(省略:先の内容と同じ) End Function Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load Dim ds As DataSet = CreateSampleData() '日付でグループ化されたテーブルを作成 Dim dsGroup As DataSet = CreateGroupingDataSet(ds) '中身確認 Dim grid As New DataGrid() grid.Dock = DockStyle.Fill Controls.Add(grid) grid.DataSource = dsGroup.Tables("Group1") '件数表示 Dim fmtGroup As String = "{0:yyyy/MM/dd} = {1:#,0}件" Dim fmt As String = " {0:yyyy/MM/dd}, {1}" Dim msg As New System.Text.StringBuilder() For Each rowGroup As DataRow In dsGroup.Tables("Group1").Rows Dim rows() As DataRow = rowGroup.GetChildRows("GroupBy日付") 'msg.AppendLine(String.Format(fmtGroup, rowGroup("日付"), rows.Length)) msg.AppendLine(String.Format(fmtGroup, rowGroup("日付"), rowGroup("件数"))) For Each row As DataRow In rows msg.AppendLine(String.Format(fmt, row("日付"), row("地域"))) Next Next MessageBox.Show(msg.ToString()) End Sub Private Function CreateGroupingDataSet(ByVal dsSource As DataSet) As DataSet Dim ds As DataSet = dsSource.Copy() ds.EnforceConstraints = False '日付列でグループ化 Dim tblSrc As DataTable = ds.Tables("Table1") Dim tblGrp As DataTable = ds.Tables.Add("Group1") tblGrp.Columns.Add("日付", GetType(Date)) ds.Relations.Add("GroupBy日付", tblGrp.Columns("日付"), tblSrc.Columns("日付")) tblGrp.Columns.Add("件数", GetType(Decimal), "COUNT(Child.日付)") '集計作業は自分で書く必要がある… Dim view As New DataView(ds.Tables("Table1")) view.Sort = "日付 ASC" Dim preDate As Date = Date.MaxValue For Each row As DataRowView In view Dim curDate As Date = CDate(row.Row("日付")) If preDate <> curDate Then preDate = curDate tblGrp.Rows.Add(curDate) End If Next ds.EnforceConstraints = True tblGrp.AcceptChanges() Return ds End Function
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.