【问题标题】:Create a VB.NET Array with two columns of values?创建一个包含两列值的 VB.NET 数组?
【发布时间】:2011-04-11 12:45:07
【问题描述】:

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

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 到底是什么类型的对象?某种强类型数组?
  • 嗯,这就是我需要弄清楚的。我知道如何设置一个包含一列的数组 - 但它可以有两列吗?例如我可以轻松地将 Dim my_array 作为数组(“hello”、“goodbye”、“adios”)进行操作,但是我将如何使用两列进行操作,例如将 my_array 调暗为数组(“hello”“1”、“goodbye”“4”、“adios”“0”)?

标签: asp.net vb.net arrays variables


【解决方案1】:

创建您的自定义数据类型:

 public struct DataType 
    public string Name; 
    public int Age; 
 }

这样的类型你可以在这样的数组中使用:

 DataType[] myData = new DataType[100]; 
 myData[0].Name = "myName"; 
 myData[0].Age = 100; 

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

【讨论】:

  • “new”关键字没什么大不了,类可能是更好的选择。
  • 在我看来像一个 VB 问题
  • 我明白了,所以只读与结构有关,读写与创建新类有关?
  • Structure 是值类型,Class 是引用类型。如果你想指定额外的东西,这些类可以和一个类一起使用。
  • @davemackey 你可以用结构和类来做。它只是 foreach 循环,由于结构的性质,它使您只能访问真实结构元素的副本。如果您必须依赖 foreach 循环,那么类会更适合。否则,您也可以使用结构数组。但是这些元素只能通过直接索引来写入,就像我上面的例子一样。
【解决方案2】:

阅读您的评论后,我想我明白了这个问题。

你可以的

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

如果你想创建一个 IEnumberable 匿名类型的 Name Age tuples ;-p

【讨论】:

    【解决方案3】:

    阅读您的评论后,我认为我的其他答案可能就是您正在寻找的。​​p>

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

    如果你想将 row 变成一个有多个成员的复合类型,那么有几个选项。

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

    例如。如果您更喜欢引用类型,请用 Class 替换 Structure

    或者使用匿名类型,

    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 中提出了这个问题,我将自己限制在这种情况下。

    【讨论】:

      【解决方案4】:

      你试过Dictionary Class。您可以使用 KeyValue 对类循环遍历 Dictionary。

      // 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);
      }
      

      【讨论】:

      • 我没有尝试过 Dictionary 类...你认为这比结构更好吗?
      • 我更多地研究了 Dictionary 类,但我认为这不是我在这个特定类中寻找的内容。例如,我想要多对姓名/年龄,而不是唯一键。
      • 如果您只有两个值,这将是一个不错的选择。并且它支持各种查找和添加方法。
      【解决方案5】:

      您需要(可以)使用二维索引到您的数组中,即...

      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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 2018-08-31
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        相关资源
        最近更新 更多