在VB.NET中格式化DataTable中有或没有LINQ的数据
我在尝试将一些数据正确格式化时遇到了一些问题 我不确定LINQ在这种情况下是否有用,但以下是: 预期产出在VB.NET中格式化DataTable中有或没有LINQ的数据,vb.net,linq,Vb.net,Linq,我在尝试将一些数据正确格式化时遇到了一些问题 我不确定LINQ在这种情况下是否有用,但以下是: 预期产出 March 14 2:00 PM - 7:00 PM | Registration 5:30 PM - 7:00 PM | Meetup 7:30 PM - 9:00 PM | Dinner March 15 2:00 PM - 7:00 PM | Registration 5:30 PM - 7:00 PM | Meetup March 14 2:00 PM - 7:00 PM | Re
March 14
2:00 PM - 7:00 PM | Registration
5:30 PM - 7:00 PM | Meetup
7:30 PM - 9:00 PM | Dinner
March 15
2:00 PM - 7:00 PM | Registration
5:30 PM - 7:00 PM | Meetup
March 14
2:00 PM - 7:00 PM | Registration
March 14
5:30 PM - 7:00 PM | Meetup
March 14
7:30 PM - 9:00 PM | Dinner
March 15
2:00 PM - 7:00 PM | Registration
March 15
6:00 PM - 7:00 PM | Meetup
当前数据输出
March 14
2:00 PM - 7:00 PM | Registration
5:30 PM - 7:00 PM | Meetup
7:30 PM - 9:00 PM | Dinner
March 15
2:00 PM - 7:00 PM | Registration
5:30 PM - 7:00 PM | Meetup
March 14
2:00 PM - 7:00 PM | Registration
March 14
5:30 PM - 7:00 PM | Meetup
March 14
7:30 PM - 9:00 PM | Dinner
March 15
2:00 PM - 7:00 PM | Registration
March 15
6:00 PM - 7:00 PM | Meetup
代码结构
Imports System
Imports System.Globalization
Imports System.Data
Imports System.Data.DataSetExtensions
Public Module Module1
Public Sub Main()
Dim sessions = SampleTable()
Dim ci = CultureInfo.CreateSpecificCulture("en-us")
For Each session In sessions.AsEnumerable()
Dim sessionID = session.Item("SessionID")
Dim sessionDate = CDate(session.Item("SessionStartTime")).ToString("M", ci)
Dim sessionStart = CDate(session.Item("SessionStartTime")).ToString("t", ci)
Dim sessionEnd = CDate(session.Item("SessionEndTime")).ToString("t", ci)
Dim sessionTitle = CStr(session.Item("SessionName"))
Console.WriteLine("{0}", sessionDate)
Console.WriteLine("{0} - {1} | {2}", sessionStart, sessionEnd, sessionTitle)
Next
End Sub
Public Function SampleTable() As DataTable
Dim table As New DataTable
With table
'Add Named Columns
.Columns.Add("SessionID", GetType(Integer))
.Columns.Add("SessionStartTime", GetType(Date))
.Columns.Add("SessionEndTime", GetType(Date))
.Columns.Add("SessionName", GetType(String))
'Add 5 Rows of Data to test
.Rows.Add(1, #03/14/2019 14:00:00#, #03/14/2019 19:00:00#, "Registration")
.Rows.Add(1, #03/14/2019 17:30:00#, #03/14/2019 19:00:00#, "Meetup")
.Rows.Add(1, #03/14/2019 19:30:00#, #03/14/2019 21:00:00#, "Dinner")
.Rows.Add(2, #03/15/2019 14:00:00#, #03/15/2019 19:00:00#, "Registration")
.Rows.Add(2, #03/15/2019 18:00:00#, #03/15/2019 19:00:00#, "Meetup")
End With
Return table
End Function
End Module
我引用了其他一些SO问题,例如,但我不确定LINQ是否会使预期的输出更容易获得
欢迎提出任何建议。我试图为每个循环添加一个嵌套,然后在sessionDate相同的情况下添加一个条件
******更新*******
我非常感谢您的反馈和有用的回答。我正在尝试对数据进行一次格式更改。我必须在所有事件项中添加一个特定的SVG图标。SVG图标特定于第一个、最后一个和其余的事件
我正在尝试使用LINQ提供的答案,但我还不太精通使用它,但它看起来确实很容易阅读。在本例中,字符串变量可以用作first/rest/last的占位符
我还尝试添加图标,但我没有使用LINQ
以下是更新后的代码和预期输出
March 14
2:00 PM - 7:00 PM | Registration
5:30 PM - 7:00 PM | Meetup
7:30 PM - 9:00 PM | Dinner
March 15
2:00 PM - 7:00 PM | Registration
5:30 PM - 7:00 PM | Meetup
March 14
2:00 PM - 7:00 PM | Registration
March 14
5:30 PM - 7:00 PM | Meetup
March 14
7:30 PM - 9:00 PM | Dinner
March 15
2:00 PM - 7:00 PM | Registration
March 15
6:00 PM - 7:00 PM | Meetup
预期产出
March 14
(Start SVG) 2:00 PM - 7:00 PM | Registration
(Body SVG) 5:30 PM - 7:00 PM | Meetup
(End SVG) 7:30 PM - 9:00 PM | Dinner
March 15
(Start SVG) 2:00 PM - 7:00 PM | Registration
(End SVG) 5:30 PM - 7:00 PM | Meetup
代码结构
Imports System
Imports System.Globalization
Imports System.Data
Imports System.Data.DataSetExtensions
Public Module Module1
Public Sub Main()
Dim sessions = SampleTable()
Dim ci = CultureInfo.CreateSpecificCulture("en-us")
For Each session In sessions.AsEnumerable()
Dim sessionID = session.Item("SessionID")
Dim sessionDate = CDate(session.Item("SessionStartTime")).ToString("M", ci)
Dim sessionStart = CDate(session.Item("SessionStartTime")).ToString("t", ci)
Dim sessionEnd = CDate(session.Item("SessionEndTime")).ToString("t", ci)
Dim sessionTitle = CStr(session.Item("SessionName"))
Console.WriteLine("{0}", sessionDate)
Console.WriteLine("{0} - {1} | {2}", sessionStart, sessionEnd, sessionTitle)
Next
End Sub
Public Function SampleTable() As DataTable
Dim table As New DataTable
With table
'Add Named Columns
.Columns.Add("SessionID", GetType(Integer))
.Columns.Add("SessionStartTime", GetType(Date))
.Columns.Add("SessionEndTime", GetType(Date))
.Columns.Add("SessionName", GetType(String))
'Add 5 Rows of Data to test
.Rows.Add(1, #03/14/2019 14:00:00#, #03/14/2019 19:00:00#, "Registration")
.Rows.Add(1, #03/14/2019 17:30:00#, #03/14/2019 19:00:00#, "Meetup")
.Rows.Add(1, #03/14/2019 19:30:00#, #03/14/2019 21:00:00#, "Dinner")
.Rows.Add(2, #03/15/2019 14:00:00#, #03/15/2019 19:00:00#, "Registration")
.Rows.Add(2, #03/15/2019 18:00:00#, #03/15/2019 19:00:00#, "Meetup")
End With
Return table
End Function
End Module
导入系统
进口系统.全球化
导入系统数据
导入System.Data.DataSetExtensions
公共模块模块1
公用分干管()
Dim ci=CultureInfo.CreateSpecificCulture(“en-us”)
Dim sessionion=String.Empty
'Dim Sessions=SampleTable().AsEnumerable()
'对于会话中的每个会话
'如果Sessions.Rows.IndexOf(session)=0,则
'sessionion=“开始图标”
'ElseIf Sessions.Rows.IndexOf(session)=(Sessions.Rows.Count-1)然后
'sessionion=“结束图标”
”“否则呢
'sessionion=“Rest图标”
"完"
”“接着呢
Dim sessions=SampleTable().AsEnumerable()[选择](函数(x)新增{
Key.SessionDate=x.Field(日期)(“SessionStartTime”).ToString(“M”,ci),
Key.SessionStartTime=x.Field(日期)(“SessionStartTime”).ToString(“t”,ci),
Key.sessionedtime=x.Field(日期)(“sessionedtime”).ToString(“t”,ci),
Key.SessionName=x.Field(字符串)(“SessionName”)
})
对于sessions.GroupBy中的每个g(函数s.SessionDate)
Console.WriteLine(“{0}”,g.Key)
对于每个r In g
Console.WriteLine(“{0}-{1}{2}”,r.SessionStartTime,r.sessionedtime,r.SessionName)
下一个
下一个
端接头
公共函数SampleTable()作为DataTable
Dim表作为新数据表
带桌子
'添加命名列
.Columns.Add(“SessionID”,GetType(整数))
.Columns.Add(“SessionStartTime”,GetType(日期))
.Columns.Add(“SessionEndTime”,GetType(日期))
.Columns.Add(“SessionName”,GetType(String))
'添加5行数据以进行测试
.行。添加(1,#2019年3月14日14:00:00,#2019年3月14日19:00:00,#,“注册”)
.行。添加(1,#2019年3月14日17:30:00,#2019年3月14日19:00:00,#“会议”)
.行。添加(1,#2019年3月14日19:30:00,#2019年3月14日21:00:00,#,“晚餐”)
.行。添加(2,#2019年3月15日14:00:00,#2019年3月15日19:00:00,#,“注册”)
.行。添加(2,#2019年3月15日18:00:00,#2019年3月15日19:00:00,#“会议”)
以
返回表
端函数
端模块
如果你不是在寻找新奇的东西,这可能会达到最终的结果:
Dim sessions = SampleTable()
Dim ci = CultureInfo.CreateSpecificCulture("en-us")
Dim dateList As New List(Of String)
For Each session In sessions.AsEnumerable()
Dim sessionID = session.Item("SessionID")
Dim sessionDate = CDate(session.Item("SessionStartTime")).ToString("M", ci)
Dim sessionStart = CDate(session.Item("SessionStartTime")).ToString("t", ci)
Dim sessionEnd = CDate(session.Item("SessionEndTime")).ToString("t", ci)
Dim sessionTitle = CStr(session.Item("SessionName"))
If Not dateList.Contains(sessionDate) Then
Console.WriteLine("{0}", sessionDate)
dateList.Add(sessionDate)
End If
Console.WriteLine("{0} - {1} | {2}", sessionStart, sessionEnd, sessionTitle)
Next
我添加了一个复杂性,允许以任意顺序输入事件,然后将其排序到数据视图中
Sub Main()
Dim sessions = SampleTable()
Dim SortedView As New DataView(sessions)
SortedView.Sort = "SessionStartTime"
Dim ci = CultureInfo.CreateSpecificCulture("en-us")
Dim row As DataRowView = SortedView(0)
Dim currentDate As String = #1/1/1950#.ToString("YYYY-MM-dd") 'CDate(row("SessionStartTime")).Date
For Each session As DataRowView In SortedView
If currentDate <> CDate(session.Item("SessionStartTime")).ToString("YYYY-MM-dd") Then
Dim sessionDate = CDate(session.Item("SessionStartTime")).ToString("M", ci)
Console.WriteLine("{0}", sessionDate)
currentDate = CDate(session.Item("SessionStartTime")).ToString("YYYY-MM-dd")
End If
Dim sessionID = session.Item("SessionID")
Dim sessionStart = CDate(session.Item("SessionStartTime")).ToString("t", ci)
Dim sessionEnd = CDate(session.Item("SessionEndTime")).ToString("t", ci)
Dim sessionTitle = CStr(session.Item("SessionName"))
Console.WriteLine("{0} - {1} | {2}", sessionStart, sessionEnd, sessionTitle)
Next
Console.ReadLine()
End Sub
Public Function SampleTable() As DataTable
Dim table As New DataTable
With table
'Add Named Columns
.Columns.Add("SessionID", GetType(Integer))
.Columns.Add("SessionStartTime", GetType(Date))
.Columns.Add("SessionEndTime", GetType(Date))
.Columns.Add("SessionName", GetType(String))
.Rows.Add(2, #03/15/2019 18:00:00#, #03/15/2019 19:00:00#, "Meetup")
'Add 5 Rows of Data to test
'Notice that the Events do not have to added in order
.Rows.Add(2, #03/15/2019 18:00:00#, #03/15/2019 19:00:00#, "Meetup")
.Rows.Add(1, #03/14/2019 14:00:00#, #03/14/2019 19:00:00#, "Registration")
.Rows.Add(1, #03/14/2019 17:30:00#, #03/14/2019 19:00:00#, "Meetup")
.Rows.Add(1, #03/14/2019 19:30:00#, #03/14/2019 21:00:00#, "Dinner")
.Rows.Add(2, #03/15/2019 14:00:00#, #03/15/2019 19:00:00#, "Registration")
End With
Return table
End Function
Sub-Main()
Dim sessions=样本表()
Dim SortedView作为新数据视图(会话)
SortedView.Sort=“会话开始时间”
Dim ci=CultureInfo.CreateSpecificCulture(“en-us”)
将行变暗为DataRowView=SortedView(0)
Dim currentDate作为字符串=#1/1/1950#.ToString(“YYYY-MM-dd”)CDate(行(“会话开始时间”)。日期
在SortedView中作为DataRowView的每个会话
如果currentDate CDate(session.Item(“SessionStartTime”)).ToString(“YYYY-MM-dd”),则
Dim sessionDate=CDate(session.Item(“sessionstart”)).ToString(“M”,ci)
Console.WriteLine(“{0}”,sessionDate)
currentDate=CDate(session.Item(“SessionStartTime”)).ToString(“YYYY-MM-dd”)
如果结束
Dim sessionID=session.Item(“sessionID”)
Dim sessionStart=CDate(session.Item(“sessionStart”)).ToString(“t”,ci)
Dim sessionEnd=CDate(session.Item(“SessionEndTime”)).ToString(“t”,ci)
Dim sessionTitle=CStr(session.Item(“SessionName”))
Console.WriteLine(“{0}-{1}{2}”,sessionStart,sessionEnd,sessionTitle)
下一个
Console.ReadLine()
端接头
公共函数SampleTable()作为DataTable
Dim表作为新数据表
带桌子
'添加命名列
.Columns.Add(“SessionID”,GetType(整数))
.Columns.Add(“SessionStartTime”,GetType(日期))
.Columns.Add(“SessionEndTime”,GetType(日期))
.Columns.Add(“SessionName”,GetType(String))
.行。添加(2,#2019年3月15日18:00:00,#2019年3月15日19:00:00,#“会议”)
'添加5行数据以进行测试
'请注意,事件不必按顺序添加
.行。添加(2,#2019年3月15日18:00:00,#2019年3月15日19:00:00,#“会议”)
.行。添加(1,#2019年3月14日14:00:00,#2019年3月14日19:00:00,#,“注册”)
.行。添加(1,#2019年3月14日17:30:00,#2019年3月14日19:00:00,#“会议”)
.行。添加(1,#2019年3月14日19:30:00,#2019年3月14日21:00:00,#,“晚餐”)
.行。添加(2,#2019年3月15日14:00:00,#2019年3月15日19:00:00,#,“注册”)
以
返回表
端函数
使用LINQ时,如下所示
Public Sub Main()
Dim ci = CultureInfo.CreateSpecificCulture("en-us")
Dim sessions = SampleTable().AsEnumerable().[Select](Function(x) New With {
Key .SessionDate = x.Field(Of Date)("SessionStartTime").ToString("M", ci),
Key .SessionStartTime = x.Field(Of Date)("SessionStartTime").ToString("t", ci),
Key .SessionEndTime = x.Field(Of Date)("SessionEndTime").ToString("t", ci),
Key .SessionName = x.Field(Of String)("SessionName")
})
For Each g In sessions.GroupBy(Function(s) s.SessionDate)
Console.WriteLine("{0}", g.Key)
For Each r In g
Console.WriteLine("{0} - {1} | {2}", r.SessionStartTime, r.SessionEndTime, r.SessionName)
Next
Next
End Sub
加成
基本上,你的思维方式没有错。
添加该代码的位置略有不同。
因为你