Frage

Hier habe ich:

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)

Ich mag die Arraylist in eine statischen stark typisierten Array vom Typ MyStruct konvertieren. Wie kann ich das machen? Ich hatte kein Glück mit ToArray.

Ich bin mit .NET Framework 2.0.

War es hilfreich?

Lösung

Ich gehe davon aus, dass Sie da Arraylist verwenden, den Sie verwenden 1.1?

In diesem Fall vermute ich folgende funktionieren würde:

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

(Bearbeiten - Bills ToArray Nutzung ist bequemer - ich wusste nicht, dass man, aber dann habe ich sehr selten [wenn überhaupt] verwenden Arraylist)

Wenn jedoch MyStruct wirklich eine Struktur ist, dann sage ich, kann nicht stark genug, dass veränderbare Strukturen sind eine schlechte Idee - das heißt, wo Sie .Name und .content nach der Erstellung festlegen. Structs sollte fast immer unveränderlich sein. In der Realität sieht Ihre MyStruct wie es eine Klasse sein sollte. Auch - ich bin nicht „up“ auf VB, aber sind sie öffentliche Felder? Auch hier - nicht zu empfehlen - Eigenschaften vorzuziehen wären. Ich weiß ja nicht, VB, aber C # 3.0 hat einige sehr knappe Syntax für diese:

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

Wenn Sie 2.0 oder höher verwenden, sollten Sie List anstelle von Arraylist.

Andere Tipps

Sie haben das Ergebnis von ToArray werfen

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

ToArray ist der richtige Weg zu gehen. In C # wäre es:

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

Sind Sie stecken 1.1 verwenden, btw? Wenn Sie 2.0 verwenden, können Sie verschieben zur Liste statt?

Das ist für mich gearbeitet

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

Wenn Sie Visual Studio 2008 ausgeführt wird, können Sie ein List-Objekt verwenden.

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

Falls Sie sich mit 2.0 oder höher, möchten Sie vielleicht Ihre Arraylist wie folgt definiert werden:

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

Dies gibt Ihnen die gleiche Semantik wie ein Array (Lookup durch Index, starke Typisierung, IEnumerable Unterstützung, etc).

Es gibt nur zwei Gründe in .NET 2.0 und höher ein Array zu verwenden, anstatt einer allgemeinen Liste:

  1. Sie wissen mit absoluter Sicherheit die Anzahl der Elemente, die Sie haben und wissen, dass die Zählung wird sich nicht ändern. Dies ist überraschend selten.
  2. Sie müssen eine Funktion aufrufen, die ein Array erfordert. Es gibt noch eine ganze Reihe von diesem in der BCL lauern, aber Ihr eigener Code sollte für IEnumerable<T>, IList<T>, or ICollection<T> fragen, und nur selten ein Array.

Schließlich ist diese Art von nit-wählerisch, aber es gibt zwei stilistische Punkte, die ich in den Code ansprechen wollen Sie auf dem Laufenden. Beachten Sie zunächst, die abgekürzte Syntax ich verwendet, um die New List<MyStruct> zu erstellen. Es gibt kein Symbol = und Sie müssen nicht zweimal in den Typnamen eingeben. Das war Unterstützung zurück in 1.1 als auch, so gibt es keine Entschuldigung gibt. Zweitens, die Stil-Richtlinien für .Net rel="nofollow von Microsoft auf MSDN veröffentlicht ( finden Sie in dem allgemeinen Namenskonventionen Abschnitt) ausdrücklich empfohlen wird gegen ungarischen Warzen wie ' o‘oder 'a'. Es war schön für VB6 / VBScript, die lose eingegeben wurden, aber .NET stark typisiert, die Warzen zu machen, na ja, warzen hässlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top