在VB.NET中格式化DataTable中有或没有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

我在尝试将一些数据正确格式化时遇到了一些问题

我不确定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
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
加成

基本上,你的思维方式没有错。 添加该代码的位置略有不同。 因为你