在vb.net中匹配单词并添加数量

在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

我试图编程一种读取文本文件并匹配所有值及其数量的方法。例如,如果文本文件如下所示: 面包-10面粉-2橘子-2面包-3

我想创建一个包含所有常用词总数的列表。我开始编写我的代码,但我很难理解这些值的总和。我没有要求任何人为我编写代码,但我在寻找资源方面遇到了困难。我有以下代码:

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有任何特定的历史知识。啊,是的-这是可能的!如果我的叙述和假设不正确,我向海报道歉。