拆分列表<>每个项目包含逗号分隔的字符串,并将其格式化
本文关键字:字符串 格式化 分隔 列表 包含逗 项目 拆分 | 更新日期: 2023-09-27 18:10:19
我有一个像这样的简单类:
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;
}
}
之后,我用这个类创建了一个项目列表:
List<QuickReport> QR = new List<QuickReport>();
之后在我的程序中,它会被填满,当我把它保存在一个文本文件中时,它会像这个例子一样:
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
现在我想让一个函数以更可读的方式保存文本文件。这是格式化它的设备,组和pin。所以上面的例子会产生:
HBM'D1
GND: 10, 12
NT_IOp: 115, 117
HBM'D2
GND: 8
NT_IOp: 115, 116
你能帮忙给点主意吗?
谢谢!
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();
据我所知,您有树形结构,其中设备有子组,组有子引脚。您可以创建这样的自定义类:
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;
}
然后将其收集到List<Device>
并使用XML序列化对其进行序列化。
这还不完整,但应该可以让您继续。您仍然需要添加换行符,并删除尾随逗号等。
// 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);
}
如何使用XmlSerializer来序列化和反序列化您的类?这应该提供一些可读的输出。
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx我能想到的最快的方法是在List<>上循环3次,每次检查一个单独的访问器,将其写入StringBuilder,然后从函数返回StringBuilder. tostring()。
或者,您可以使用3个stringbuilder来保存每个访问器类型,然后在返回时从函数中推入所有3个。