在多级树结构中搜索

时间:2017-06-13 09:21:13

标签: c# linq

我有类似下面的类结构

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标志。

知道怎么做。

3 个答案:

答案 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;

现在level4sOfInterestIEnumerable<Level4>,您可以根据需要进行迭代和更新。