2015-02-23 85 views
2

我正在尋找一些幫助與LINQ查詢來篩選自定義對象的屬性/枚舉是在嵌套列表,並希望維護返回列表中的父對象。LINQ返回在嵌套列表中的子對象的屬性上過濾的對象列表<>

例如/透明度/樣本代碼,我有一個父對象,它具有在其一個列表基於類和下面枚舉:

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

任何回報。但是我缺少如何獲得MyEvaluations列表被過濾下來..

在我的示例/示例數據,我想查詢查詢ParentList的所有情況,其中ResultType = enumResultType.B;

所以會期望得到相同類型的列表,但沒有「評估」,這等於基於虛擬數據ResultType.A.C

,我希望可以得到一些東西,將有:

returnList.Count() - 2項(階段1/2階段),並且1階段內 - >的foreach(item.Result:10,11 2階段 - >的foreach(item.Result:20

可這是因爲我希望保持清單的清晰和美觀,因爲後來在i上使用了新的匿名類型DataBinding和我迭代了很多ResultTypes?

感覺我錯過了一些相當簡單的東西,但對於LINQ和lambda表達式來說還是比較新的。

回答

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()); 
+1

謝謝!是的,這是有道理的!我曾經拒絕創建一個新對象,因爲認爲可能有一種更有效的方法,只是通過一個過濾器對原始列表進行過濾,但這很有效。內聯替換修改了列表,所以不能用於我的情況,因爲我必須基於不同的EnumResultTypes對父列表進行數據綁定,但創建新列表適用於我的用例場景。 – Nic 2015-02-24 01:55:24