我试图对另一个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
};
}
答案 0 :(得分:4)
我不完全确定要将问题代码的哪一部分分成扩展方法。另外,就写作而言,不要专注于扩展方法部分,它与其他功能没什么区别。
您可以使用SelectMany
获取InterventionHistory
个对象的平面列表和Select
,以便转换为InterventionAndNeetRiskReportLineModel
和ToList
进行最终如果您确实需要,则以列表而不是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();
......正如我所说,它并不完全清楚,你要将哪一部分重构为扩展方法。