创建一个包含两列值的VB.NET数组?

4

我知道如何创建一个数组并正常地循环遍历它 - 但如果我需要一个多列数组怎么办。例如,通常我可能会这样做:

For Each row in NameofArray
  Dim name as String = row
  Response.Write("Hello " & name & "!")
Next

但是如果我想做这样的事情:

For Each row in NameofArray
   Dim name as String = row.name
   Dim age as Integer = row.age
   Response.Write("Hello " & name & "! You are " & age & " years old!"
Next

如果使用数组无法实现这一点,是否有其他方法可以完成这个任务?

你的第二个例子看起来非常可行。NameofArray 究竟是什么类型的对象?某种强类型数组吗? - El Ronnoco
那就是我需要弄清楚的。我知道如何设置一个只有一列的数组 - 但它可以有两列吗?例如,我可以轻松地使用Dim my_array as array("hello", "goodbye", "adios"),但如果我想要两列,例如Dim my_array as array("hello" "1", "goodbye" "4", "adios" "0"),我该怎么做呢? - Dave Mackey
5个回答

4
创建自定义数据类型:
 public struct DataType 
    public string Name; 
    public int Age; 
 }

您可以像这样在数组中使用此类型:
 DataType[] myData = new DataType[100]; 
 myData[0].Name = "myName"; 
 myData[0].Age = 100; 

请注意,如果通过foreach循环遍历该数组,则每次迭代返回的元素不能被更改。如果这对您来说是一个要求,请考虑在上面的DataType声明中使用“class”而不是“struct”。尽管如此,这将带来一些其他影响。例如,必须通过“new”关键字显式创建类DataType的实例。

2
“new”关键字并不是很重要,使用类可能是更好的选择。 - Martin
1
我觉得这是一个VB问题。 - Jodrell
我明白了,所以只读使用结构体,读写则需要创建一个新类? - Dave Mackey
结构体是值类型,类是引用类型。如果您想指定额外的功能,请使用类。 - Jodrell
1
@davemackey,你可以使用结构体和类来实现这两种方式。只是由于结构体的特性,foreach循环只能访问到真实结构体元素的副本。如果你必须依赖foreach循环,那么类更适合。否则,你也可以使用结构体数组。但是元素只能通过直接索引进行写入,就像我上面的例子一样。 - user492238

3

阅读您的评论后,我认为我的另一个回答可能是您要找的。

row的类型是什么,NameOfArray的类型是什么?

如果您想将row变成具有多个成员的复合类型,则有几种选择。

Structure Row
   Public Name as String
   Public Age as Integer
End Structure

例如,如果您想要一个引用类型替代Structure,请使用Class
或者可以使用匿名类型,
Dim row = New With {Name = "Bob", Age = 21}

然后您可以使用泛型来创建一组行,您可以使用 ForEach 迭代。

Dim NameOfList As System.Collections.Generic.List(of Row)

或者如果它是一个LINQ查询的结果,支持某些内容

IEnumerable(of New With{Name As String, Age As Int}). //Not sure if this is VB

我不确定我理解你的问题,并希望这是你想要的类型。

正如其他回答者所说,C#对匿名类型的支持更加出色,但由于你在VB.Net中提出了问题,因此我将限制自己在该上下文中。


2

阅读了您的评论,我认为我理解了这个问题。

你可以做:

///Spacer Top
Dim NameOfArray = {New With {.Age = 21, .Name = "Bob"}, New With {.Age = 74, .Name = "Gramps"}}
///Spacer Bottom

如果您想创建一个包含名称和年龄元组的IEnumberable匿名类型;-p

1

你试过字典类吗?你可以使用键值对类(KeyValue pair class)循环遍历字典。

// Create a new dictionary of strings, with string keys.
//
Dictionary<string, string> openWith = 
    new Dictionary<string, string>();

// Add some elements to the dictionary. There are no 
// duplicate keys, but some of the values are duplicates.
openWith.Add("txt", "notepad.exe");
openWith.Add("bmp", "paint.exe");
openWith.Add("dib", "paint.exe");
openWith.Add("rtf", "wordpad.exe");


foreach(var item in openWith)
{
Console.WriteLine(item.Key +" can be open with " + item.value);
}

我还没有尝试过字典类...你认为这比结构体更好吗? - Dave Mackey
我进一步研究了字典类,不认为这是我在这个特定类中要寻找的。例如,我想要有多个名称/年龄对,而不是唯一的键。 - Dave Mackey
如果您只有两个值,它将是一个很好的选择。而且它支持各种查找和添加方法。 - Anuraj

1
你需要(可以)使用两个维度来索引你的数组,例如...
Dim array(,) As Object = { _
     {"John",26}, _
     {"Mark",4} _
}

For row As Integer = 0 to array.GetUpperBound(0)
   Dim name as String = CStr(array(row,0))
   Dim age as Integer = CInt(array(row,1))
   Response.Write("Hello " & name & "! You are " & age & " years old!")
Next

虽然最好将这种类型的信息存储在类或某种用户定义的类型中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接