【问题标题】:3D array loop and get the first dimension value3D数组循环并获取第一维值
【发布时间】:2016-12-01 17:44:14
【问题描述】:

这样的 3D 数组

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"}
    }

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

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

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

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

即使我使用

myCombobox.Items.Add(MyFonts(index0,,))

【问题讨论】:

  • MyFonts(index0,0,0) ?
  • 你有一个二维数组!试试:MyFonts(0,0) or MyFonts(0,1) or MyFonts(0,2) AND MyFonts(1,0) or MyFonts(1,1) or MyFonts(1,2) 然后看看。
  • @genespos 如果我在每个声明中有 3 个成员,为什么要二维? {"Arial", "arial.ttf", "arialbd.ttf"}
  • 有2个维度:0-13“垂直”和0-2“水平”。 Verdolino 为您添加了一个很好的解释。

标签: .net arrays vb.net


【解决方案1】:

一个类可以很容易地显示名称,但允许您从他们选择的任何内容中获取相关的 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)

【讨论】:

  • 您的解决方案工作正常。谢谢。但我需要用相同的数据填充 3 个组合框。没问题,3 个组合框有数据,但是现在当我更改一个组合框的选择时,其他 2 个也更改了选择。为什么会发生这种情况? 3 共享相同的数据源 cbox1.DataSource = myFonts cbox2.DataSource = myFonts cbox3.DataSource = myFonts 但我需要对每一个进行独立选择
  • 那个的情况下使用cbox1.DataSource = myFonts.ToArray()它会创建一个副本,这样它们就不会被同步锁定
  • 一如既往的完美。你不是像我一样“如果你只有一把锤子,那么一切看起来都像钉子”:)
  • 在我的机器上工作:D
  • @Plutonix 现在我正在调整类以在组合框中显示 TTF 的图像而不是名称,这是指向新帖子 stackoverflow.com/questions/41408165/… 的链接
【解决方案2】:

你有一个二维数组。数组的索引是这样的

当被索引时,返回的值是一个字符串。

考虑以下数组,它是 3D

您原来的信息实际上只有一维,因为每个元素对应一个字体。现在,如果您有相同字体的重复,即 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

【讨论】:

  • 非常感谢您的完整解释。我相信它对其他人有用
猜你喜欢
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2020-06-16
相关资源
最近更新 更多