使用C#Linq Lambda将两个对象的字段合并为一个,最好不要使用匿名对象

时间:2017-03-22 15:18:26

标签: c# linq lambda

我有这样的课程设置:

 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类中的每个字段,因为我在这个示例中列出了很多内容。

有什么建议吗?

2 个答案:

答案 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();