How to store int[] array in application Settings How to store int[] array in application Settings arrays arrays

How to store int[] array in application Settings


There is also another solution - requires a bit of manual editing of the settings file, but afterwards works fine in VS environment and in the code. And requires no additional functions or wrappers.

The thing is, that VS allows to serialize int[] type by default in the settings file - it just doesn't allow you to select it by default.So, create a setting with desired name (e.g. SomeTestSetting) and make it of any type (e.g. string by default).Save the changes.

Now go to your project folder and open the "Properties\Settings.settings" file with text editor (Notepad, for example) Or you can open it in VS by right-clicking in Solution Explorer on " -> Properties -> Settings.settings", select "Open With..." and then choose either "XML Editor" or "Source Code (Text) Editor".In the opened xml settings find your setting (it will look like this):

<Setting Name="SomeTestSetting" Type="System.String" Scope="User">  <Value Profile="(Default)" /></Setting>

Change the "Type" param from System.String to System.Int32[]. Now this section will look like this:

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User">  <Value Profile="(Default)" /></Setting>

Now save changes and re-open project settings - voilĂ ! - We have the setting SomeTestSetting with type System.Int32[] which can be accessed and edited through VS Settings Designer (values too), as well as in the code.


to store:

string value = String.Join(",", intArray.Select(i => i.ToString()).ToArray());

to re-create:

int[] arr = value.Split(',').Select(s => Int32.Parse(s)).ToArray();

Edit: Abel suggestion!


There is one other way to achieve this result that is a lot cleaner in usage but requires more code. My implementing a custom type and type converter the following code is possible:

List<int> array = Settings.Default.Testing;array.Add(new Random().Next(10000));Settings.Default.Testing = array;Settings.Default.Save();

To achieve this you need a type with a type converter that allows conversion to and from strings. You do this by decorating the type with the TypeConverterAttribute:

[TypeConverter(typeof(MyNumberArrayConverter))]public class MyNumberArray ...

Then implementing this type converter as a derivation of TypeConverter:

class MyNumberArrayConverter : TypeConverter{    public override bool CanConvertTo(ITypeDescriptorContext ctx, Type type)    { return (type == typeof(string)); }    public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type)    { return (type == typeof(string)); }    public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type)    {        MyNumberArray arr = value as MyNumberArray;        StringBuilder sb = new StringBuilder();        foreach (int i in arr)            sb.Append(i).Append(',');        return sb.ToString(0, Math.Max(0, sb.Length - 1));    }    public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)    {        List<int> arr = new List<int>();        if (data != null)        {            foreach (string txt in data.ToString().Split(','))                arr.Add(int.Parse(txt));        }        return new MyNumberArray(arr);    }}

By providing some convenience methods on the MyNumberArray class we can then safely assign to and from List, the complete class would look something like:

[TypeConverter(typeof(MyNumberArrayConverter))]public class MyNumberArray : IEnumerable<int>{    List<int> _values;    public MyNumberArray() { _values = new List<int>(); }    public MyNumberArray(IEnumerable<int> values) { _values = new List<int>(values); }    public static implicit operator List<int>(MyNumberArray arr)    { return new List<int>(arr._values); }    public static implicit operator MyNumberArray(List<int> values)    { return new MyNumberArray(values); }    public IEnumerator<int> GetEnumerator()    { return _values.GetEnumerator(); }    IEnumerator IEnumerable.GetEnumerator()    { return ((IEnumerable)_values).GetEnumerator(); }}

Lastly, to use this in the settings you add the above classes to an assembly and compile. In your Settings.settings editor you simply click the "Browse" option and select the MyNumberArray class and off you go.

Again this is a lot more code; however, it can be applied to much more complicated types of data than a simple array.