如何在应用程序设置中存储 int[] 数组
我正在使用 C# Express 2008 创建一个简单的 Windows 窗体应用程序。我是一位经验丰富的 C++ 开发人员,但我对 C# 和 .NET 几乎是全新的。
我目前正在使用设置设计器和如下代码存储一些简单的应用程序设置:
// Store setting
Properties.Settings.Default.TargetLocation = txtLocation.Text;
...
// Restore setting
txtLocation.Text = Properties.Settings.Default.TargetLocation;
现在我想存储一个整数数组( int[]
),或者可能是一个列表ints (List
),作为设置。但是,我不知道该怎么做。我搜索了文档、stackoverflow 和 google,但找不到关于如何执行此操作的合理解释。
根据我发现的稀疏示例,我的预感是我必须创建一个可序列化的类来包装我的数组或列表,然后我将能够在设置设计器中使用该类型。但是,我不确定具体该怎么做。
I'm creating a simple windows Forms application using C# express 2008. I'm an experienced C++ developer, but I am pretty much brand new to C# and .NET.
I'm currently storing some of my simple application settings using the settings designer and code like this:
// Store setting
Properties.Settings.Default.TargetLocation = txtLocation.Text;
...
// Restore setting
txtLocation.Text = Properties.Settings.Default.TargetLocation;
Now I'd like to store either an array of ints ( int[]
), or possibly a List of ints ( List< int >
), as a setting. However, I can't figure out how to do this. I've searched the documentation, stackoverflow, and google, and I cannot find a decent explanation of how to do this.
My hunch based on the sparse examples I've found is that I have to create a class that is serializable that wraps my array or List, and then I will be able to use that Type in the settings designer. However, I'm not sure exactly how to do this.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
还有另一种解决方案 - 需要对设置文件进行一些手动编辑,但随后在 VS 环境和代码中工作正常。并且不需要额外的函数或包装器。
问题是,VS 允许在设置文件中默认序列化
int[]
类型 - 它只是默认不允许您选择它。因此,创建一个具有所需名称的设置(例如 SomeTestSetting)并将其设置为任何类型(例如默认情况下的
string
)。保存更改。
现在转到您的项目文件夹并使用文本编辑器(例如记事本)打开“Properties\Settings.settings”文件,或者您可以通过在解决方案资源管理器中右键单击“->属性->设置”在VS中打开它.settings”,选择“打开方式...”,然后选择“XML 编辑器”或“源代码(文本)编辑器”。
在打开的 xml 设置中找到您的设置(如下所示):
将“Type”参数从
System.String
更改为System.Int32[]
。现在此部分将如下所示:现在保存更改并重新打开项目设置 - 瞧! - 我们有类型为 System.Int32[] 的设置 SomeTestSetting,可以通过 VS 设置设计器(也可以是值)以及在代码中访问和编辑它。
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):
Change the "Type" param from
System.String
toSystem.Int32[]
. Now this section will look like this: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.存储:
string value = String.Join(",", intArray.Select(i => i.ToString()).ToArray());
重新创建:
int [] arr = value.Split(',').Select(s => Int32.Parse(s)).ToArray();
编辑:阿贝尔建议!
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!
还有另一种方法可以实现此结果,该方法使用起来更简洁,但需要更多代码。我实现自定义类型和类型转换器可以使用以下代码:
要实现此目的,您需要一个带有类型转换器的类型,该类型转换器允许与字符串之间的转换。您可以通过使用 TypeConverterAttribute 修饰类型来实现此目的:
然后将此类型转换器实现为 TypeConverter 的派生:
所示:
通过在 MyNumberArray 类上提供一些方便的方法,我们可以安全地在 List 之间进行赋值,完整的类将如下 ,要在设置中使用它,请将上述类添加到程序集中并编译。在您的 Settings.settings 编辑器中,您只需单击“浏览”选项并选择 MyNumberArray 类即可。
同样,这需要更多的代码;但是,它可以应用于比简单数组更复杂的数据类型。
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:
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:
Then implementing this type converter as a derivation of TypeConverter:
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:
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.
将设置指定为 System.Collections.ArrayList,然后:
Specify the setting as a System.Collections.ArrayList and then:
一个简单的解决方案是在属性中将设置的默认值设置为 null,但在构造函数中检查该属性是否为 null,如果是,则将其设置为实际的默认值。因此,如果您想要一个整数数组:
这感觉有点hacky,但它干净并且可以按需要工作,因为属性在调用构造函数之前被初始化为其最后(或默认)设置。
A simple solution is to set the default value of a setting to null in the property, but in the constructor check if the property is null and if so then set it to its actual default value. So if you wanted an array of ints:
It feels kind of hacky, but its clean and works as desired since the properties are initialized to their last (or default) settings before the constructor is called.
使用
System.Object
。示例:
摘录:
Used
System.Object
.Example:
Extract:
我认为你关于序列化你的设置是正确的。请参阅我对此问题的回答以获取示例:
技术在两个应用程序之间共享配置?
您将拥有一个数组属性,如下所示:
I think you are right about serializing your settings. See my answer to this question for a sample:
Techniques for sharing a config between two apps?
You would have a property which is an array, like this:
创建一些将 int 数组转换为字符串的函数,但在每个函数之间放置一个字符,如“”(空格)。
因此,如果数组是 { 1,34,546,56 },则字符串将为“1 34 645 56”
Make some functions that convert a int array in a string, but between each put a character like " " (space).
So if the array is { 1,34,546,56 } the string would be "1 34 645 56"