将存储值类输出到列表

时间:2012-02-07 00:58:16

标签: c# list listbox

这将从XML文件加载一组值,并将它们放入类中进行存储。我试图找出如何将值作为列表输出,以便将它们放入列表框中。

我认为有一种像.ToList()方法这样的简单方法,或者能够通过类中的字符串(没有公共GetEnumerator)进行操作。我已经能够发现Foreach隐藏了一些复杂性,但没有去做我想做的事。

我一直在网上搜索没有用(可能缺少正确的术语),不幸的是我在工作中留下了我的C#参考书:/

非常欣赏正确方向的指针, 感谢。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;

namespace ThereIsOnlyRules
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            listBox1.Items.Clear();

            string path = "characterXML.xml";
            FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            System.Xml.XmlDocument CXML = new System.Xml.XmlDocument();

            CXML.Load(fs);

            //Get the number of elements 
            XmlNodeList elemList = CXML.GetElementsByTagName("unit");

            //foreach (var element in elemList)
            //{
            //    listBox1.Items.Add(element);
            //}

            for (int i = 0; i < elemList.Count; i++)
            {
                UnitAttributes attributes = new UnitAttributes();

                attributes.army = elemList[i].Attributes["army"].Value;
                attributes.category = elemList[i].Attributes["category"].Value;
                attributes.type = elemList[i].Attributes["type"].Value;
                attributes.composition = elemList[i].Attributes["composition"].Value;
                attributes.WS = elemList[i].Attributes["WS"].Value;
                attributes.BS = elemList[i].Attributes["BS"].Value;
                attributes.T = elemList[i].Attributes["T"].Value;
                attributes.W = elemList[i].Attributes["W"].Value;
                attributes.I = elemList[i].Attributes["I"].Value;
                attributes.A = elemList[i].Attributes["A"].Value;
                attributes.LD = elemList[i].Attributes["LD"].Value;
                attributes.save = elemList[i].Attributes["Save"].Value;
                attributes.armour = elemList[i].Attributes["armour"].Value;
                attributes.weapons = elemList[i].Attributes["weapons"].Value;
                attributes.specialrules = elemList[i].Attributes["specialrules"].Value;
                attributes.transport = elemList[i].Attributes["transport"].Value;
                attributes.options = elemList[i].Attributes["options"].Value;

                //foreach (string item in attributes)
                //{

                    //unit.Add(item);
                //}
                //listBox1.Items.AddRange(attributes)

            }  

            //Close the filestream
            fs.Close();
        }
        catch (Exception ex)
        {

        }
    }
}
}

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

namespace ThereIsOnlyRules
{
class UnitAttributes
{
    public string army { get; set; }
    public string category { get; set; }
    public string type { get; set; }
    public string composition { get; set; }
    public string WS { get; set; }
    public string BS { get; set; }
    public string T { get; set; }
    public string W { get; set; }
    public string I { get; set; }
    public string A { get; set; }
    public string LD { get; set; }
    public string save { get; set; }
    public string armour { get; set; }
    public string weapons { get; set; }
    public string specialrules { get; set; }
    public string transport { get; set; }
    public string options { get; set; }
    }
}

<?xml version="1.0"?>
<config>
<unit
army="Tyranids"
category="Troops"
type="Infantry"
composition="10-30"
WS="3"
BS="3"
T="3"
W="1"
I="4"
A="1"
LD="6"
Save="6+"
armour="Chitin"
weapons="Claws and Teeth, Fleshborer"
specialrules="Instictive Behaviour - Lurk, Move Through Cover"
transport="If the brood consists of 20 models or less, it may take a Mycetic Spore."
options="Strangleweb, Spinefists, Spike rifle, Devourer, Adrenal Glands, Toxin Sacs"
>
Termagant Brood
</unit>
<unit
army="Tyranids"
category="Troops"
type="Infantry"
composition="10-30"
WS="3"
BS="3"
T="3"
W="1"
I="5"
A="2"
LD="6"
Save="6+"
armour="Chitin"
weapons="Scything Talons"
specialrules="Instictive Behaviour - Feed, Bounding Leap, Fleet, Move Through Cover"
transport="If the brood consists of 20 models or less, it may take a Mycetic Spore."
options="Adrenal Glands, Toxin Sacs"
>
Hormagaunt Brood
</unit>
</config>

2 个答案:

答案 0 :(得分:3)

您的班级字段或属性的成员?无论哪种方式,一点点反射和Linq应该允许您在从XML文件中保存它的实例后,通过类的数据成员进行枚举。

var fieldDictionary = 
   (from f in typeof(UnitAttributes).GetFields()
    select new {Name = f.Name, Value = (string)(f.GetValue(attributes))})
   .ToDictionary(x=>x.Name, x=>x.Value);

fieldDictionary现在是Dictionary<string, string>IEnumerable<KeyValuePair<string, string>>),应该适合加载到ListBox中。

建议;反思很慢。你最好修改或扩展你的UnitAttributes类来实现IEnumerable(可能是一个元组,可能是一个KeyValuePair)。它还允许您按照所需的顺序枚举类实例的属性,而不是它们的定义顺序,或者通过其他FieldInfo / PropertyInfo数据(如字段名称)来枚举类的实例。

另请注意,字段不是属性,反之亦然。如果你班上有混合属性和公共领域,我强烈建议标准化为一个或另一个;否则你将不得不使用上述两个Linq语句(以大约两倍的运行时间为代价)反映属性列表和字段列表,并且它们不可能在任何自定义定义中顺序。

答案 1 :(得分:2)

如果您使用XmlSerializer之类的常见序列化程序来处理将对象转换为字符串或从字符串转换对象,那么您将节省大量时间和精力。您不必从头开始编写此类代码。