将存储值类输出到列表

Ami*_*ble 6 c# listbox list

这将从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>
Run Code Online (Sandbox Code Playgroud)

Kei*_*thS 3

您的类的成员是字段还是属性?无论哪种方式,在从 XML 文件中合并了类的实例后,一点点反射和 Linq 应该允许您枚举类的数据成员。

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);
Run Code Online (Sandbox Code Playgroud)

fieldDictionary 现在是 a Dictionary<string, string>(这是一个IEnumerable<KeyValuePair<string, string>>),它应该适合加载到 ListBox 中。

被告知; 反射很慢。对您来说,修改或扩展 UnitAttributes 类来实现 IEnumerable(可能是 Tuple,可能是 KeyValuePair)会更可取。它还允许您按照您想要的顺序枚举类实例的属性,而不是按照它们定义的顺序,或者通过一些其他 FieldInfo/PropertyInfo 数据(例如字段名称)。

另请注意,字段不是属性,反之亦然。如果您的班级混合使用属性和公共字段,我强烈建议您对其中之一进行标准化;否则,您必须使用上述两个 Linq 语句来反映属性列表和字段列表(成本大约是运行时间的两倍),并且它们不可能出现在任何自定义定义中命令。