2015-11-24 28 views
-1

我有一個對象,Foo其中包含一個List<Bar>從嵌套子列表中刪除對象的空列表

Bar包含List<Baz>

Baz包含List<Qux>

Qux有一個屬性,我想比較。

如果我有List<Foo>,如何過濾掉List<Qux>爲空的列表中的所有Foo對象?

編輯 更新我的問題,以更恰當地反映我的問題。

+0

假設你'listFoo'是你Foo'的'名單,然後我們有'變種filteredListFoo = listFoo.Select (bar => bar.Select(baz => baz.Select(qux => qux.myproperty =='somevalue')))' –

+0

編輯表明結構是遞歸的。這是真的?這將使問題更容易理解和回答更容易。 – 31eee384

+0

它是遞歸的。 – Ian

回答

0

感謝@ 31eee384爲把我在正確的軌道上。

我還合併了Except()擴展名以刪除空列表。我相信有一種更有效的方法來寫這篇文章,所以,如果你知道其中一篇,請發帖。

這是我創建的擴展方法。

internal static List<Foo> OnlyWithQuxs(this List<Foo> model) 
{ 
    var foosToRemove = new List<Foo>(); 

    foreach (var foo in model) 
    { 
     var barsToRemove = new List<Bar>(); 

     foreach (var bar in foo.bars) 
     { 
      var bazWithQux = new List<Baz>(); 
      var bazsToRemove = new List<Baz>(); 

      foreach (var baz in bar.bazs) 
      { 

       baz.Quxs = GetbazQuxs(baz.Id) 
        .Where(qux => qux.Property == someValue) 
        .ToList(); 

       bazWithQux.Add(baz); 

       if (baz.Quxs == null || baz.Quxs.Count() == 0) 
        bazsToRemove.Add(baz); 
      } 

      bar.bazs = bazWithQux.Except(bazsToRemove).ToList(); 

      if (bar.bazs == null || bar.bazs.Count() == 0) 
       barsToRemove.Add(bar); 
     } 

     foo.bars = foo.bars.Except(barsToRemove).ToList(); 

     if (foo.bars == null || foo.bars.Count() == 0) 
      foosToRemove.Add(foo); 
    } 

    return model.Except(foosToRemove).ToList(); 
} 
0

如果你想保持Foo時存在一些Qux下,它具有一定的價值,做到這一點:

List<Foo> foos = ...; 
IEnumerable<Foo> query = foos 
    .Where(foo => foo.Bars 
     .SelectMany(bar => bar.Bazs) 
     .SelectMany(baz => baz.Quxs) 
     .Any(qux => qux.SomeProperty == someValue)); 

如果你想保持Foo當所有Qux下,它有一定的價值,用All代替Any

+0

我通過你的代碼在混合中產生了和我最初一樣的數據。我編輯了我的問題。 – Ian

+0

@Ian編輯的問題沒有意義。 –

+0

對不起,我在路上。如果列表爲空,那麼如何從列表中篩選出Baz,並且每個父項的相同? – Ian

0

您也可以用更清晰的語法(在這種情況下,像我)做

List<Foo> lst = GetFooList(); 
var foos = from foo in lst 
      from bar in foo.Bars 
      from baz in bar.Bazs 
      from qux in baz.Quxs 
      where qux.Property != somevalue 
      select foo; 
0
foos.Where(f=>f.Bars.All(bar=>bar.Bazs.All(baz=>baz.Quxs.Any())>)) 

這應該工作,每一個baz不會有一個空List<Qux>

var foos = new List<Foo> 
      { 
       new Foo {Bars = new List<Bar> {new Bar { Bazs = new List<Baz> { new Baz { Quxs = new List<Qux> { new Qux()} } } } } }, 
       new Foo {Bars = new List<Bar> {new Bar { Bazs = new List<Baz> { new Baz { Quxs = new List<Qux> { new Qux()} } } } } }, 
       new Foo {Bars = new List<Bar> {new Bar { Bazs = new List<Baz> { new Baz { Quxs = new List<Qux> { } } } } } }, 

      }; 

      var r = foos.Where(f => f.Bars.All(bars=>bars.Bazs.All(baz=>baz.Quxs.Any()))).ToList(); 

class Foo 
{ 
    public List<Bar> Bars { get; set; } 
} 

class Bar 
{ 
    public List<Baz> Bazs { get; set; } 
} 

class Baz 
{ 
    public List<Qux> Quxs { get; set; } 
} 

class Qux { } 
+0

This returns List 其中列表是空的而非非空列表 Ian

+0

@Ian,這很奇怪,因爲如果我對該類結構運行該查詢,我會得到兩條記錄。 –

+0

週五我進店時我會重新運行它。我對你的代碼的測試是基於你原來的迴應....請繼續關注! – Ian