LINQ返回在嵌套List<>中的Child对象的属性上过滤的Object列表

时间:2015-02-23 23:02:09

标签: linq list c#-4.0 lambda nested

我正在寻找一些 LINQ 查询的帮助来过滤嵌套列表中的自定义对象的属性/枚举,并希望维护父对象作为回报列表。

例如/ clarity / sample code,我有一个父对象,其中包含一个基于类和枚举的List:

public class Stage {
  public String Name { get; set;}
  public List<Evaluation> MyEvaluations { get; set;}
}
public class Evaluation {
  public float Result { get; set; }
  public enumResultType ResultType { get; set; }
}
public enum enumResultType { 
A,B,C 
}

一旦可以通过以下方式模拟样本数据:

List<Stage> ParentList = new List<Stage>();
Stage Stage1 = new Stage() { Name = "Stage1", 
MyEvaluations = new List<Evaluation>() { 
new Evaluation() { ResultType = enumResultType.A, Result=5 },
new Evaluation() { ResultType = enumResultType.B, Result=10},
new Evaluation() { ResultType = enumResultType.B, Result=11}, 
new Evaluation() { ResultType = enumResultType.C, Result=5}
}};
Stage Stage2 = new Stage() { Name = "Stage2",
MyEvaluations = new List<Evaluation>() { 
new Evaluation() { ResultType = enumResultType.A, Result=10},
new Evaluation() { ResultType = enumResultType.B, Result=20},
new Evaluation() { ResultType = enumResultType.C, Result=20}}};
ParentList.Add(Stage1);
ParentList.Add(Stage2);

我希望能够通过 LINQ 执行的操作是从Parentlist对象中选择仅包含已过滤列表的所有项目,其中评估中的ResultType列表匹配正确的条件...... 我不想多次重复父对象(见selectmany),而是MyEvaluations匹配的ResultType的过滤下来列表,如果此列表包含项目(它会)与父母一起返回。

我玩过:

ParentList.Select(x => x.MyEvaluations.FindAll(y => y.ResultType==enumResultType.B)).ToList();

但是这只返回内部列表......而

ParentList.Where(x => x.MyEvaluations.Any(y => y.ResultType==enumResultType.B)).ToList();

返回ANY ..但是我错过了如何过滤掉MyEvaluations的列表..

在我的示例/示例数据中,我想查询查询ParentList以查找ResultType = enumResultType.B;

的所有情况

所以期望找回相同类型的列表,但没有&#34;评估&#34;等于ResultType.A.C

根据虚拟数据,我希望能得到一些东西:

returnList.Count() - 2个项目(Stage1 / Stage2)并且在该Stage1中 - &gt; foreach(item.Result:10,11 Stage2 - &gt; foreach(item.Result:20

这可以在不进行新匿名类型的投影的情况下完成,因为我希望保持列表的良好和干净,如后面在DataBinding中使用的那样,我迭代了许多ResultTypes吗?

感觉我错过了一些相当简单的东西,但对 LINQ 和lambda表达式来说还是比较新的。

1 个答案:

答案 0 :(得分:1)

您是否已尝试过这些方法?或者这不是你想要的?

//creating a new list 
var answer = (from p in ParentList
             select new Stage(){
             Name = p.Name,
             MyEvaluations = p.MyEvaluations.Where(e => e.ResultType == enumResultType.B).ToList()
             }).ToList();

//in place replacement               
ParentList.ForEach(p => p.MyEvaluations = p.MyEvaluations.Where(e => e.ResultType == enumResultType.B).ToList());