LINQ to return list of Object filtered on a proper

2019-07-19 23:01发布

I'm looking for some help with a LINQ query to filter on a property/enum of a custom object which is in a nested List, and want to maintain the parent object in return list.

For example/clarity/sample code, I have a parent object, which has in it a List based on class and enum below:

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 
}

Once can simulate sample data along those lines with something like:

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);

What I want to be able to do via LINQ is to select from the Parentlist object, all the items with only a filtered list where The ResultType in the Evaluations List matches a proper condition... I don't want to repeat the parent object Multiple times (seen selectmany), rather a filtered down list of the MyEvaluations where the ResultType matches, and if this list has items (it would) return it with the parent.

I've played with:

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

however this return only the inner list... whereas

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

returns ANY.. however I am missing how to get the list of MyEvaluations to be filtered down..

In my Example/sample data, I would like to query query ParentList for all situations where ResultType = enumResultType.B;

So would expect to get back a list of the same type, but without "Evaluation" which are equal to ResultType.A or .C

Based on dummy data, I would expect to be getting something which would have:

returnList.Count() - 2 items (Stage1 / Stage2) and within that Stage1 --> foreach (item.Result : 10, 11 Stage2 --> foreach (item.Result : 20

Can this be done without going to projections in new anonymous types as I would like to keep the list nice and clean as used later on in DataBinding and I iterate over many ResultTypes?

Feel like I'm missing something fairly simple, but fairly new to LINQ and lambda expressions.

1条回答
成全新的幸福
2楼-- · 2019-07-19 23:50

Did you try these approaches already? Or is this not what you're looking for ?

//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());
查看更多
登录 后发表回答