将 .Contains 与 List(Of Structures

Using .Contains with List(Of Structures

此代码有效 - 我得到 true,然后 false

Dim listDates As New List(Of Date)
listDates.Add("2022-03-15")
Debug.Print(listDates.Contains("2022-03-15"))
Debug.Print(listDates.Contains("2022-03-16"))

如果不是简单的日期列表,而是结构列表,是否可以在没有循环的情况下进行类似的测试?

Public Structure FileData
    Public FileName As String
    Public FileDate As Date
    Public FileType As String
End Structure

Dim listDates2 As New List(Of FileData)
Dim oneFileData As New FileData
oneFileData.FileDate = "2022-03-15"
listDates2.Add(oneFileData)
Debug.Print(listDates2.Contains("2022-03-15"))
Debug.Print(listDates2.Contains("2022-03-16"))

最后两行给我 "Value of type 'string' cannot be converted to 'FileData' 语法错误,这是可以理解的。但是没有循环,有没有办法在结构的 FileDate 元素中查找匹配元素?类似于这些伪代码尝试(也不起作用):

Debug.Print(listDates2.FileDate.Contains("2022-03-15"))
Debug.Print(listDates2(FileDate).Contains("2022-03-15"))

Any扩展方法就是你想要的。 Contains 方法基本上是说“列表是否包含等于此的项目”,而 Any 方法是说“列表是否包含满足此条件的项目”。你的情况:

Debug.Print(listDates2.Any(Function(fd) fd.FileDate = "2022-03-15"))

您也可以这样做:

Debug.Print(listDates2.Select(Function(fd) fd.FileDate).Contains("2022-03-15"))

正如约翰指出的那样,我没有使用 Option Strict On。 所以下面的代码使用了 Option Strict On 并且也使用了 John 的答案,稍作改动以满足 Option Strict On 的要求。

现在可以正常使用了!

Public Structure FileData
    Public FileName As String
    Public FileDate As Date
    Public FileType As String
End Structure

Dim listDates2 As New List(Of FileData)
Dim oneFileData As New FileData
oneFileData.FileDate = CDate("2022-03-15")
listDates2.Add(oneFileData)
Debug.Print(CType(listDates2.Any(Function(fd) fd.FileDate = CDate("2022-03-15")), String))
Debug.Print(CType(listDates2.Any(Function(fd) fd.FileDate = CDate("2022-03-16")), String))