如何通过 vb.net 中的 linq 重复 2 个日期之间的日期范围

问题描述 投票:0回答:1

我正在尝试通过 vb.net 中的 linq 重复 2 个日期之间的日期范围

下面是datetimepicker控件中的开始和结束日期信息

startDate = 16-Mar-24
endDate   = 22-Mar-24 

所以我希望能够重复,如果它超出了数据文件所基于的日期

ID
[DATE]
INOUT

喜欢下面想要的结果

Private Sub Form6_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Me.ReadDatFile()
End Sub

Private Sub ReadDatFile()
    OpenFileDialog1.InitialDirectory = "E:\TestFile"
    OpenFileDialog1.Filter = "Dat files(*.Dat)|*.Dat"
    OpenFileDialog1.RestoreDirectory = True
    OpenFileDialog1.ShowDialog()
    Me.Activate()
End Sub

Private Sub OnFilter(ByVal sender As Object, ByVal e As EventArgs) Handles btnFilter.Click
    Dim datfiles As List(Of DatFile) = New List(Of DatFile)()
    Dim lines As String() = File.ReadAllLines(OpenFileDialog1.FileName)

    For i As Integer = 0 To lines.Length - 1
        If Not String.IsNullOrEmpty(lines(i).Trim()) Then
            Dim data As String() = lines(i).Trim().Split(CType(vbTab, Char()))
            datfiles.Add(New DatFile With {
                .ID = Convert.ToInt32(data(0)),
                .DATE = CDate(data(1).ToString().Split(" "c)(0)),
                .TIME = data(1).ToString().Split(" "c)(1),
                .FP = data(2),
                .INOUT = If(data(3).ToString() = "0", "IN", "OUT"),
                .OTHERS1 = data(4),
                .OTHERS2 = data(5)
            })
        End If
    Next
    Dim dtStart As DateTime = Convert.ToDateTime(startDate.Value).Date
    Dim dtEnd As DateTime = Convert.ToDateTime(endDate.Value).Date
    datfiles = datfiles.Where(Function(x) Convert.ToDateTime(x.DATE) >= dtStart AndAlso Convert.ToDateTime(x.DATE) <= dtEnd).ToList()
    DataGridView1.DataSource = datfiles
End Sub

Public Class DatFile
    Public Property ID As Integer
    Public Property [DATE] As DateTime
    Public Property TIME As String
    Public Property FP As String
    <DisplayName("IN/OUT")>
    Public Property INOUT As String
    Public Property OTHERS1 As String
    Public Property OTHERS2 As String
End Class

数据文件示例

 5010   2024-03-17 06:59:10 1   0   0   0
 5014   2024-03-17 07:11:00 1   0   0   0
 5014   2024-03-17 16:32:09 1   1   0   0
 5010   2024-03-17 16:33:19 1   1   0   0
 5010   2024-03-18 06:59:10 1   0   0   0
 5014   2024-03-18 07:11:00 1   0   0   0
 5014   2024-03-18 16:32:09 1   1   0   0
 5010   2024-03-18 16:33:19 1   1   0   0
 5010   2024-03-19 07:05:15 1   0   0   0
 5014   2024-03-19 07:31:19 1   0   0   0
 5014   2024-03-19 16:30:50 1   1   0   0
 5010   2024-03-19 16:31:12 1   1   0   0

代码结果

身份证 日期 时间 FP 输入输出 其他1 其他2
5010 24 年 3 月 17 日 06:59:10 1 0 0
5014 24 年 3 月 17 日 07:11:00 1 0 0
5014 24 年 3 月 17 日 16:32:09 1 0 0
5010 24 年 3 月 17 日 16:33:19 1 0 0
5010 24 年 3 月 18 日 06:59:10 1 0 0
5014 24 年 3 月 18 日 07:11:00 1 0 0
5014 24 年 3 月 18 日 16:32:09 1 0 0
5010 24 年 3 月 18 日 16:33:19 1 0 0
5010 24 年 3 月 19 日 07:05:15 1 0 0
5014 24 年 3 月 19 日 07:31:19 1 0 0
5014 24 年 3 月 19 日 16:30:50 1 0 0
5010 24 年 3 月 19 日 16:31:12 1 0 0

期望的结果

身份证 日期 时间 FP 输入输出 其他1 其他2
5010 24 年 3 月 16 日
5014 24 年 3 月 16 日
5014 24 年 3 月 16 日
5010 24 年 3 月 16 日
5010 24 年 3 月 17 日 06:59:10 1 0 0
5014 24 年 3 月 17 日 07:11:00 1 0 0
5014 24 年 3 月 17 日 16:32:09 1 0 0
5010 24 年 3 月 17 日 16:33:19 1 0 0
5010 24 年 3 月 18 日 06:59:10 1 0 0
5014 24 年 3 月 18 日 07:11:00 1 0 0
5014 24 年 3 月 18 日 16:32:09 1 0 0
5010 24 年 3 月 18 日 16:33:19 1 0 0
5010 24 年 3 月 19 日 07:05:15 1 0 0
5014 24 年 3 月 19 日 07:31:19 1 0 0
5014 24 年 3 月 19 日 16:30:50 1 0 0
5010 24 年 3 月 19 日 16:31:12 1 0 0
5010 24 年 3 月 20 日
5014 24 年 3 月 20 日
5014 24 年 3 月 20 日
5010 24 年 3 月 20 日
5010 24 年 3 月 21 日
5014 24 年 3 月 21 日
5014 24 年 3 月 21 日
5010 24 年 3 月 21 日
5010 24 年 3 月 22 日
5014 24 年 3 月 22 日
5014 24 年 3 月 22 日
5010 24 年 3 月 22 日
vb.net split date-range
1个回答
0
投票

这不是一个基于纯 LINQ 的解决方案,但至少它可能会有所帮助。

加载

datfiles
列表后,制作所有ID的列表:

DIM All_IDs AS LIST(of integer) = (
    FROM df IN datfiles
    GROUP BY the_ID = df.ID
        INTO GROUP
    SELECT the_ID
    ).tolist

并列出从

startDate
endDate
的所有日期:

DIM All_Dates AS NEW LIST(of date)
DIM day AS date=startDate
WHILE day <= endDate
    All_Dates.add(day)
    day=day.AddDays(1)
END WHILE   

在覆盖每个日期 ID 的所有可能组合的嵌套循环中,检查丢失的记录并根据它在

datfiles
:

中添加一条记录
WITH datfiles
    All_Dates.foreach(SUB(the_Date)
        All_IDs.foreach(SUB(the_ID)
            IF .WHERE(FUNCTION(x) x.DATE=the_Date ANDALSO x.ID=the_ID ANDALSO x.INOUT=0).Count=0 THEN
                .add(NEW datfile WITH {.ID=the_ID , .[DATE]=the_Date , .INOUT=0})
            END IF
            IF .WHERE(FUNCTION(x) x.DATE=the_Date ANDALSO x.ID=the_ID ANDALSO x.INOUT=1).Count=0 THEN
                .add(NEW datfile WITH {.ID=the_ID , .[DATE]=the_Date , .INOUT=1})
            END IF
        End SUB)
    End SUB)
END WITH

现在查询结果:

DIM Results =
    FROM df IN datfiles
    WHERE df.[DATE] >= startDate ANDALSO df.[DATE] <= endDate
    SELECT 
        df.ID,
        df.[DATE],
        df.TIME,
        df.FP,
        INOUT = IF(df.INOUT = 0, "IN", "OUT"),
        df.OTHERS1,
        df.OTHERS2
    ORDER BY [DATE],ID,INOUT
© www.soinside.com 2019 - 2024. All rights reserved.