Создание класса для отслеживания связанных строк - PullRequest
0 голосов
/ 03 октября 2011

Это довольно забавно, с последующим классом я знаю, как должен выглядеть мой вывод, но я не мог понять, как хранить данные для него.

Пожалуйста, смотрите код ниже:

    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();
    }
}

Итак, что я хочу сделать, так это то, что я хочу иметь возможность связать три разные строки «устройство, группа, пин-код» так, что ПИН-код принадлежит ГРУППЕ, а ГРУППА-УСТРОЙСТВО. как это может быть возможно?

Пожалуйста, дайте мне знать, если я не достаточно ясен.


UPDATE Хорошо, у меня есть 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 ]

2 голосов
/ 03 октября 2011

Что-то подобное?

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 голос
/ 03 октября 2011

Я написал некоторый код, который вы можете использовать для чтения необходимой информации из файла 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, 
1 голос
/ 03 октября 2011

Я думаю, что лучше изменить 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.

1 голос
/ 03 октября 2011

Я бы реализовал объектную модель данных, используя три класса:

DEVICE ИМЕЕТ GROUP

GROUP HAS PIN


UPDATE

Класс 1: DEVICE, с полем члена list_of_groups (вы можете использовать другое имя)

Класс 2: GROUP, с полем члена list_of_pins

Класс 3: PIN, с полем result (логическое значение)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...