我有这样的课程设置:
public class Summary
{
public Geometry geometry { get; set; }
public SummaryAttributes attributes { get; set; }
}
public class SummaryAttributes
{
public int SERIAL_NO { get; set; }
public string District { get; set; }
}
public class Geometry
{
public List<List<List<double>>> paths { get; set; }
}
然后我为该对象获取一个json字符串记录,并将它们塞进那里:
List<Summary> oFeatures = reportObject.layers[0].features.ToObject<List<Summary>>();
我的最终目标是创建一个csv文件,所以我需要一个平坦的记录列表发送给我拥有的csv编写器。 我可以这样做:
List<SummaryAttributes> oAtts = oFeatures.Select(x => x.attributes).ToList();
我得到一个很好的属性列表并将其发送到csv。容易腻。
我想要的是也从Geometry对象中取出一个字段,并将其包含在我的最终列表中以转到csv。 因此,进入csv编写器的最终List将包含来自SummaryAttributes 加上的所有字段的对象,这些字段来自Geometry对象上的paths字段中的第一个和最后一个double值(paths [0] [0] [第一个]和路径[0] [0] [最后])
很难解释。我想将两个额外的属性移植到原始的SummaryAttributes对象上。 我可以创建一个带有两个额外字段的新SummaryAttributesXY类,如果它需要的话。 但是 我试图避免创建一个新的匿名对象 ,并且必须分隔SummaryAttributes类中的每个字段,因为我在这个示例中列出了很多内容。
有什么建议吗?
答案 0 :(得分:4)
您可以选择包含必填字段的新匿名对象,但您应该完全确定paths
每个级别的列表中至少有一个项目:
var query = oFeatures.Select(s => new {
s.attributes.SERIAL_NO,
s.attributes.District,
First = s.geometry.paths[0][0].First(), // or [0][0][0]
Last = s.geometry.paths[0][0].Last()
}).ToList()
答案 1 :(得分:1)
弄清楚了。我在原始类定义中包含X和Y字段。当json被反序列化时,它们将为null。然后我循环回来填写它们。
List<Summary> oFeatures = reportObject.layers[0].features.ToObject<List<Summary>>();
List<Summary> summary = oFeatures.Select(s =>
{
var t = new Summary
{
attributes = s.attributes
};
t.attributes.XY1 = string.Format("{0} , {1}", s.geometry.paths[0][0].First(), s.geometry.paths[0][1].First());
t.attributes.XY2 = string.Format("{0} , {1}", s.geometry.paths[0][0].Last(), s.geometry.paths[0][1].First());
return t;
}).ToList();
List<SummaryAttributes> oAtts = summary.Select(x => x.attributes).ToList();