Question

Ici, j'ai:

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)

J'aimerais convertir ArrayList en un tableau statique fortement typé de type MyStruct. Comment puis je faire ça? Je n’ai pas eu de chance avec ToArray.

J'utilise .NET Framework 2.0.

Était-ce utile?

La solution

Je suppose que puisque vous utilisez ArrayList, vous utilisez 1.1?

Dans ce cas, je suspecte que les solutions suivantes fonctionnent:

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

(éditer - l'utilisation de Bill par ToArray est plus pratique - je ne connaissais pas celle-là, mais ensuite, j'utilise très rarement [si jamais] ArrayList)

Cependant, si MyStruct est vraiment une structure, je ne peux pas dire assez que les structures mutables sont une mauvaise idée - c’est-à-dire où vous pouvez définir .Name et .Content après la création. Les structures devraient presque toujours être immuables. En réalité, votre MyStruct ressemble à une classe. Aussi - je ne suis pas & "Up &"; sur VB, mais sont-ils des champs publics? Encore une fois - non recommandé - les propriétés seraient préférables. Je ne sais pas à propos de VB, mais C # 3.0 a une syntaxe très concise pour cela:

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

Si vous utilisez 2.0 ou une version ultérieure, considérez List < T > au lieu de ArrayList.

Autres conseils

Vous devez convertir le résultat de ToArray

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

ToArray est la bonne solution. En C # ce serait:

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

Êtes-vous bloqué en utilisant 1.1, en fait? Si vous utilisez la version 2.0, pouvez-vous passer à la liste & Lt; T & Gt; à la place?

Cela a fonctionné pour moi

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

Si vous exécutez Visual Studio 2008, vous pouvez utiliser un objet List.

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

Si vous utilisez la version 2.0 ou ultérieure, vous voudrez peut-être définir votre liste de noms comme suit:

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

Cela vous donnera la même sémantique qu'un tableau (recherche par index, typage fort, support IEnumerable, etc.).

Il n’ya que deux raisons dans .NET 2.0 et versions ultérieures d’utiliser un tableau au lieu d’une liste générique:

  1. Vous savez avec une certitude absolue le nombre d'articles que vous avez et savez que le nombre ne changera pas. C’est étonnamment rare.
  2. Vous devez appeler une fonction nécessitant un tableau. Il y en a encore un bon nombre dans la BCL, mais votre propre code devrait demander IEnumerable<T>, IList<T>, or ICollection<T>, et rarement un tableau.

Enfin, c’est un peu tatillon, mais je veux aborder deux points stylistiques dans le code que vous avez posté. Tout d’abord, notez la syntaxe abrégée que j’avais utilisée pour créer le New List<MyStruct>. Il n'y a pas de symbole = et vous ne devez pas entrer le nom du type deux fois. Il s’agissait également d’un soutien dans la version 1.1; il n’ya donc aucune excuse. Deuxièmement, les règles de style pour .Net publiées par Microsoft sur MSDN ( reportez-vous à la section conventions de dénomination générales ), qui recommande de ne pas utiliser les verrues hongroises telles que ' o 'ou' a '. C’était bien pour VB6 / VBScript, qui ont été typés de manière lâche, mais .Net est fortement typé, ce qui rend les verrues bien, vraiment horribles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top