Dumbo
Dumbo

Reputation: 14122

Splitting a list<> that each item contains comma separated strings and formatting it out

I have a simple class like this:

class QuickReport
{
    public string DeviceName { get; set; }
    public string GroupName { get; set; }
    public string PinName { get; set; }

    public override string ToString()
    {            
        return DeviceName + "," + GroupName + "," + PinName;
    }
}

Later I make a list of items with this class:

List<QuickReport> QR = new List<QuickReport>();

Later in my program it will fill up and when I save it in a text file it will be like this example:

HBM\D1,GND,10
HBM\D1,GND,12
HBM\D1,NT_IOp,115
HBM\D1,NT_IOp,117
HBM\D2,GND,8
HBM\D2,NT_IOp,115
HBM\D2,NT_IOp,116

Now I want to make a function to save the text file in more readable manner. That is formatting it by DEVICE, GROUPS and PINS. So the above example would result in:

HBM\D1
GND: 10, 12
NT_IOp: 115, 117

HBM\D2
GND: 8
NT_IOp: 115, 116

can you please help and give some ideas?

Thanks!

Upvotes: 1

Views: 530

Answers (5)

Adrian Iftode
Adrian Iftode

Reputation: 15673

var query = QR.ToLookup(i=>i.DeviceName, i => new {i.GroupName, i.PinName})
              .Select(i=> 
                     new {DeviceName = i.Key, 
                          Groups = i.ToLookup(g=>g.GroupName, g=>g.PinName)});

        var sb = new StringBuilder();
        foreach ( var device in query)
        {
            sb.AppendLine(device.DeviceName);
            foreach ( var gr in device.Groups)
            {
               sb.Append(gr.Key + ": ");
               sb.Append(String.Join(", ", gr.ToArray()));
               sb.AppendLine();
            }
            sb.AppendLine();
        }
        var stringToWrite = sb.ToString();

Upvotes: 2

Deitro
Deitro

Reputation: 271

As i understand you have tree structure, where Device have child Groups, and Groups have child pins. You can create custom classes like this:

class Group
{
    string Name;
    //pins that belong to this group
    List<string> pins; 
}

class Device
{
    string Name;
    //groups that belong to this device
    List<Group> Groups;
}

And than just collect it to List<Device> and serialize it using XML Serialization.

Upvotes: 2

Chris W
Chris W

Reputation: 1802

The quickest ways I can think of to do this would either be to loop over the List<> 3 times, eachtime checking on a seperate accessor, writing it out to a StringBuilder, then returning StringBuilder.ToString() from the function.

Or, you could use 3 stringbuilders to hold each accessor type, then push all 3 from the function on return.

Upvotes: 1

Joey
Joey

Reputation: 1800

How about using the XmlSerializer to serialize and deserialize your class? This should provide some readable output.

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

Upvotes: 1

Matt Grande
Matt Grande

Reputation: 12157

This isn't complete, but it should give you enough to go on. You'll still need to add your newlines, and remove trailing commas, etc.

// Make your key the device name
var qrHash = new Dictionary<string, List<QuickReport>>();

// Populate your QR Dictionary here.

var output = new StringBuilder();
foreach (var keyValuePair in qrHash)
{
    output.Append(keyValuePair.Key);
    var gnd = new StringBuilder("GND: ");
    var nt = new StringBuilder("NT_IOp: ");

    foreach (var qr in keyValuePair.Value)
    {
        gnd.Append(qr.GroupName);
        nt.Append(qr.PinName);
    }

    output.Append(gnd);
    output.Append(nt);
}

Upvotes: 1

Related Questions