Grajek Ответов: 2

Как вернуть массив из функции...


Я создал функцию, которая возвращает 2-мерный массив...
Public Function Day1ClassBlocks(intSchedID As Integer) As String(,)
...

For Each row In dsResultsTable.Rows
            txtClassBlocks(i, 0) = row("day").ToString()
            txtClassBlocks(i, 1) = row("block").ToString()
            i = i + 1
        Next

        Return txtClassBlocks

Это прекрасно работает. Затем на странице события загрузки у меня есть этот код, чтобы зациклить его и работать с ним.
<pre>Dim numclasses(,) As String
        Dim intNumOfBlocks As Integer
        Dim i, x As Integer


        numclasses = Day1ClassBlocks(1572)
        
        i = 0


        For each row in numclasses
            Response.Write(">" & numclasses(i, 0).ToString() & " - " & numclasses(i, 1).ToString() & "<br />")
        Next


Но когда я пытаюсь выполнить цикл через строковый массив [numclasses], он возвращает 100 строк, когда должен возвращать только 10. Я вижу, что длина равна 100, но только 10 строк имеют значения. Я очень очень новичок в этом деле ASP.NET так что я уверен, что мне не хватает чего-то простого, но я искал и играл с этим в течение 2 дней. Кроме того, это всего лишь практический код.

Спасибо
- Грайек

Что я уже пробовал:

Я написал еще одну функцию, которая возвращает количество строк и используется
For 1 = 0 to intRowCount - 1 Next
что работает, но я предпочитаю иметь только одну функцию для этой задачи.

2 Ответов

Рейтинг:
1

Dave Kreskowiak

Это не имеет никакого отношения к ASP.NET но все это связано с тем, как вы относитесь к возвращаемому массиву.

Вы перечисляете то, что считаете набором строк в двумерном массиве. Это не так работает.

Если вы используете ForEach над массивом, подобным этому, то такой вещи, как строка, не существует. Каждый элемент будет возвращен. Итак, если Ваш массив состоит из 10 "строк" на 10 "столбцов" (от 0 до 9), вы получите обратно 100 "строк".

Чтобы рассматривать массив как 2-мерный массив, вы должны использовать индексаторы в каждом измерении массива:

For i = 0 to numClasses.GetUpperBound(0)
    For j = 0 to numClasses.GetUpperBound(1)
        ...
    Next
Next


Grajek

Хорошо, большое спасибо.: -) [. GetUpperBound(0)] работает отлично. Я знал, что это что-то простое. Однако мне интересно, как GetUpperBound (0) отфильтровывает элементы "Nothing" "Nothing", которые я вижу в окне моих часов, а For Each-нет.

Еще раз спасибо за ответ.

Грайек

Dave Kreskowiak

Фильтрация? Нет никакой фильтрации вообще.

GetUpperBound возвращает только число, самый большой индекс для измерения массива. Вот и все, больше ничего.

Grajek

Как [для каждого] отличается от [для i = 0 для numClasses.GetUpperBound]? Когда я использую [For Each], он возвращает 100 элементов независимо от значений или без значений, но [For i=0 to numClasses.GetUpperBound( 0)] возвращает только элементы со значениями, отличными от "Nothing."

Dave Kreskowiak

Индексаторы рассматривают массив как массив и ограничены границами массива в каждом измерении.

ForEach использует перечислитель, который он получает из массива.Метод GetEnumerator для массива. Он не видит его как массив. Для перечислителя массив - это просто коллекция, без измерений.

Grajek

Ладно, в этом есть смысл. Спасибо!

Как я уже сказал, очень и очень новичок в .NET. Это помогает больше, чем вы думаете!

Спасибо снова.

Рейтинг:
1

Patrice T

Используя отладчик, вы можете обнаружить, что проблема не там, где вы думаете.
Я думаю, что проблема в коде, который вы не показали.

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Он позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


Grajek

Спасибо за ответ, я очень, очень ценю это. Я действительно использовал отладчик,который привел меня к правильному вопросу. [Watch] перечислил содержимое массива следующим образом:
{0}{0}"1", "1"
{0}{1}"1", "3"
{0}{2} "Ничего", " Ничего"
{0}{3} "Ничего", " Ничего"
{0}{4}...

{1}{0}"1", "1"
{1}{1}"1", "3"
{1}{2} "Ничего", " Ничего"
{1}{3} "Ничего", " Ничего"
...

спасибо снова
Грайек