Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的多维关联数组#_C#_Xml_Arrays - Fatal编程技术网

C# C语言中的多维关联数组#

C# C语言中的多维关联数组#,c#,xml,arrays,C#,Xml,Arrays,我对C#是完全陌生的。我是一名PHP程序员。所以请容忍我 我有一个包含以下内容的XML: <setting name="event1" color="white" align="center" /> <setting name="event2" color="red" align="left" /> 因此,如果我想从一个名为“设置”的数组中访问信息,我会使用: settings["event1"]["color"] = "white"; 在C#中,我将如何做类似的事情

我对C#是完全陌生的。我是一名PHP程序员。所以请容忍我

我有一个包含以下内容的XML:

<setting name="event1" color="white" align="center" />
<setting name="event2" color="red" align="left" />
因此,如果我想从一个名为“设置”的数组中访问信息,我会使用:

settings["event1"]["color"] = "white";
在C#中,我将如何做类似的事情?记住,我对C#完全是新手

-----编辑

我已尝试添加一个类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace xSplit_Panel_Writer
{
    class Settings
    {
        public string Color { get; set; }
        public string Align { get; set; }
    }
}
但我在实际脚本中遇到了一些问题

        using (XmlReader reader = XmlReader.Create("data/config.xml"))
        {
            while (reader.Read())
            {
                if ((reader.NodeType == XmlNodeType.Element) && (reader.Name == "setting"))
                {
                    var settings = new Dictionary<string, Settings>();
                    settings.Add(reader.Name, reader);
                }
            }
        }
使用(XmlReader=XmlReader.Create(“data/config.xml”))
{
while(reader.Read())
{
if((reader.NodeType==XmlNodeType.Element)和(&(reader.Name==“设置”))
{
var settings=newdictionary();
设置.添加(reader.Name,reader);
}
}
}
我收到以下错误:

Error   1   The best overloaded method match for 'System.Collections.Generic.Dictionary<string,xSplit_Panel_Writer.Settings>.Add(string, xSplit_Panel_Writer.Settings)' has some invalid arguments  C:\Users\Jaxel\documents\visual studio 2010\Projects\xSplit Panel Writer\xSplit Panel Writer\MainForm.cs    31  25  xSplit Panel Writer
Error   2   Argument 2: cannot convert from 'System.Xml.XmlReader' to 'xSplit_Panel_Writer.Settings'    C:\Users\Jaxel\documents\visual studio 2010\Projects\xSplit Panel Writer\xSplit Panel Writer\MainForm.cs    31  51  xSplit Panel Writer
Error 1“System.Collections.Generic.Dictionary.Add(string,xSplit_Panel_Writer.Settings)”的最佳重载方法匹配的参数C:\Users\Jaxel\documents\visual studio 2010\Projects\xSplit Panel Writer\xSplit Panel Writer\MainForm.cs 31 25 xSplit Panel Writer
错误2参数2:无法从“System.Xml.XmlReader”转换为“xSplit_Panel_Writer.Settings”C:\Users\Jaxel\documents\visual studio 2010\Projects\xSplit Panel Writer\xSplit Panel Writer\MainForm.cs 31 51 xSplit Panel Writer

您需要嵌套的
字典
实例:

var outer = new Dictionary<String, Dictionary<String, String>>();
var inner = new Dictionary<String, String>();
inner["align"] = "left";
// ...
outer["Event1"] = inner;
var outer=newdictionary();
var inner=新字典();
内部[“对齐”]=“左”;
// ...
外部[“事件1”]=内部;

您需要嵌套的
字典
实例:

var outer = new Dictionary<String, Dictionary<String, String>>();
var inner = new Dictionary<String, String>();
inner["align"] = "left";
// ...
outer["Event1"] = inner;
var outer=newdictionary();
var inner=新字典();
内部[“对齐”]=“左”;
// ...
外部[“事件1”]=内部;

如果您使用
XDocument
而不是
XmlReader
,我想您会做得更好。这样,您就可以加载XML,然后立即访问它,几乎按照您想要的方式:

XElement settingsParent = …;

var event1Color = settingsParent.Elements()
                                .Single(s => s.Attribute("name").Value == "event1")
                                .Attribute("color").Value;

当然,它比使用关联数组的代码要详细得多,但另一方面,您不必编写任何转换代码。

我认为如果您使用
XDocument
而不是
XmlReader
,您会做得更好。这样,您就可以加载XML,然后立即访问它,几乎按照您想要的方式:

XElement settingsParent = …;

var event1Color = settingsParent.Elements()
                                .Single(s => s.Attribute("name").Value == "event1")
                                .Attribute("color").Value;

当然,它比使用关联数组的代码要详细得多,但另一方面,您不必编写任何转换代码。

如果XML中的属性是静态的,我会选择创建一个类来封装数据。这将为您提供一个强类型对象,该对象的属性可以进行编码,从而获得完整的编译时支持、intellisense等

class Setting
{
    public string Name { get; set; }
    public string Color { get; set; }
    public string Align { get; set; }
}
然后,您可以用数据填充这个类的实例,创建它们的列表,或者甚至可以将它们加载到字典中,使用名称作为键

var setting = LoadSettingFromXml();
var settings = new Dictionary<string, Setting>();
settings.Add(setting.Name, setting); 

// elsewhere
settings["event1"].Color = "blue";
您可以进一步将其转换为字典。首先,演示如何使用循环创建字典“the long way”

var settingsDictionary = new Dictionary<string, Setting>();
foreach (var setting in settingsList)
{
    settingsDictionary.Add(setting.Name, setting);
}

作为参考,Linq代码需要.NET 3.5+(C#3.0+,Visual Studio 2008+版本),以及对System.Core.dll、System.Xml.Linq.dll的引用,以及对System.Linq和System.Xml.Linq的使用指令。默认情况下,在Visual Studio中创建的大多数新解决方案中都会引用DLL。

如果XML中的属性是静态的,我会选择创建一个类来封装数据。这将为您提供一个强类型对象,该对象的属性可以进行编码,从而获得完整的编译时支持、intellisense等

class Setting
{
    public string Name { get; set; }
    public string Color { get; set; }
    public string Align { get; set; }
}
然后,您可以用数据填充这个类的实例,创建它们的列表,或者甚至可以将它们加载到字典中,使用名称作为键

var setting = LoadSettingFromXml();
var settings = new Dictionary<string, Setting>();
settings.Add(setting.Name, setting); 

// elsewhere
settings["event1"].Color = "blue";
您可以进一步将其转换为字典。首先,演示如何使用循环创建字典“the long way”

var settingsDictionary = new Dictionary<string, Setting>();
foreach (var setting in settingsList)
{
    settingsDictionary.Add(setting.Name, setting);
}

作为参考,Linq代码需要.NET 3.5+(C#3.0+,Visual Studio 2008+版本),以及对System.Core.dll、System.Xml.Linq.dll的引用,以及对System.Linq和System.Xml.Linq的使用指令。默认情况下,在Visual Studio中创建的大多数新解决方案中都会引用DLL。

您已经获得了一些字典答案,但是否需要后期绑定访问?或者“设置[“事件”]。颜色是否同样适合您的需要?我不知道您在说什么…如果我不清楚,很抱歉。我在问,创建一个对象来保存属性(即早期绑定选项)是否有用。@Anthony_Pegram提供的答案解决了这个问题。你已经得到了一些字典答案,但是你需要后期绑定访问吗?或者“设置[“事件”]。颜色是否同样适合您的需要?我不知道您在说什么…如果我不清楚,很抱歉。我在问,创建一个对象来保存属性(即早期绑定选项)是否有用。@Anthony_Pegram提供的答案解决了这一问题。如果属性列表是动态的,那么这将不起作用。很难说这到底是真的,还是仅仅是OP在PHP中显示的背景。有效的一点是,添加了一个“静态”免责声明来引出答案。@JasonAxelrod,更新为使用Linq显示完整的代码示例。这太令人困惑了。。。即使你把它说出来,我一点也不懂。与C#打交道让我对PHP产生了新的尊重。在PHP中,这整个过程需要两行代码。我现在得到了一个错误:错误1找不到类型或名称空间名称“Setting”(您是否缺少using指令或程序集引用?)C:\Users\Jaxel\documents\visualstudio 2010\Projects\xSplit Panel Writer\xSplit Panel Writer\MainForm.cs 26 44 xSplit Panel Writer如果属性列表是动态的,则此操作将不起作用。很难说这到底是真的,还是仅仅是OP在PHP中的背景显示。有效点,添加了一个“静态”免责声明来引出答案。@JasonAxelrod,更新为显示完整的代码sam