如何使用linq从集合中获取特定集合?

问题描述

我想将根目录下的所有 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;
});