如何使用 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 问题:查询嵌套集合

如何根据其他属性从同一个集合中获取元素

如何获取 Linq 查询结果集合中的索引?

如何使用 linq 检测一个集合字段是不是存在于另一个列表中?

如何使用 Firebase RealTime 数据库根据特定类别获取项目集合

在 Linq 中,如何在不使用 Count(predicate) 的情况下查找集合是不是包含元素?