[英]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.