我只是想了解 Linq,我正在尝试做一些看起来很简单的事情,但我无法让它以我想要的方式输出。几天来,我一直坚持这一点,尝试了各种不同的方法,但我无法做到正确。
所以我有一个类 EarObs,它有成员:eventID、icaoId、frm、sta、db。
我正在尝试从列表构建 XML 文档。我希望 XML 文档看起来像这样:
<EarObs EventId = "123456789">
<icao icaoID = "0001">
<frm frm = "01">
<sta sta = "00">
<db>87</db>
<hz>99</hz>
</sta>
<sta station = "01">
<db>79</db>
<hz>99</hz>
</sta>
</frm>
<frm frm = "02">
................
</frm>
</icao>
</EarObs>
如果有不止一帧或不止一个代码等,这将一直持续下去,保持相同的顺序。
所以这是我最近一直在尝试的,但它仍然没有按照我想要的方式输出,Obs 会重复,我不知道我哪里出错了。
string eventGUID = "eventGUID";
List<EarObs> frameObsList = new List<EarObs>();
for (int frm = 2; frm > 0; frm--)
{
for (int sta = 5; sta > 0; sta--)
{
frameObsList.Add(new EarObs("KAPF", eventGUID, frm, sta, 85 + sta, 99 + sta));
cnt++;
}
}
String eventID = obsList.First().EventGUID;
List<EarObs> distinctApts =
obsList
.GroupBy(p => p.IcaoId)
.Select(g => g.First())
.ToList();
XElement xElement = new XElement("EarObs", new XAttribute("eventID", eventID),
from ea in distinctApts
orderby ea.IcaoId
select new XElement("icao", new XAttribute("code", ea.IcaoId),
from eb in obsList
where ea.IcaoId == eb.IcaoId
orderby eb.Frm
select new XElement("frm", new XAttribute("frm", eb.Frm),
from ec in obsList
where eb.Frm == ec.Frm
orderby ec.Sta
select new XElement("sta", new XAttribute("sta", ec.Sta),
new XElement("db", ec.Db),
new XElement("hz", ec.Hz)))));
使用此代码,我得到一个 xml 文档,该文档为每个站点重复一次帧。这是不正确的。我觉得这很容易按顺序完成,但我正在努力学习,这似乎很简单,我应该能够在 Linq 中完成。我需要 List 中的每个元素只在 XML 文档中表示一次。我该怎么做?
我还想扩展它,以便它也可以处理多个 eventId,但这并不像获得正确的 XML 结构那么重要。任何帮助将不胜感激,我无法找到太多创建 XML 的示例,包括使用 linq 过滤元素,大多数示例似乎在创建 XML 之前已经准备好构建列表。