2008-10-09 16 views
5

Aquí me tienen:¿Cómo convertir ArrayList a una matriz de estructura?

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 el ArrayList a una matriz estática establecimiento inflexible de tipo MyStruct. ¿Cómo puedo hacer eso? No tuve suerte con ToArray.

Estoy usando .NET Framework 2.0.

+0

No puedo hacerlo, pero * por favor * tenga en cuenta cuánto debe ser MyStruct una clase, no una estructura. Esto tiende a causar * mucha * confusión, especialmente para tipos mutables (como el suyo). –

+0

MyStruct podría haber sido una clase, pero como no tiene ningún método, supongo que es más rápido usar una estructura. – Vincent

+1

No; esa no es la diferencia entre las estructuras y las clases. Las estructuras pueden tener métodos en .NET; la diferencia es de tipo de referencia frente a tipo de valor. –

Respuesta

1

supongo que dado que está utilizando ArrayList, que está utilizando 1.1?

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

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

(edición - uso ToArray de Bill es más conveniente - Yo no sabía nada de eso, pero entonces, en muy raras ocasiones [si alguna vez ] use ArrayList)

Sin embargo, si MyStruct realmente es una estructura, entonces no puedo decir con la suficiente fuerza que las estructuras mutables sean una mala idea, es decir, donde 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 "arriba" en VB, pero ¿son campos públicos? De nuevo, no recomendado, las propiedades serían preferibles. No sé acerca de VB, pero C# 3.0 tiene una sintaxis muy concisa para esto:

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

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

+0

No sabía que ArrayList era 1.1. El problema es que necesito codificarlo en VB.NET, por lo que no estoy seguro de poder utilizar la lista . – Vincent

+0

Estoy bastante seguro de que VB.NET puede usar genéricos; MSDN tiene un ejemplo de VB aquí: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx –

+0

Lo tengo con List (Of MyStruct). – Vincent

4

Usted tiene que emitir el resultado de ToArray

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

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

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

¿Está atascado con 1.1, por cierto? Si está utilizando 2.0, ¿puede cambiar a la Lista < T> en su lugar?

0

Esto funcionó para mí

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

Si está ejecutando Visual Studio 2008 se puede utilizar un objeto de lista.

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

También puede hacer esto en .Net 2.0 (vs2005). –

0

En caso de que esté utilizando 2.0 o posterior, es posible que desee definir su ArrayList como esto:

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

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

Sólo hay dos razones en .Net 2.0 y posterior para utilizar una matriz en lugar de una lista genérica:

  1. Usted sabe con absoluta certeza el número de elementos que tiene, y saben que el recuento ganó' t cambio. 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 solo raramente una matriz.

Finalmente, esto es un poco quisquilloso, pero hay dos puntos estilísticos que quiero abordar en el código que publicaste. En primer lugar, tenga en cuenta la sintaxis abreviada que utilicé para crear el New List<MyStruct>. No hay símbolo = y no es necesario ingresar el nombre del tipo dos veces. Eso también fue soporte en 1.1, así que no hay excusa allí. En segundo lugar, el style guidelines for .Net publicado por Microsoft en MSDN (consulte la sección general naming conventions) recomienda específicamente contra las verrugas húngaras como 'o' o 'a'. Fue agradable para VB6/VBScript, que fueron escritos a máquina, pero .Net está fuertemente tipado, por lo que las verrugas son feas.

Cuestiones relacionadas