Usar datos relacionados almacenados en una matriz bidimensional

Me cuesta mucho entender las matrices y leer sobre el tema, pero gran parte de la literatura no es fácil de entender cuando apenas has empezado a progtwigr y no hay nadie a quien puedas pedir explicaciones. Esta es mi matriz bidimensional:

'Declare 2-diensional array of Strings Dim cars(,) As String = New String(,) {{"BMW", "Coupe", "Reg:2015", "5 Door"}, {"Ford", "Focus", "Reg:2015", "3 Door"}, {"Land Rover", "Discovery", "Reg:2014", "5 Door"}, {"Vauxhall", "Astra", "Reg:2014", "3 Door"}, {"SEAT", "Ibiza", "Reg:2013", "5 Door"}} ' Get bounds of the array. Dim bound0 As Integer = cars.GetUpperBound(0) Dim bound1 As Integer = cars.GetUpperBound(1) ' Loop over all elements. For i As Integer = 0 To bound0 For x As Integer = 0 To bound1 ' Get element. Dim s1 As String = cars(i, x) Console.ForegroundColor = ConsoleColor.Green Console.Write(s1 & ", ") Next Console.WriteLine() Next Console.ReadKey() Console.WriteLine("Please enter the name of the record you wish to view") Dim s = Console.ReadLine() Dim value As String = Array.Find(cars, Function(x) (x.StartsWith(s))) Console.WriteLine(value) Console.ReadKey() 

Esta es la línea que está causando el problema

 Dim value As String = Array.Find(cars, Function(x) (x.StartsWith(s))) 

Visual Studio sugiere que el error se debe a que “Los tipos de datos de los parámetros de tipo no se pueden inferir a partir de estos argumentos. Especificar el (los) tipo (s) de datos explícitamente podría corregir este error”. No entiendo qué significa este error. Por favor, ¿alguien puede explicarlo como si estuviera hablando con un niño de 10 años o tal vez un sitio web que podría ayudarme a entender este problema? Gracias

La clave está en el hecho de que los datos están relacionados. En lugar de dividir su “automóvil” en piezas para almacenar en diferentes matrices, una clase le permitirá crear un objeto de Car y almacenar varios automóviles en una List escrita a máquina:

Introducción de cinco minutos a Classes y Lists

 Public Class Car Public Property Id As Int32 Public Property Make As String Public Property Model As String Public Property Year As Int32 '... etc End Class 

Ahora tiene un contenedor para guardar toda la información de un automóvil. Esto es como un modelo de cómo se verá un objeto de Car . Una Clase también puede contener métodos ( Sub o Function ) para gestionar los datos que almacenan, de modo que cualquier clase de Automóvil u Orden u Orden pueda ser gestionada por esa clase.

 Dim c As New Car ' create a new car object c.Make = "Mazda" c.Model = "Miata" c.Year = 2013 

O inicializa cuando lo declaras:

 Dim c As New Car With {.Make = "Mazda", .Model = "Miata" ...} 

Ahora, la versión de matrices de New Millennium, es una List . Es mucho más fácil trabajar con ellos porque se dimensionan a sí mismos:

 Dim Cars As New List(Of Car) 

La colección Cars solo puede almacenar objetos de automóviles, cada automóvil que almacena mantiene los datos juntos para cada uno. Hay muchos otros tipos de colecciones como Dictionary que eventualmente querrás familiarizarte. Agregue el Mazda a la lista:

 ' c is the car object created above Cars.Add(c) 

A diferencia de las matrices, no es necesario saber con cuántos coches trabajará porque se cambian de tamaño. Para hacer referencia a uno, Cars(n) se referirá a un objeto de automóvil:

 ' n is the index of a car in the list Dim str = Cars(n).Make & " is " & Cars(n).Color 

Iterar la lista, utilizando una variable temporal de Car :

 For Each c As Car In Cars ' c will be Cars(0), Cars(1) etc as we step thru Console.WriteLine("Index {0} is a BEAUTIFUL {1} {2}", Cars.IndexOf(c), c.Year, c.Model) ' eg ' "Index 4 is a BEAUTIFUL 2015 Camry" Next 

Encuentra uno o el primero de un tipo:

 Dim myCar = Cars.FirstOrDefault(Function (f) f.Make = "Mazda" AndAlso f.Year = 2013) 

Una List(Of T) se puede usar como DataSource para algunos controles:

 myDGV.DataSource = Cars 

El DataGridView creará una columna para cada propiedad en la clase Car y agregará una fila para cada objeto del automóvil en la lista, ¡simple!

O:

 myListBox.DataSource myList.DisplayMember = "Make" myList.ValueMember = "Id" 

El usuario verá Make en el ListBox (o lo que usted defina). SelectedValue será el Id del objeto del coche que seleccionaron y SelectedItem será el objeto completo del automóvil. No es necesario ir a buscar diferentes datos a través de diferentes matrices: siempre están juntas en un solo lugar.