使用LINQ在SelectMany中有选择地填充属性?

时间:2015-05-06 16:12:43

标签: c# linq-to-objects

我正在使用SelectMany进行一些数据转换。它实质上是扁平化一些分层数据。问题是某些相关数据需要由缺少数据来表示。以下是我正在做的事情的一个例子:

var records = report.Persons.SelectMany(
            person => person.Relatives.Select(relative => new FlattenedRecord
            {
                ReportNumber = report.ReportNumber,
                ReportDate = report.ReportDate,
                PersonAge = person.Age,
                PersonSex = person.Sex,
                PersonRace = person.Race,
                RelativesAge = relative.Age,
                RelativesSex = relative.Sex,
                RelativesRace = relative.Race,
                Relationship = relative.Relationship)
            }));

这会产生一个类似于此的列表:

ReportNumber|ReportDate|PersonAge|PersonSex|PersonRace|RelativeAge|RelativeSex|RelativeRace|Relationship
           1|2015-01-01|       25|    M    |    W     |    48     |     F     |      W     |   Parent
           1|2015-01-01|       25|    M    |    W     |    18     |     M     |      W     |   Sibbling
           1|2015-01-01|       25|    M    |    W     |    44     |     M     |      W     |   Parent
           1|2015-01-01|       14|    F    |    B     |    34     |     F     |      B     |   Parent
           1|2015-01-01|       16|    M    |    B     |    34     |     F     |      B     |   Parent
           1|2015-01-01|        8|    M    |    B     |    34     |     F     |      B     |   Parent

需要发生的事情是,如果有多个人具有相同的亲属,或者如果一个人有多个亲属,则年龄,性别,种族和关系数据需要为后续行留空。例如:

ReportNumber|ReportDate|PersonAge|PersonSex|PersonRace|RelativeAge|RelativeSex|RelativeRace|Relationship
           1|2015-01-01|       25|    M    |    W     |    48     |     F     |      W     |   Parent
           1|2015-01-01|         |         |          |    18     |     M     |      W     |   Sibbling
           1|2015-01-01|         |         |          |    44     |     M     |      W     |   Parent
           1|2015-01-01|       14|    F    |    B     |    34     |     F     |      B     |   Parent
           1|2015-01-01|       16|    M    |    B     |           |           |            |    
           1|2015-01-01|        8|    M    |    B     |           |           |            |    

但是对于我的生活,我无法弄清楚如何做我需要做的事。

2 个答案:

答案 0 :(得分:1)

Person lastPerson = null;
Relative lastRelative = null;
var records = report.Persons.SelectMany(
    person => person.Relatives.Select(relative =>
    {
        FlattenedRecord r = new FlattenedRecord
        {
            ReportNumber = report.ReportNumber,
            ReportDate = report.ReportDate,
            PersonAge = lastPerson != person ? person.Age : "",
            PersonSex = lastPerson != person ? person.Sex : "",
            PersonRace = lastPerson != person ? person.Race : "",
            RelativesAge = lastRelative != relative ? relative.Age : "",
            RelativesSex = lastRelative != relative ? relative.Sex : "",
            RelativesRace = lastRelative != relative ? relative.Race : "",
            Relationship = lastRelative != relative ? relative.Relationship : ""
        };

        lastPerson = person;
        lastRelative = relative;

        return r;
    }));

答案 1 :(得分:0)

如果你这样做会怎么样?

var records = report.Persons.SelectMany(
            person => new FlattenedRecord
            {
                ReportNumber = report.ReportNumber,
                PersonRace = person.Race,
                RelativesAge = person.Relatives.Count() > 1 ? null : person.Relatives.First().Age
            });