Pregunta

Aquí tengo:

Public Structure MyStruct
   Public Name as String
   Public Content as String
End Structure

Dim oStruct as MyStruct = New MyStruct()
oStruct.Name = ...
oStruct.Content = ...

Dim alList as ArrayList = new ArrayList()
alList.Add(oStruct)

Me gustaría convertir ArrayList en una matriz estática fuertemente tipada de tipo MyStruct. ¿Cómo puedo hacer eso? No tuve suerte con ToArray.

Estoy usando .NET Framework 2.0.

¿Fue útil?

Solución

Supongo que dado que está utilizando ArrayList, ¿está utilizando 1.1?

En cuyo caso, sospecho que lo siguiente funcionaría:

ArrayList list = new ArrayList();
MyStruct[] array = new MyStruct[list.Count];
list.CopyTo(array); 

(editar - El uso de ToArray de Bill es más conveniente - No sabía sobre eso, pero muy raramente [si alguna vez] uso ArrayList)

Sin embargo, si MyStruct realmente es una estructura, entonces no puedo decir con suficiente fuerza que las estructuras mutables son una mala idea, es decir, dónde puede establecer .Name y .Content después de la creación. Las estructuras casi siempre deben ser inmutables. En realidad, su MyStruct parece que debería ser una clase. Además, no estoy & Quot; up & Quot; en VB, pero ¿son campos públicos? Nuevamente, no recomendado, las propiedades serían preferibles. No sé acerca de VB, pero C # 3.0 tiene una sintaxis muy breve para esto:

public class SomeType
{
    public string Name {get;set;}
    public string Content {get;set;}
}

Si está utilizando 2.0 o superior, considere List < T > en lugar de ArrayList.

Otros consejos

Tienes que emitir el resultado de ToArray

MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));

ToArray es el camino correcto. En C # sería:

MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));

¿Estás atrapado usando 1.1, por cierto? Si está utilizando 2.0, ¿puede cambiar a List & Lt; T & Gt; en su lugar?

Esto funcionó para mí

Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))

Si está ejecutando Visual Studio 2008, puede usar un objeto List.

  Dim alList As New List(Of MyStruct)
  alList.Add(oStruct)

En caso de que esté utilizando 2.0 o posterior, es posible que desee definir su lista de arrays de esta manera:

Dim alList as New List(Of MyStruct)()
alList.Add(oStruct)

Esto le dará la misma semántica que una matriz (búsqueda por índice, tipeo fuerte, soporte IEnumerable, etc.).

Solo hay dos razones en .Net 2.0 y posteriores para usar una matriz en lugar de una lista genérica:

  1. Usted sabe con absoluta certeza la cantidad de artículos que tiene, y sabe que el conteo no cambiará. Esto es sorprendentemente raro.
  2. Debe llamar a una función que requiere una matriz. Todavía hay un buen número de estos al acecho en el BCL, pero su propio código debería estar pidiendo IEnumerable<T>, IList<T>, or ICollection<T>, y rara vez una matriz.

Finalmente, esto es un poco quisquilloso, pero hay dos puntos estilísticos que quiero abordar en el código que publicaste. Primero, tenga en cuenta la sintaxis abreviada que utilicé para crear el New List<MyStruct>. No hay símbolo = y no tiene que ingresar el nombre del tipo dos veces. Eso también fue soporte en 1.1, así que no hay excusa allí. En segundo lugar, las directrices de estilo para .Net publicadas por Microsoft en MSDN ( consulte la sección convenciones de nombres generales ) específicamente recomendado contra verrugas húngaras como ' o 'o' a '. Fue bueno para VB6 / VBScript, que se tipeó libremente, pero .Net está fuertemente tipado, lo que hace que las verrugas sean muy feas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top