3D数组循环并获取第一个维度值

时间:2016-12-01 17:44:14

标签: .net arrays vb.net

像这样的3D数组

    .filter "scFilter", () ->
        (collection, search) ->
            if search
                regexp = createAccentRegexp(search)
                doesMatch = (txt) ->
                    (''+txt).match(regexp)
                collection.filter (el) ->
                    if typeof el == 'object'
                        return true for att, value of el when (typeof value == 'string') && doesMatch(value)
                    doesMatch(el)
                    false
                 else
                     collection

第一个维度是字体名称,第二个维度是普通样式的True Type字体文件,第三个维度是粗体样式的True Type字体文件

我想用字体名称(第一维)填充组合框

Dim MyFonts = 
    {
        {"Arial", "arial.ttf", "arialbd.ttf"}, 
        {"Calibri", "calibri.ttf", "calibribd.ttf"},
        {"Candara", "Candara.ttf", "Candarab.ttf"}, 
        {"Comic Sans MS", "comic.ttf", "comicbd.ttf"}, 
        {"Consolas", "consola.ttf", "consolab.ttf"},
        {"Constantia", "constant.ttf", "constantb.ttf"},
        {"Courier New","cour.ttf", "courbd.ttf"},
        {"Georgia", "georgia.ttf", "georgiab.ttf"},
        {"Impact", "impact.ttf", "impact.ttf"},
        {"Palatino Linotype", "pala.ttf", "palab,ttf"},
        {"Tahoma", "tahoma.ttf", "tahomabd.ttf"},
        {"Times New Roman", "times.ttf", "timesbd.ttf"},
        {"Trebuchet MS", "trebuc.ttf", "trebucbd.ttf"},
        {"Verdana", "verdana.ttf", "verdanab.ttf"}
    }

我收到错误: "索引数小于索引数组的维数"

即使我使用

For index0 = 0 To MyFonts.GetUpperBound(0)
    'Add all the Fonts names to a Combobox
    myCombobox.Items.Add(MyFonts(index0))
Next

2 个答案:

答案 0 :(得分:5)

一个类可以很容易地显示名称,但允许您从他们选择的任何内容中获取相关的TTF或粗体文件:

Public Class FontItem
    Public Property Name As String
    Public Property TTFile As String
    Public Property TTBoldFile As String
    Public Sub New(n As String, f As String, b As String)
        Name = n
        TTFile = f
        TTBoldFile = b
    End Sub

    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class

这个名称与2个文件“绑定”,使得获取相关文件变得非常容易。接下来,根据您拥有的数据创建这些内容的列表:

Dim myFonts As New List(Of FontItem)

Dim data = {{"Arial", "arial.ttf", "arialbd.ttf"},
             ...your long list
           }

For n As Int32 = 0 To data.GetUpperBound(0)
    myFonts.Add(New FontItem(data(n, 0), data(n, 1), data(n, (2))))
Next

cbox1.DataSource = myFonts

我会以不同的方式构建数据,但这可以让您使用所拥有的数据。无需将数据复制到控件中,SelectedItem将为FontItem(在Object内)。在SelectedValueChanged事件中:

Dim item = DirectCast(cbox1.SelectedValue, FontItem)
Console.WriteLine("For {0}, TTF = {1}, bold = {2}", item.Name,
                        item.TTFile,
                        item.TTBoldFile)

enter image description here enter image description here

答案 1 :(得分:4)

你有一个2D数组。该数组的索引类似于

enter image description here

并且在索引时,返回的值是一个字符串。

考虑以下数组,即3D

enter image description here

您的原始信息实际上只有1D,因为每个元素对应一种字体。现在,如果您有相同字体的副本,即Arial两次,但使用不同的ttf文件,那么您有两个逻辑维度的信息。

您可以使用以下代码测试这些不同的尺寸。索引器在最后

Sub Main()
    Dim MyFonts2D =
    {
        {"Arial", "arial.ttf", "arialbd.ttf"},
        {"Calibri", "calibri.ttf", "calibribd.ttf"},
        {"Candara", "Candara.ttf", "Candarab.ttf"},
        {"Comic Sans MS", "comic.ttf", "comicbd.ttf"},
        {"Consolas", "consola.ttf", "consolab.ttf"},
        {"Constantia", "constant.ttf", "constantb.ttf"},
        {"Courier New", "cour.ttf", "courbd.ttf"},
        {"Georgia", "georgia.ttf", "georgiab.ttf"},
        {"Impact", "impact.ttf", "impact.ttf"},
        {"Palatino Linotype", "pala.ttf", "palab,ttf"},
        {"Tahoma", "tahoma.ttf", "tahomabd.ttf"},
        {"Times New Roman", "times.ttf", "timesbd.ttf"},
        {"Trebuchet MS", "trebuc.ttf", "trebucbd.ttf"},
        {"Verdana", "verdana.ttf", "verdanab.ttf"}
    }

    Dim MyFonts3D =
    {
        {
            {"Arial", "arial1.ttf", "arialbd1.ttf"},
            {"Arial", "arial2.ttf", "arialbd2.ttf"},
            {"Arial", "arial3.ttf", "arialbd3.ttf"}
        },
        {
            {"Calibri", "Calibri1.ttf", "Calibribd1.ttf"},
            {"Calibri", "Calibri2.ttf", "Calibribd2.ttf"},
            {"Calibri", "Calibri3.ttf", "Calibribd3.ttf"}
        },
        {
            {"Candara", "Candara1.ttf", "Candarabd1.ttf"},
            {"Candara", "Candara2.ttf", "Candarabd2.ttf"},
            {"Candara", "Candara3.ttf", "Candarabd3.ttf"}
        }
    }

    Console.WriteLine("Enter first index")
    Dim i = Integer.Parse(Console.ReadLine())
    Console.WriteLine("Enter second index")
    Dim j = Integer.Parse(Console.ReadLine())
    Console.WriteLine("Enter third index")
    Dim k = Integer.Parse(Console.ReadLine())
    Dim a = MyFonts2D(i, j)
    Console.WriteLine(a)
    Dim b = MyFonts3D(i, j, k)
    Console.WriteLine(b)
    Console.ReadLine()
End Sub