如何使用 linq 从集合中获取特定集合?
Posted
技术标签:
【中文标题】如何使用 linq 从集合中获取特定集合?【英文标题】:how to get specific collection from a collection with linq? 【发布时间】:2021-05-31 02:14:42 【问题描述】:我想将根目录下的所有 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 获取它,但尚未成功
【问题讨论】:
(from x in root.Data from y in x.Evaluations select y.Form).ToList()
工作吗?
请发布您迄今为止尝试过的内容并描述未按预期工作的内容。
@MatthewWatson 谢谢,我试过(from x in root.Data from y in x.Evaluations select y.Form).ToList()
,是的。
【参考方案1】:
根据我对此的理解简短回答:
var forms = root.Data
.SelectMany(datum => datum.Evaluations)
.Select(evaluation => evaluation.Form)
.ToList();
带测试的长答案
你没有指定类Form
,因此我用这个最小代码进行了测试:
using System.Collections.Generic;
namespace XUnitTestProject.***
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.***
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 FormName = "~form1~"
,
new()
Evaluations = new List<Evaluation>
new() Form = new FormName = "~form2~"
;
【讨论】:
感谢您的努力!我会尽快尝试并让您知道它是否有效 是的,它有效,再次非常感谢!你拯救了我的一天【参考方案2】:尽量减少你的收藏:
var forms = root.Data.Aggregate(
new List<Form>(),
(acc, datum) =>
acc.AddRange(datum.Evaluations.Select(x => x.Form));
return acc;
);
【讨论】:
以上是关于如何使用 linq 从集合中获取特定集合?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 linq 检测一个集合字段是不是存在于另一个列表中?