ArrayListを構造体の配列に変換する方法は?
質問
ここにあります:
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)
ArrayListをMyStruct型の厳密に型指定された静的配列に変換します。どうやってやるの? ToArrayには運がなかった。
.NET Framework 2.0を使用しています。
解決
ArrayListを使用しているため、1.1を使用していると思いますか?
その場合、次のように動作すると思います:
ArrayList list = new ArrayList();
MyStruct[] array = new MyStruct[list.Count];
list.CopyTo(array);
(編集-BillのToArrayの使用はより便利です-そのことは知りませんでしたが、ArrayListを使用することはほとんどありません)
ただし、MyStructが実際に構造体である場合、可変構造体が悪いアイデアであると十分に言えません。つまり、作成後に.Nameと.Contentを設定できます。構造体はほとんど常に不変でなければなりません。実際には、MyStructはクラスのように見えます。また、私は<!> quot; up <!> quotではありません。 VBではありますが、パブリックフィールドですか?繰り返しますが、推奨されません-プロパティが望ましいでしょう。 VBについては知りませんが、C#3.0にはこれに関する非常に簡潔な構文があります。
public class SomeType
{
public string Name {get;set;}
public string Content {get;set;}
}
2.0以上を使用している場合は、List <!> lt; T <!> gt;を検討してください。 ArrayListの代わりに。
他のヒント
ToArray
MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));
ToArrayは正しい方法です。 C#の場合:
MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));
1.1を使用し続けていますか? 2.0を使用している場合、List <!> lt; T <!> gt;に移行できますか?代わりに?
これは私のために働いた
Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))
Visual Studio 2008を実行している場合は、Listオブジェクトを使用できます。
Dim alList As New List(Of MyStruct)
alList.Add(oStruct)
2.0以降を使用している場合は、次のように配列リストを定義できます。
Dim alList as New List(Of MyStruct)()
alList.Add(oStruct)
これにより、配列と同じセマンティクスが得られます(インデックスによる検索、厳密な型指定、IEnumerableサポートなど)。
.Net 2.0以降では、汎用リストの代わりに配列を使用する理由は2つだけです。
- あなたは持っているアイテムの数を絶対的に確実に知っており、カウントが変わらないことを知っています。これは驚くほどまれです。
- 配列を必要とする関数を呼び出す必要があります。 BCLにはまだかなりの数のこれらが潜んでいますが、独自のコードは
IEnumerable<T>, IList<T>, or ICollection<T>
を要求する必要があり、まれに配列を指定する必要があります。
最後に、これはちょっとつまらないものですが、投稿したコードで対処したい2つのスタイル上のポイントがあります。最初に、New List<MyStruct>
の作成に使用した短縮構文に注意してください。 =記号はなく、タイプ名を2回入力する必要はありません。 1.1でもサポートされていたため、言い訳はできません。次に、MSDNでMicrosoftが公開している .Netのスタイルガイドライン 「一般的な命名規則」セクションを参照してください。 o 'または' a '。緩やかに入力されたVB6 / VBScriptには便利でしたが、.Netは厳密に入力されているため、いぼはいぼいものになります。