另一个列表中列表中项目的扩展方法

时间:2016-11-14 16:10:33

标签: c#

我试图对另一个List<>内的List<>内的每个项目执行一个扩展方法,以返回给定类型的集合(由扩展方法返回)。

我最初尝试(并且失败)使用linq执行此操作,但我有以下内容:

        var dataset = GetReportDataset(org);

        var reportData = new List<InterventionAndNeetRiskReportLineModel>();

        foreach (var record in dataset)
        {
            foreach (var inter in record.InterventionHistory)
            {
                 reportData.Add(inter.ToInterventionAndNeetRiskReportLineModel());
            }
        }
        return _reportWriter.ReportCsvStream(reportData);

所以我的问题是,如何使用linq为子集合中的每个项目投影扩展方法的结果?

更新 ToInterventionAndNeetRiskReportLineModel()扩展方法

    public static InterventionAndNeetRiskReportLineModel ToInterventionAndNeetRiskReportLineModel(this InterventionHistory intervention)
    {
        return new InterventionAndNeetRiskReportLineModel()
        {
            Beneficiary = intervention.Person.Beneficiary,
            CourseTitle = intervention.CourseTitle,
            CaseNotes = intervention.CaseNotes,
            EndDate = intervention.EndDate?.ToString(),
            StartDate = intervention.StartDate.ToString(),
            ParticipantId = intervention.Person.ParticipantId,
            FirstEit = intervention.Person.EitScores.GetFirstEitReading().ToString(),
            LastEit = intervention.Person.EitScores.GetLastEitReading().ToString(),
            FirstLpt = intervention.Person.LptScores.GetFirstLptReading().ToString(),
            LastLpt = intervention.Person.LptScores.GetLastLptReading().ToString(),
            Gender = intervention.Person.Equalitites.Gender,
            HoursAttended = intervention.NoOfHours.ToString(),
            LanguageOfDelivery = intervention.DeliveryLanguage,
            Providername = intervention.ProviderName,
            QanCode = intervention.QanCode,
            SchoolCollegeName = intervention.ProviderName
        };
    }

1 个答案:

答案 0 :(得分:4)

我不完全确定要将问题代码的哪一部分分成扩展方法。另外,就写作而言,不要专注于扩展方法部分,它与其他功能没什么区别。

您可以使用SelectMany获取InterventionHistory个对象的平面列表和Select,以便转换为InterventionAndNeetRiskReportLineModelToList进行最终如果您确实需要,则以列表而不是IEnumerable<T>结果。

var reportData = GetReportDataset(org)
    .SelectMany(r => r.InterventionHistory)
    .Select(i => i.ToInterventionAndNeetRiskReportLineModel())
    .ToList();

所以,也许你想要一个像

这样的扩展方法
public static IEnumerable<InterventionAndNeetRiskReportLineModel> ToInterventionRiskReports(this IEnumerable<ReportDataset> _self)
     return _self
        .SelectMany(r => r.InterventionHistory)
        .Select(i => i.ToInterventionAndNeetRiskReportLineModel());
}

并将其用作

var reportData = GetReportDataset(org).ToInterventionRiskReports().ToList();

......正如我所说,它并不完全清楚,你要将哪一部分重构为扩展方法。