Comment stocker int [] tableau dans les paramètres de l'application
Je suis la création d'une simple application windows Forms à l'aide de C# express 2008. Je suis expérimenté, développeur C++, mais je suis à peu près nouvelle marque de C# et de .NET.
Je suis en train de ranger certains de mes paramètres d'application simple utilisant les paramètres du concepteur et le code comme ceci:
//Store setting
Properties.Settings.Default.TargetLocation = txtLocation.Text;
...
//Restore setting
txtLocation.Text = Properties.Settings.Default.TargetLocation;
Maintenant, je voudrais stocker soit un tableau d'entiers ( int[]
), ou éventuellement d'une Liste d'entiers ( List< int >
), comme un paramètre. Cependant, je ne peux pas comprendre comment le faire. J'ai cherché de la documentation, stackoverflow, et google, et je ne peux pas trouver une bonne explication de comment faire cela.
Mon intuition basée sur les rares exemples que j'ai trouvé c'est que je dois créer une classe sérialisable qui enveloppe mon tableau ou d'une Liste, et puis je vais être en mesure d'utiliser ce Type dans les paramètres de concepteur. Cependant, je ne suis pas sûr exactement comment le faire.
source d'informationauteur sidewinderguy
Vous devez vous connecter pour publier un commentaire.
Il y a aussi une autre solution nécessite un peu de la modification manuelle du fichier de paramètres, mais par la suite, fonctionne très bien dans VS l'environnement et dans le code. Et ne nécessite pas de fonctions supplémentaires ou des wrappers.
Le truc, c'est que VS permet de sérialiser
int[]
type par défaut dans le fichier de settings - il n'a tout simplement pas vous permettre de sélectionner par défaut.Donc, créer un cadre avec le nom de votre choix (par exemple, SomeTestSetting) et de tout type (par ex.
string
par défaut).Enregistrer les modifications.
Maintenant, allez dans votre dossier de projet et d'ouvrir les "Propriétés\Paramètres."paramètres du fichier avec un éditeur de texte (bloc-notes, par exemple), Ou vous pouvez l'ouvrir en VS par un clic droit dans l'Explorateur de solutions sur" -> Propriétés -> Paramètres.les paramètres", sélectionnez "Ouvrir Avec..." et puis choisissez "XML Editor" ou "Code Source (Texte) de l'Éditeur".
Dans le ouvert xml des paramètres de trouver votre milieu (il ressemble à ceci):
Changer le "Type" param de
System.String
àSystem.Int32[]
. Maintenant, cette section devrait ressembler à ceci:Maintenant enregistrer les modifications et de ré-ouvrir les paramètres de projet - voilà! - Nous avons le paramètre SomeTestSetting avec le type
System.Int32[]
qui peut être consulté et modifié par VS les Paramètres de Designer (des valeurs), ainsi que dans le code.à stocker:
string value = String.Join(",", intArray.Select(i => i.ToString()).ToArray());
à re-créer:
int[] arr = value.Split(',').Select(s => Int32.Parse(s)).ToArray();
Edit: Abel suggestion!
Il existe une autre façon de parvenir à ce résultat qui est beaucoup plus propre à l'usage, mais nécessite plus de code. Ma mise en œuvre d'un type personnalisé et le type de convertisseur le code suivant est possible:
Pour réaliser cela, vous avez besoin d'un type avec un type de convertisseur qui permet la conversion vers et à partir de chaînes de caractères. Vous faites cela en décorant le type avec la TypeConverterAttribute:
La mise en œuvre de ce type de convertisseur comme une dérivation de TypeConverter:
Par la fourniture de certaines méthodes pratiques sur le MyNumberArray classe on peut alors attribuer en toute sécurité vers et à partir de la Liste, l'ensemble de la classe ressemblerait à quelque chose comme:
Enfin, de l'utiliser dans les paramètres, vous ajoutez les classes ci-dessus à une assemblée et de les compiler. Dans vos Paramètres.les paramètres de l'éditeur vous suffit de cliquer sur le bouton "Parcourir" et sélectionnez le MyNumberArray classe et vous partez.
Encore une fois c'est beaucoup plus de code; toutefois, il peut être appliqué à beaucoup plus compliqué types de données qu'un simple tableau.
Spécifier le paramètre comme un Système.Les Collections.Liste de tableaux et ensuite:
Une solution simple consiste à définir la valeur par défaut d'un paramètre à null dans la propriété, mais dans le constructeur de vérifier si la propriété est null et si oui, puis le mettre à sa réelle valeur par défaut. Donc si vous voulez un tableau d'entiers:
Il se sent en quelque sorte hacky, mais son propre et fonctionne comme souhaité depuis les propriétés sont initialisées à leur dernier (ou par défaut) les paramètres avant que le constructeur est appelé.
Utilisé
System.Object
.Exemple:
Extrait:
Je pense que vous avez raison à propos de la sérialisation de vos paramètres. Voir ma réponse à cette question par un exemple:
Techniques pour le partage d'une config entre deux applications?
Vous avez une propriété qui est un tableau, comme ceci:
Faire quelques fonctions qui permet de convertir un int tableau dans une chaîne de caractères, mais entre chaque mettre un caractère comme "" (espace).
Donc, si le tableau est { 1,34,546,56 } la chaîne "1 34 645 56"