簡體   English   中英

C#中的多維關聯數組

[英]Multidimensional Associate Array in C#

我是C#的新手。 我是一名PHP程序員。 所以,請忍受我。

我有一個包含以下內容的XML:

<setting name="event1" color="white" align="center" />
<setting name="event2" color="red" align="left" />

我已經想出了如何使用XmlReader GetAttribute獲取信息,但是我完全不知道如何將其存儲到數組中。 我想要的最終數組將是這樣的:

Array
(
    [event1] => Array
    (
        [color] => white
        [align] => center
    )
    [event2] => Array
    (
        [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);
                }
            }
        }

我收到以下錯誤:

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

如果您XML中的屬性是靜態的,我將選擇創建一個類來封裝您的數據。 這將為您提供一個具有類型屬性的強類型對象,您可以對其進行編碼,獲得完整的編譯時支持,智能感知等。

class Setting
{
    public string Name { get; set; }
    public string Color { get; set; }
    public string Align { get; set; }
}

然后,您可以使用數據填充此類的實例,創建它們的列表,甚至可以使用Name作為鍵將它們加載到字典中。

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

// elsewhere
settings["event1"].Color = "blue";

您可以從那里開始學習使用Linq-to-Xml將XML讀入這些對象,然后進一步讀入您喜歡的集合類型的方法。


完整的代碼示例。 給定上面定義的類和有效的XML代碼段

string xml = @" <settings>
                    <setting name=""event1"" color=""white"" align=""center"" /> 
                    <setting name=""event2"" color=""red"" align=""left"" />
                </settings>";

您可以使用Linq-to-Xml將文檔解析為一系列對象。

// can also use XDocument.Load(...) to load from a file or stream.
var document = System.Xml.Linq.XDocument.Parse(xml);
var settingsList = (from element in document.Root.Elements("setting")
                    select new Setting
                    {
                        Name = element.Attribute("name").Value,
                        Color = element.Attribute("color").Value,
                        Align = element.Attribute("align").Value
                    }).ToList();

您可以將其進一步轉換為字典。 首先,顯示創建帶有循環的字典“ the long way”。

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

但是,您也可以使用Linq將序列轉換為字典,而無需顯式循環。

var settingsDictionary = settingsList.ToDictionary(s => s.Name, s => s);

作為參考,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。

您需要嵌套的Dictionary實例:

var outer = new Dictionary<String, Dictionary<String, String>>();
var inner = new Dictionary<String, String>();
inner["align"] = "left";
// ...
outer["Event1"] = inner;

我認為如果使用XDocument而不是XmlReader會更好。 這樣,您可以加載XML,然后立即訪問它,幾乎是您想要的方式:

XElement settingsParent = …;

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

誠然,它比使用關聯數組的代碼更為冗長,但另一方面,您不必編寫任何轉換代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM