问题描述
我想将根目录下的所有 Form 对象作为列表
public class Root
{
public int recordsTotal { get; set; }
public int recordsFiltered { get; set; }
public List<Datum> Data { get; set; }
public int ResultCode { get; set; }
}
public class Datum
{
public DateTime StartDate { get; set; }
public DateTime StopDate { get; set; }
public List<Evaluation> Evaluations { get; set; }
}
public class Evaluation
{
public string Evaluator { get; set; }
public string EvaluatorUserId { get; set; }
public Form Form { get; set; }
public DateTime EvaluationDate { get; set; }
public string EvaluationId { get; set; }
}
我正在尝试使用 linq 但尚未成功
解决方法
基于我对此的理解的简短回答:
var forms = root.Data
.SelectMany(datum => datum.Evaluations)
.Select(evaluation => evaluation.Form)
.ToList();
带测试的长答案
您没有指定类 Form
,因此我用这个最少的代码进行了测试:
using System.Collections.Generic;
namespace XUnitTestProject.StackOverflow
{
public class Root
{
public List<Datum> Data { get; set; }
}
public class Datum
{
public List<Evaluation> Evaluations { get; set; }
}
public class Form
{
public string Name { get; set; }
}
public class Evaluation
{
public Form Form { get; set; }
}
}
还有一个测试类
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace XUnitTestProject.StackOverflow
{
public class LinqTests
{
[Fact]
public void Test()
{
var forms = CreateValidRoot().Data
.SelectMany(datum => datum.Evaluations)
.Select(evaluation => evaluation.Form)
.ToList();
Assert.Equal(2,forms.Count);
Assert.Equal("~form1~",forms[0].Name);
Assert.Equal("~form2~",forms[1].Name);
}
private static Root CreateValidRoot() => new()
{
Data = new List<Datum>
{
new()
{
Evaluations = new List<Evaluation>
{
new() {Form = new Form{Name = "~form1~"}}
}
},new()
{
Evaluations = new List<Evaluation>
{
new() {Form = new Form{Name = "~form2~"}}
}
}
}
};
}
}
,
尽量减少你的收藏:
var forms = root.Data.Aggregate(
new List<Form>(),(acc,datum) =>
{
acc.AddRange(datum.Evaluations.Select(x => x.Form));
return acc;
});