在vb.net中匹配单词并添加数量
我试图编程一种读取文本文件并匹配所有值及其数量的方法。例如,如果文本文件如下所示: 面包-10面粉-2橘子-2面包-3 我想创建一个包含所有常用词总数的列表。我开始编写我的代码,但我很难理解这些值的总和。我没有要求任何人为我编写代码,但我在寻找资源方面遇到了困难。我有以下代码:在vb.net中匹配单词并添加数量,vb.net,text,Vb.net,Text,我试图编程一种读取文本文件并匹配所有值及其数量的方法。例如,如果文本文件如下所示: 面包-10面粉-2橘子-2面包-3 我想创建一个包含所有常用词总数的列表。我开始编写我的代码,但我很难理解这些值的总和。我没有要求任何人为我编写代码,但我在寻找资源方面遇到了困难。我有以下代码: Dim query = From data In IO.File.ReadAllLines("C:\User\Desktop\doc.txt") Let name As
Dim query = From data In IO.File.ReadAllLines("C:\User\Desktop\doc.txt")
Let name As String = data.Split("-")(0)
Let quantity As Integer = CInt(data.Split("-")(1))
Let sum As Integer = 0
For i As Integer = 0 To query.Count - 1
For j As Integer = i To
Next
谢谢好的,让我们把它分解一下。而且我很长一段时间没有看到使用LET命令(回到GWBASIC时代!) 但是,没关系 首先,我们假设您的文本文件如下:
Bread-10
Flour-2
Orange-2
Bread-3
与此相反:
Bread-10 Flour-2 Orange-2 Bread-3
现在,我们可以读一行,然后处理信息。或者我们可以读取所有的文本行,然后处理数据。如果文件不是很大(比如说100行),那么性能就不是什么大问题,所以让我们一次读入整个文件(您的代码也有这个想法)
你的开始代码很好。所以,让我们保持它(好吧,非常接近)
有几件事:
我们的任务不需要出租。旧的BASIC语言有这个功能,而vb.net仍然支持这个功能?我们不需要它。(但是你会在vb.net中看到这样的例子——特别是我们称之为“类”模块代码或“自定义类”的代码。不过,还是让我们改天再说吧
现在是下一部分?我们可以开始构建一个数组,查找现有值,然后添加它。但是,这需要一些额外的数组和一些额外的循环
然而,在.net领域,我们有一个很酷的东西叫做字典
这只是一个非常像数组的集合的花哨术语,但它有一些额外的“花哨”特性。花哨的特性是,它允许一个人通过一个“键”名称将内容放入简单的列表中,然后通过键将“值”取出
这为我们节省了大量额外的循环类型的代码。
这也意味着我们不需要数组来计算结果。
这个密钥系统也非常快(在幕后它使用了一些很酷的概念——哈希编码)
因此,我们执行此操作的代码如下所示:
Bread-10
Flour-2
Orange-2
Bread-3
注意,我本可以在这里或那里保存几行代码,但这会使代码难以阅读
考虑到您希望拥有Fortran或更老的基本语言经验,那么让我们尝试保持代码样式的相似性。令人惊讶的是,vb.net似乎在这里使用了甚至40年的基本语法类型
请注意,vb.net中的arrays()确实有一些奇特的“find”选项,但字典结构更为出色。这也意味着我们通常可以遍历结果,而不需要在数组末尾使用i=1,并且必须以这种方式提取值
我们每个人都可以用
因此,这将起作用:
Dim MyData() As String ' an array() of strings - one line per array
MyData = File.ReadAllLines("c:\test5\doc.txt") ' read each line to array()
Dim colSums As New Dictionary(Of String, Integer) ' to hold our values and sum them
Dim sKey As String
Dim sValue As Integer
For Each strLine As String In MyData
sKey = Split(strLine, "-")(0)
sValue = Split(strLine, "-")(1)
If colSums.ContainsKey(sKey) Then
colSums(sKey) = colSums(sKey) + sValue
Else
colSums.Add(sKey, sValue)
End If
Next
' display results
Dim KeyPair As KeyValuePair(Of String, Integer)
For Each KeyPair In colSums
Debug.Print(KeyPair.Key & " = " & KeyPair.Value)
Next
上述结果将在调试窗口中显示此输出:
Bread = 13
Flour = 2
Orange = 2
我很想在这里用vb.net中的纯数组()来编写这段代码,因为这会让您对我们在这里可以使用的“旧”类型的编码和语法有一个很好的了解,而且这种方法可以追溯到那些旧的PC基本系统
虽然字典的功能更先进,但这里的学习曲线是值得的,它使这个问题变得更容易。我的意思是,如果这是一个较长的列表,那么我将开始考虑引入某种数据库系统。< /P>
然而,如果没有一些数据系统,那么字典功能是一个受欢迎的方法,因为“键”值查找功能,无需循环。这也是一个非常高速的系统,因此循环代码不多,更好的是,我们编写的代码更少。每个值都设置在文本文件的一行上吗?谢谢你,艾伯特,我感谢你的帮助。我也将学习字典路径。我最近遇到了很多问题,支持是语言。所以我很感谢你抽出时间来做这件事!我认为在这种情况下,
Let
是“特别的”用于设置Linq查询,而不是表示变量赋值的历史用法。我不认为OP有任何特定的历史知识。啊,是的-这是可能的!如果我的叙述和假设不正确,我向海报道歉。