2011-04-20 4 views
0

Я программирую слайд-шоу в Visual Basic и получаю исключение SystemInvalidCastException при попытке инициализировать массив через цикл For Each.System.InvalidCastException thrown

Вот что я пытаюсь сделать. У меня есть массив Images() и еще один массив ImageNames(). Теперь я храню все свои изображения на веб-сайте, скажем example.com/images, поэтому для простоты использования, я назвал все мои изображения в этой манере:

john.jpg 
jack.jpg 
jill.jpg

И мои ImageNames массив, который имеет список имен (оставляя «.jpg»), я надеялся, что с помощью этого метода я мог бы получить любое изображение с сайта, просто вставив его имя в ImageNames, если есть соответствующее изображение. Я ошибаюсь?

Итак, в моем Для каждого цикла, я использую простой цикл для инициализации моих изображений() массив, используя имена в ImageNames, как это:

Dim Images() as String 
    Dim ImageNames() as String = {"john", "jack", "jill"} 

    Dim i as String 

    For Each i In ImageNames 
     Images(i) = "http://example.com/images/" & ImageNames(i) & ".jpg" 
    Next 

Это дает мне очень странно ошибка, о которой я не знаю, как исправить. Я пробовал преобразовывать все возможные вещи, меняя типы данных, используя другую структуру контуров и т. Д. Я был в тупике от этого с прошлой ночи, и с тех пор я очень одержим этим. Любая помощь приветствуется. Благодарю.

ответ

0

Что делает ваш массив имен изображений? Если это не int, я не думаю, что вы сможете использовать его в качестве индексатора в вашем массиве Images().

ИЗМЕНИТЬ, извините, просто полностью замаскирован над той частью, где вы говорите об ImageNames(). Предполагая, что Images() - простой массив, вы не сможете ссылаться на элементы массива таким образом. Does ImageNames.Length == Images.Length?

Я очень ржавый на синтаксис VB, так что это, вероятно, не будет компилироваться как есть, но вместо ForEach, вы можете сделать это:

Dim ImageNames() as String = {"john", "jack", "jill"} 
Dim Images() as String= new String(ImageNames.Length){} 

For i as Integer = 1 to Images.Length 
    Images(i) = "http://example.com/images/" & ImageNames(i) & ".jpg" 
Next 
+0

Он содержит фактические имена всех изображений, я желаю, чтобы принести – Zack

+0

Хорошо, я здесь потерял. Почему именно это? Ошибка не дает мне никакой информации. Есть ли альтернатива тому, что я хочу сделать? – Zack

+0

Images() - пустой массив. Я пытаюсь инициализировать его на загрузке формы с циклом For Each. Есть ли другой подход к этому? – Zack

0

Если вы хотите индексировать изображения, почему не используйте словарь/HashTable/etc.

Dim images As Dictionary(of Long, Object) ' Change object to whatever type your image is 
images = New Dictionary(Of Long, Object) ' Be sure to initialise the collection 
images.Add(1, myImage1) 'Add an image 
images.Add(2, myImage2) 'Add another image 

Dim ret As Object 'If you now want to fetch an image from the dictionary... 
If images.ContainsKey(1) Then ret = images(1) 

EDIT:

Проблема с текущим кодом является то, что вы полагаетесь на изображение() и ImageNames() массивы, пребывающих в синхронизации друг с другом. Скорее всего, это плохая идея, когда у вас есть много вариантов в вашем распоряжении, чтобы эти части информации были связаны вместе (в отличие от Array1 (i), должны относиться к Array2 (i)).

Перечитав свой пост, и приклеить к моим пушкам на словарных выше идеи, увидеть следующее ...

Public Sub DictionaryAnswer() 

    ' This is your current ImageNames array in list form 
    Dim imageNames As List(Of String) = New List(Of String) From {"Jack", "Jill", "John"} 

    ' To show both implementations, here it is in array form again 
    Dim imageNamesArray() As String = imageNames.ToArray 

    ' IWe create a format for your base address - {0} will be replaced by the image name 
    Dim baseAddressFormat As String = "http://example.com/images/{0}.jpg" 

    ' This is how you would add a list of names to a dictionary 
    Dim imagesFromList As Dictionary(Of String, String) = New Dictionary(Of String, String) 
    imageNames.ForEach(Sub(n) imagesFromList.Add(n, String.Format(baseAddressFormat, n))) 

    ' And similarly for your array 
    Dim imagesFromArray As Dictionary(Of String, String) = New Dictionary(Of String, String) 
    imageNamesArray.ToList.ForEach(Sub(n) imagesFromArray.Add(n, String.Format(baseAddressFormat, n))) 

    ' You can now get the url's for your images by name by doing something like: 
    Dim jillsImage As String 
    If imagesFromList.ContainsKey("Jill") Then jillsImage = imagesFromList("Jill") 
    Dim jacksImage As String 
    If imagesFromArray.ContainsKey("Jack") Then jacksImage = imagesFromArray("Jack") 

End Sub 

Надеется, что проясняет, что я имел в виду ...

EDIT # 15: Однажды я выработаю, как получить прекрасное форматирование кода, чтобы на самом деле работать ...

+0

Это кажется столь же неэффективным, как перечисление ссылок на каждое отдельное изображение в массиве Image(). Спасибо за попытку помочь, но я бы предпочел использовать цикл для этого. – Zack

0

У вашего кода есть две проблемы. Первым здесь:

ImageNames (я)

В этом коде "я" является не индекс. Это фактическая строка в массиве.Вместо этого, вы хотите:

"http://example.com/images/" & i & ".jpg" 

Вторая проблема здесь:

Dim Images() As String

Это гораздо глубже, чем просто объявить массив без каких-либо строк в нем : это массив без мест для строк — массив нулевого размера. Есть несколько способов исправить это. В этом случае похоже, что вы привыкли работать с коллекциями, а не с массивами (возможно, вы использовали другой язык, такой как javascript или php, который неправильно помещает коллекции в виде массивов). Имея это в виду, я бы изменить код, чтобы использовать коллекцию, например:

Dim Images as New List(Of String)() 
Dim ImageNames() as String = {"john", "jack", "jill"} 

For Each i As String In ImageNames 
    Images.Add("http://example.com/images/" & i & ".jpg") 
Next 

Но это просто переписана из существующего кода. Если бы я начать заново, я бы написал так: (. Оставляя расширение)

Dim ImageNames() as String = {"john", "jack", "jill"} 
ImageNames.Select(Function(s) String.Format("http://example.com/images/{0}.jpg", s)) 
Смежные вопросы