我有一個對象,Foo
其中包含一個List<Bar>
。從嵌套子列表中刪除對象的空列表
Bar
包含List<Baz>
。
Baz
包含List<Qux>
。
Qux
有一個屬性,我想比較。
如果我有List<Foo>
,如何過濾掉List<Qux>
爲空的列表中的所有Foo
對象?
編輯 更新我的問題,以更恰當地反映我的問題。
我有一個對象,Foo
其中包含一個List<Bar>
。從嵌套子列表中刪除對象的空列表
Bar
包含List<Baz>
。
Baz
包含List<Qux>
。
Qux
有一個屬性,我想比較。
如果我有List<Foo>
,如何過濾掉List<Qux>
爲空的列表中的所有Foo
對象?
編輯 更新我的問題,以更恰當地反映我的問題。
感謝@ 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();
}
如果你想保持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
。
您也可以用更清晰的語法(在這種情況下,像我)做
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;
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 { }
假設你'listFoo'是你Foo'的'名單,然後我們有'變種filteredListFoo = listFoo.Select (bar => bar.Select(baz => baz.Select(qux => qux.myproperty =='somevalue')))' –
編輯表明結構是遞歸的。這是真的?這將使問題更容易理解和回答更容易。 – 31eee384
它是遞歸的。 – Ian