我正在寻找一些 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表达式来说还是比较新的。
答案 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());