【问题标题】:Convert .ToHashset Result from (Of Char) to (Of String)?将 .ToHashset 结果从 (Of Char) 转换为 (Of String)?
【发布时间】:2018-11-23 06:47:50
【问题描述】:

我在使用 Linq 方面没有真正的经验,我正在努力理解 .ToHashSet

我正在为此使用 VB。

我有这个代码:

' Import the list of Windows Classes to exclude; one per line.
Dim strRead As String = My.Computer.FileSystem.ReadAllText("C:\Exclude.txt")

' Split the string into a string array
Dim strExcludes As String() = strRead.Split(ControlChars.CrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)

' Convert the String Array to a HashSet (Traditional Method)
Dim lList As New HashSet(Of String)(strExcludes)

这按预期工作;我将文本文件中的每一行作为每个 Key 1 行放入 HashSet。

现在,我想看看如何使用.ToHashSet 来做同样的事情。下面的代码似乎可以正常工作,只是它返回类型为<Of Char>,所以我在它自己的 Key 中获取每个字符,而不是在它自己的 Key 中获取每一行。

' Convert the String Array to a HashSet (Using System.Linq Method) (Unfinished: Works, but needs to be converted from Char to String)
Dim lListLinq = strRead.ToHashSet()

我已经用谷歌搜索过,并与它进行了一些斗争,试图让它以 <Of String> 类型返回,但对于 VB 的 .ToHashSet 或在 C# 中关于这个特定的信息,没有太多谷歌信息问题。我没有看到在哪里进行转换; .ToHashSet 本身也不接受任何参数。

有人知道我错过了什么吗?我有一种感觉,这是一件非常简单的事情。

【问题讨论】:

    标签: vb.net linq hashset


    【解决方案1】:

    在字符串上调用ToHashSet() 将产生HashSet(Of Char),并且不会像您所见证的那样给出预期的结果。

    相反,您需要做的是拆分ReadAllText 返回的字符串,然后对其调用ToHashSet() 以获取HashSet(Of String)

    strRead.Split(ControlChars.CrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToHashSet()
    

    【讨论】:

    • 我假设我需要把它放在strExcludes 在这条线上:Dim lList As New HashSet(Of String)(strExcludes)?将 .ToHashSet 添加到该行有什么区别,或者只是将其省略,然后将行的其余部分放在那里?
    • @J.ScottElblein 我的意思是,如果你调用strRead.ToHashSet,这将返回一个HashSet(Of Char),其中集合的每个元素都是一个字母,这不是你想要的.因此,为了获得HashSet(Of String),您需要拆分ReadAllText 返回的单个字符串以将每一行分开,此时您可以将其转换为HashSet(Of String),例如Dim result as HashSet(Of String) = My.Computer.FileSystem.ReadAllText("C:\Exclude.txt").Split(ControlChars.CrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToHashSet().
    • 我发誓我不是在争论,哈哈,但这本质上似乎是一回事。我将其标记为最佳答案,但我只想清楚地理解。如果我这样做:Dim result As New HashSet(Of String)(My.Computer.FileSystem.ReadAllText("C:\Exclude.txt").Split(ControlChars.CrLf.ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) 我所做的只是将New 添加到声明中,删除= 并将行放在括号内,然后删除.ToHashSet 并得到相同的结果。我想我只是希望 Linq 会更流畅,哈哈。
    • @J.ScottElblein 完全没问题;-)。你问过你想尝试ToHashSet,是的,我同意你的看法,差别很小......我看到使用.ToHashSet而不是New HashSet(Of String)(...)的唯一优势是你可以直接拨打ToHashSet IEnumerable 链可以提高可读性,过去人们一直在制作自己的 ToHashSet 扩展方法,因此微软决定将其作为一种方法。
    • @J.ScottElblein 的另一个优点是ToHashSet 也比New HashSet(Of T)(...) 短;-)
    猜你喜欢
    • 1970-01-01
    • 2015-12-28
    • 2015-09-04
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多