gpt4 book ai didi

c# - 动态创建列表 C#

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:10 27 4
gpt4 key购买 nike

简而言之:

我有一个列表,其中包含名为“类别”的项目。对于列表类别中的每一项,我都有一个 xml 文件:

   System.IO.File.Create(Categories[listPicker.SelectedIndex] + ".xml");

创建的项目被序列化为一个带有所选索引名称的 xml 文件。

问题:

问题是对于类别中的每个项目,需要将 xml 文件反序列化为列表,因为类别的每个对象必须是另一个列表,因为它也包含项目。

但是没有反序列化xml文件的列表:

反序列化:

Serialize.Deserialize(Variable list name , Categories[1]+".xml");


那么我该如何动态创建列表,或者您能提供更好的解决方案来解决这个问题吗?

最佳答案

即使每个列表的名称不同,内容的结构也是相同的。文本/描述和值。

我会为项目创建一个类。有点像

public class ComboItem{
public string Value {get; set;}
public string Text {get; set;}
}

然后我会为每个 XML 文件都有的 ComboItem 列表创建另一个类

public class ComboItemList
{
public ComboItemList()
{
ComboItems = new List<ComboItem>();
}

[XmlArray("ComboItems"), XmlArrayItem("ComboItem")]
public List<ComboItem> ComboItems { get; set; }
}

我有一个序列化/反序列化助手。有点像

    #region static T DeserializeObject( string xml, Encoding encoding )

/// <summary>
/// Deserialize an Xml String to an [object]
/// </summary>
/// <typeparam name="T">Object Type to Deserialize</typeparam>
/// <param name="xml">Xml String to Deserialize</param>
/// <param name="encoding">System.Text.Encoding Type</param>
/// <returns>Default if Exception, Deserialize object if successful</returns>
/// <example>
/// // UTF-16 Deserialize
/// [object] = SerializationHelper<ObjectType>DeserializeObject( xml, Encoding.Unicode )
/// </example>
/// <example>
/// // UTF-8 Deserialize
/// [object] = SerializationHelper<ObjectType>DeserializeObject( xml, Encoding.UTF8 )
/// </example>
public static T DeserializeObject(string xml, Encoding encoding)
{
if (string.IsNullOrEmpty(xml)) { return default(T); }
try
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(xml)))
{
// No settings need modifying here
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();

using (XmlReader xmlReader = XmlReader.Create(memoryStream, xmlReaderSettings))
{
return (T)xmlSerializer.Deserialize(xmlReader);
}
}
}
catch
{
return default(T);
}
}

#endregion

/// <summary>
/// Deserialize an Xml String to an [object] with UTF8 as Encoding
/// </summary>
/// <param name="xml">Xml String to Deserialize</param>
/// <returns>Default if Exception, Deserialize object if successful</returns>
/// <example>
/// [object] = SerializationHelper<ObjectType>DeserializeObject( xml )
/// </example>
public static T DeserializeObjectFromFile(string filePath)
{
if (!File.Exists(filePath))
{
throw new FileNotFoundException(string.Format("The file {0}, don't exist.", filePath));
}
StreamReader sr = File.OpenText(filePath);

string xml = sr.ReadToEnd();

return DeserializeObject(xml, Encoding.UTF8);
}

我会这样称呼

string filePath01 = "PATH TO FILE 01";
List<ComboItem> List01 = SerializationHelper<ComboItem>.DeserializeObjectFromFile(filePath01);

string filePath02 = "PATH TO FILE 02";
List<ComboItem> List02 = SerializationHelper<ComboItem>.DeserializeObjectFromFile(filePath02);

List01 和 List02 将包含 File01 和 File02 的内容。对您拥有的每个文件重复此操作。

有了更好的架构,您可以在基类中创建一些属性,这些属性可以是单例的,并且只加载每个文件,并且只加载一次,从而提高性能。

关于c# - 动态创建列表 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20499533/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com