【问题标题】:how to get specific collection from a collection with linq?如何使用 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(),是的。

标签: c# linq asp.net-core ienumerable


【解决方案1】:

根据我对此的理解简短回答:

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~"}}
                    }
                }
            }
        };
    }
}

【讨论】:

  • 感谢您的努力!我会尽快尝试并让您知道它是否有效
  • 是的,它有效,再次非常感谢!你拯救了我的一天
【解决方案2】:

尽量减少你的收藏:

var forms = root.Data.Aggregate(
new List<Form>(),
(acc, datum) =>
{
    acc.AddRange(datum.Evaluations.Select(x => x.Form));
    return acc;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多