创建一个类来跟踪相关的字符串

时间:2011-10-03 12:41:58

标签: c# string class list dictionary

这很有趣,通过下面的课程,我知道我的输出应该如何,但我无法弄清楚如何保存它的数据。

请参阅以下代码:

    public class QuickFailureReportText
{
    public string[] device { get; set; }
    public string[] group { get; set; }
    public string[] pin { get; set; }


    public override string ToString()
    {
        TextWriter tw;
        StringBuilder sb = new StringBuilder();
        tw = new StringWriter(sb);

        tw.WriteLine("Quick Failure Report");

        foreach (string dev in device)
        {
            tw.WriteLine("Failures in " + dev);

            foreach (string grp in group)
            {
               tw.Write("Group " + grp + " : ");

                foreach(string p in pin)
                {
                    tw.Write(p + ", ");
                }
                tw.WriteLine(); //new line
            }
            tw.WriteLine(); //new line
        }

        return tw.ToString();
    }
}

所以我想做的是,我希望能够将三个不同的字符串“device,group,pin”somhow联系起来,即PIN属于一个GROUP而一个GROUP属于一个DEVICE。怎么可能呢?

如果我不够清楚,请告诉我。


更新 好的,我有一个XML文件,我可以从中读取数据没有问题。 xml文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?> 
<DEVICES> 

  <device> 
    <name>device 1</name> 
    <groups> 
      <group>
      <group_name>group 1</group_name> 
      <pins> 
        <pin result="fail">A1</pin> 
        <pin result="pass">A2</pin> 
      </pins>
      </group>
      <group> 
      <group_name>group 2</group_name> 
      <pins> 
        <pin result="fail">B1</pin> 
        <pin result="pass">B2</pin> 
      </pins>
      </group>       
    </groups> 
  </device> 

</DEVICES>

所以我想从这个XML(可能有很多设备)中收集数据并使用我上面写的类来过滤失败的引脚。

4 个答案:

答案 0 :(得分:2)

那样的东西?

public class Device
{
    public string Name;
    public List<Group> Groups = new List<Group>();
}

public class Group
{
    public string Name;
    public List<Pin> Pins = new List<Pin>();
}

public class Pin
{
    public string Name;
    public string Result;
}

答案 1 :(得分:1)

我将使用三个类来实现对象数据模型:

DEVICEGROUP

GROUPPIN


<强>更新

第1课:DEVICE,成员字段list_of_groups(您可以使用其他名称)

第2课:GROUP,成员字段list_of_pins

第3课:PIN,成员字段result(布尔值)

答案 2 :(得分:1)

我认为如果以这种方式更改xml会更好:

<?xml version="1.0" encoding="utf-8"?> 
<DEVICES> 

  <device> 
    <name>device 1</name> 
    <groups> 
      <group>
      <group_name>group 1</group_name> 
      <pins> 
        <pin result="fail">A1</pin> 
        <pin result="pass">A2</pin> 
      </pins>
      </group>
      <group> 
      <group_name>group 2</group_name> 
      <pins> 
        <pin result="fail">B1</pin> 
        <pin result="pass">B2</pin> 
      </pins>
      </group>       
    </groups> 
  </device> 

</DEVICES> 

因此,您可以定义包含Device列表的对象Group,其中包含对象列表Pin

答案 3 :(得分:1)

我编写了一些代码,您可以使用这些代码从xml文件中读取所需信息,存储在设备变量

public class Device
{
    public string Name;
    public Dictionary<string, Group> Groups = new Dictionary<string, Group>();
}

public class Group
{
    public string Name;
    public List<string> Pins = new List<string>();
}

public class QuickFailureReportText
{
    public Dictionary<string, Device> devices = new Dictionary<string, Device>();

    public void AddLog(string deviceName, string groupName, string pin)
    {
        if (!devices.ContainsKey(deviceName))
            devices.Add(deviceName, new Device() 
                 { Name = deviceName, Groups = new Dictionary<string, Group>() });

        if (!devices[deviceName].Groups.ContainsKey(groupName))
            devices[deviceName].Groups.Add(groupName, new Group() 
                 { Name = groupName, Pins = new List<string>() });

        devices[deviceName].Groups[groupName].Pins.Add(pin);
    }


    public override string ToString()
    {
        TextWriter tw;
        StringBuilder sb = new StringBuilder();
        tw = new StringWriter(sb);
        tw.WriteLine("Quick Failure Report");

        XDocument xDoc = XDocument.Load(@"devices.xml");
        foreach (XElement device in xDoc.XPathSelectElements("DEVICES/device"))
        {
            foreach (XElement group in device.XPathSelectElements("groups/group"))
            {
                foreach (XElement pin in group.XPathSelectElements("pins/pin"))
                {
                    if (pin.Attribute("result").Value == "fail")
                    {
                        AddLog(device.XPathSelectElement("name").Value,
                        group.XPathSelectElement("group_name").Value, pin.Value);
                    }
                }
            }
        }

        foreach (var device in devices.Values)
        {
            tw.WriteLine("Failures in " + device.Name);

            foreach (var grp in device.Groups.Values)
            {
                tw.Write("Group " + grp.Name + " : ");

                foreach (string p in grp.Pins)
                {
                    tw.Write(p + ", ");
                }
                tw.WriteLine(); //new line
            }
            tw.WriteLine(); //new line
        }


        return tw.ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        string s = new QuickFailureReportText().ToString();
    }
}

以下是示例文件的's'字符串值:

Quick Failure Report
Failures in device 1
Group group 1 : A1, 
Group group 2 : B1,