我有类似下面的类结构
public class Level1
{
public ICollection<Level2> Level2 { get; set; }
}
public class Level2
{
public ICollection<Level3> Level3 { get; set; }
}
public class Level3
{
public ICollection<Level4> Level4 { get; set; }
}
public class Level4
{
public int Id { get; set; }
public bool isActive { get; set; }
}
我有一个IEnumerable<Level1>
对象,想要在第4级搜索特定的ID。如果存在id,则设置isActive
标志。
知道怎么做。
答案 0 :(得分:3)
对要跳过的每个级别使用SelectMany
。您可以“链接”调用以避免多个声明:
IList<Level1> list1 = ... //
var level4 = list1
.SelectMany(item1 => item1.Level2)
.SelectMany(item2 => item2.Level3)
.SelectMany(item3 => item3.Level4);
现在您可以根据需要迭代它们:
var itemsWithId = level4
.Where(item4 => item4.Id == myId);
如果Id
在第4级是唯一的,请使用SingleOrDefault
代替Where
。
答案 1 :(得分:2)
试试这个:
IEnumerable<Level1> level1 = GetLevels();
var idLookFor = 4;
var l = level1.SelectMany(l1 => l1.Level2.SelectMany(l2 => l2.Level3.SelectMany(l3 => l3.Level4.Where(l4 => l4.Id == idLookFor)))).ToList();
//loop all items and set flag:
l.ForEach((x) => x.isActive = true);
答案 2 :(得分:1)
为了完整性,对于那些永远不会记住SelectMany
语法的人(比如我),你也可以使用多个from
子句做同样的事情:
// assume level1s is an IEnumerable<Level1>
var level4sOfInterest =
from level1 in level1s
from level2 in level1.Level2
from level3 in level2.Level3
from level4 in level3.Level4
where level4.Id == 4
select level4;
现在level4sOfInterest
是IEnumerable<Level4>
,您可以根据需要进行迭代和更新。