VB.NET 关于数据类型

Roock 2009-07-06 01:16:23
如下表格所示,有三列信息("专业","班级","人员列表"),在一个文档里面,
现在想用VB.NET写个程序,把这些信息一次性读到一个变量里面去,然后后续的处理就不用每次都去读文档.
要求: "专业" , "班级" , "人员列表" 三列的信息数量都不固定.
请问一下有什么数据类型可以做到这一点?并麻烦详细说明一下,谢谢!



专业 | 班级 | 人员列表
------|----------------------
| |张某
| 201班 |王某
| |李某
| |......
|-----------------------
计算机| |张某
| 202班 |王某
| |刘某
| |......
--------------------------------
| |杨某
会计 | 301班 |刘某
| |赵某
| |......
---------------------------------
...全文
210 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Roock 2009-07-09
  • 打赏
  • 举报
回复
谢谢大家.
特别谢谢hztltgg(我想我是风)一直Follow此问题,问题已经解决.
Roock 2009-07-07
  • 打赏
  • 举报
回复
真是太感谢了, SYSSZ(老张)和hztltgg(我想我是风)的答案是我想要的.
不过有个问题想问一下:
我可以通过 specializedfield(0)(1)(2)来准确定位到每一个人员,
想问一下能不能通过specializedfield来确定到有几个"专业",对应专业下有几个"班级",对应班级有几个"人员"?
简单的说就是如何知道specializedfield()()()三个括号分别的上限是多少?不用去看前面List的情况下.
谢谢了...
hztltgg 2009-07-07
  • 打赏
  • 举报
回复

Public Class 专业
Public Name As String
Public 班级列表 As New List(Of 班级)
End Class

Public Class 班级
Public Name As String
Public 人员列表 As New List(Of 人员)
End Class

Public Class 人员
Public Name As String
End Class

Module Module1

Sub Main()

'=================================
Dim 人员J_201_1 As New 人员 With {.Name = "张某"}
Dim 人员J_201_2 As New 人员 With {.Name = "王某"}
Dim 人员J_201_3 As New 人员 With {.Name = "李某"}

Dim 人员列表J_201 As New List(Of 人员)

人员列表J_201.Add(人员J_201_1)
人员列表J_201.Add(人员J_201_2)
人员列表J_201.Add(人员J_201_3)

Dim 班级J_201 As New 班级 With {.Name = "201班", .人员列表 = 人员列表J_201}


'=================================
Dim 人员J_202_1 As New 人员 With {.Name = "张某"}
Dim 人员J_202_2 As New 人员 With {.Name = "王某"}
Dim 人员J_202_3 As New 人员 With {.Name = "刘某"}

Dim 人员列表J_202 As New List(Of 人员)

人员列表J_202.Add(人员J_202_1)
人员列表J_202.Add(人员J_202_2)
人员列表J_202.Add(人员J_202_3)

Dim 班级J_202 As New 班级 With {.Name = "202班", .人员列表 = 人员列表J_202}

'======================================
Dim 人员K_301_1 As New 人员 With {.Name = "杨某"}
Dim 人员K_301_2 As New 人员 With {.Name = "刘某"}
Dim 人员K_301_3 As New 人员 With {.Name = "赵某"}

Dim 人员列表K_301 As New List(Of 人员)

人员列表K_301.Add(人员K_301_1)
人员列表K_301.Add(人员K_301_2)
人员列表K_301.Add(人员K_301_3)

Dim 班级K_301 As New 班级 With {.Name = "301班", .人员列表 = 人员列表K_301}

'=====================================

Dim 计算机专业班级列表 As New List(Of 班级)

计算机专业班级列表.Add(班级J_201)
计算机专业班级列表.Add(班级J_202)

Dim 会计专业班级列表 As New List(Of 班级)

会计专业班级列表.Add(班级K_301)

'=============================

Dim 计算机专业 As New 专业 With {.Name = "计算机", .班级列表 = 计算机专业班级列表}

Dim 会计专业 As New 专业 With {.Name = "会计", .班级列表 = 会计专业班级列表}



End Sub

End Module


你可以在最后设一个断点,看一下计算机专业,会计专业 这两个变量的值,应该就知道怎么访问数量了,有count属性。

还有,别用中文命名这些变量吧,这儿是为了说明方便
Roock 2009-07-07
  • 打赏
  • 举报
回复
我顶.
herohlq 2009-07-07
  • 打赏
  • 举报
回复
UP
oo渣渣oo 2009-07-07
  • 打赏
  • 举报
回复
结构定义的每个变量前面写漏了"Dim",自己加上吧
oo渣渣oo 2009-07-07
  • 打赏
  • 举报
回复
定义几个结构就能轻松搞定了:


'班级人员列表定义
Public Structure ClassList
ClasName As String '班级名称
StudNum As Integer '表示人员数量
StudName() As String '人员列表
End Structure

'专业列表
Public Structure SpecList
SpecName As String '专业名称
ClasNum As Integer '表示班级数量
ClasInfo() As ClassList '班级列表
End Structure



使用的时候直接

Dim a() As SpecList
Roock 2009-07-07
  • 打赏
  • 举报
回复
hztltgg(我想我是风),你太帅了,一下子就说到了问题的关键所在,的确用了前面的方法后没有办法把名字存进去.
能不能针对我的这种情况,详细说明一下vwxyzh(为什么只能写这点字了?????)说的定义三个类的方法.
谢谢了.
shockcqyc 2009-07-07
  • 打赏
  • 举报
回复
既然市面向对象的语言,为什么不用类或者结构呢
ScottYj 2009-07-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 syssz 的回复:]
VB.NET codePublicClass Form1PrivateSub Form1_Load(ByVal senderAsObject,ByVal eAs System.EventArgs)HandlesMe.LoadDim classe201()AsString= {"张三","李四","王五"}Dim classe202()AsString= {"孙大","刘七","赵乙"}Dim cl¡­
[/Quote]
hztltgg 2009-07-07
  • 打赏
  • 举报
回复
数组Length属性
集合Count属性

一般也可以通过for each循环或linq方式来遍历

specializedfield.Length
specializedfield().Length
specializedfield()().Length

computer.Count
computer(1).Count

这样,不过正解应该是vwxyzh的,需要建三个类,分别存放人员,班级和专业,我们可能都比较懒,不行写的这么麻烦,不过不独立写类,连班级名称,专业名词都没对方存
vwxyzh 2009-07-06
  • 打赏
  • 举报
回复
public class 专业
public Name As String
public 班级列表 As New List(of 班级)
end class

public class 班级
public Name As String
public 人员列表 As New List(of 人员)
end class

public class 人员
public Name As String
end class
hztltgg 2009-07-06
  • 打赏
  • 举报
回复

Dim classe201 As New List(Of String)
classe201.Add("张三")
classe201.Add("李四")
classe201.Add("王五")

Dim classe202 As New List(Of String)
classe202.Add("孙大")
classe202.Add("刘七")
classe202.Add("赵乙")

Dim classe301 As New List(Of String)
classe301.Add("李甲")
classe301.Add("杨丙")
classe301.Add("胡丁")
classe301.Add("方小三")

Dim computer As New List(Of List(Of String))
computer.Add(classe201)
computer.Add(classe202)

Dim accounting As New List(Of List(Of String))
accounting.Add(classe301)

Debug.Print(computer(1)(0))


SYSSZ 2009-07-06
  • 打赏
  • 举报
回复
Public Class Form1

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim classe201() As String = {"张三", "李四", "王五"}
Dim classe202() As String = {"孙大", "刘七", "赵乙"}
Dim classe301() As String = {"李甲", "杨丙", "胡丁", "方小三"}
Dim Computer() As Object = {classe201, classe202}
Dim accounting() As Object = {classe301}
Dim specializedfield() As Object = {Computer, accounting}
Debug.WriteLine(specializedfield(0)(1)(2).ToString)
End Sub
End Class
一只熊猫 2009-07-06
  • 打赏
  • 举报
回复
呵呵,那你把数据导入sql吧,然后统计、分析、排序、查找....想怎么整就怎么整吧。
Roock 2009-07-06
  • 打赏
  • 举报
回复
感谢 bjliuzg ,你的方法是解决了 Going1981 的固定条目的问题,但是大体思路是一样的,也是按照每个人员去定义一个Item,对后面去处理不太方便.

不知道还有没有更好的方法?
bjliuzg 2009-07-06
  • 打赏
  • 举报
回复
for i as integer = 0 to count -1
newinfo(i).专业 = ds.Tables(0).Rows(i).Item(0)
newinfo(i).班级 = ds.Tables(0).Rows(i).Item(1)
newinfo(i).人员列表 = ds.Tables(0).Rows(i).Item(2)
next

呵呵,急中生乱了,不好意思,循环体用这个
用 rows(i) 来循环遍历
Roock 2009-07-06
  • 打赏
  • 举报
回复
感谢 Going1981.
不过这样子的话,每一个人员都要定义为一个数组项,不是很理想,而且不利于我后续的处理.
比如我要知道202班有多少个人,还有去搜整个数组,然后去加条件判断.

我刚才一直在想,有没有一数据类型可以三个数组联系起来的,
比如: SPEC().CLAS().PRSN()
这样的话就很方便,我给SPEC(0)="计算机"
SPEC(1)="会计"
然后再给SPEC(0).CLAS(0)="201班"
SPEC(0).CLAS(1)="202班"

然后再给SPEC(0).CLAS(0).PRSN(0)="张某"
SPEC(0).CLAS(0).PRSN(1)="王某"
SPEC(0).CLAS(0).PRSN(2)="李某"
.........
请高手指点.
bjliuzg 2009-07-06
  • 打赏
  • 举报
回复
上面的结构体应该是 structure 不是 function 呵呵 不好意思,写错了
bjliuzg 2009-07-06
  • 打赏
  • 举报
回复
2楼的方法基本是可行的,不过你定义的是固定条数的,如果内容要是多余10条怎么办呢,要是100条数据的话这样做就有点麻烦了

定义一个结构体:
public function 人员信息
friend 专业 as string
friend 班级 as string
friend 人员列表 as string
end function

估计楼主的信息是检索出来的吧,那么可以用一个循环体实现一次读取
dim count as integer = 检索出来的信息的条数(ds.Tables(0).Rows.Count)

dim newinfo(count) as new 人员信息

for i as integer = 0 to count -1
newinfo(i).专业 = ds.Tables(0).Rows.Item(0)
newinfo(i).班级 = ds.Tables(0).Rows.Item(1)
newinfo(i).人员列表 = ds.Tables(0).Rows.Item(2)
next

当然你的sql检索顺序应该是 专业,班级,人员列表,这样就可以一次性的把数据都存放到newinfo数组中了
当你用的时候,可以访问 newinfo(n)

呵呵 我自己试过了,完全是可以的,如果有不清楚的地方,还可以问,希望以上对你有所帮助。
加载更多回复(3)

16,547

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧