Создать массив VB.NET с двумя столбцами значений? - PullRequest
4 голосов
/ 11 апреля 2011

Я знаю, как создать массив и проходить через него в обычном режиме, но что, если мне нужен многостолбцовый массив?например, обычно я могу сделать что-то вроде:

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

Если это невозможно с массивом, есть ли другой способЯ могу это сделать?

Ответы [ 5 ]

4 голосов
/ 11 апреля 2011

Создайте свой собственный тип данных:

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

Такой тип, который вы можете использовать в массиве, например:

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

Обратите внимание, что при циклическом прохождении этого массива через foreachэлементы, возвращаемые для каждой итерации, не могут быть изменены.Если это требование для вас, рассмотрите возможность использования 'class' вместо 'struct' в приведенном выше объявлении DataType.Это придет с некоторыми другими последствиями, хотя.Например, экземпляры класса DataType должны быть явно созданы с помощью ключевого слова «new».

2 голосов
/ 11 апреля 2011

Прочитав ваш комментарий, я думаю, что мой другой ответ, вероятно, то, что вы ищете.

Какой тип строки и какого типа NameOfArray?

Если вы хотите объединить несколько типов в ряд, то есть несколько вариантов.

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, я ограничусь этим контекстом.

1 голос
/ 11 апреля 2011

Прочитав ваш комментарий, я думаю, что понимаю вопрос.

Вы можете сделать

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

Если вы хотите создать IEnumberable анонимного типа кортежей Name Age; -p

1 голос
/ 11 апреля 2011

Вы должны (можете) индексировать ваш массив, используя два измерения, например ...

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

Хотя было бы лучше хранить такую ​​информацию в классе или определенном пользователем типе.

1 голос
/ 11 апреля 2011

Вы пробовали Словарь класса .Вы можете перебирать словарь, используя класс пары KeyValue.

// 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...