2013-09-18 5 views
0

У меня странная ситуация. У меня есть такой класс:Как фильтровать вложенные списки?

public class Node 
{ 
    public object Data { get; set } 
    public bool Active { get; set; } 
    public List<Node> Nodes { get; set; } 
} 

Я бы хотел создать фильтр для активного объекта. Поэтому я не хочу показывать, когда свойство Active является ложным. Как я могу решить эту ситуацию? Я приму любое решение (рекурсия, linq и т. Д.).

THX для всех.

+0

Что вы имеете в виду? 'if (node.Active) {Display (node)} else {/ * не отображать * /}' – knittl

+0

Знание структуры пользовательского интерфейса, которую вы используете, и того, как вы применяете этот класс «Node» к древовидному представлению, поможет. .. –

+0

То, что вы пробовали и как оно не работает, тоже помогло бы ... –

ответ

1

Вы можете просто добавить только для чтения свойство ActiveNodes, которая идет что-то вроде этого:

public class Node 
{ 
    public object Data { get; set } 
    public bool Active { get; set; } 
    public List<Node> Nodes { get; set; } 

    public IEnumerable<Node> ActiveNodes { 
     get { 
      foreach (var node in this.Nodes) 
       if (node.Active) 
        yield return node; 
     } 
    } 
} 

, а затем использовать ActiveNodes свойство делать все, что вы обычно делали с Nodes собственности.

Как @wudzik упоминалось в разделе комментариев, вы можете достичь того же эффекта в более функциональной, так как:

public IEnumerable<Node> ActiveNodes { 
    get { 
     return this.Nodes.Where(node => node.Active); 
    } 
} 
+1

проще -> 'Nodes.Where (x => x.Active)' + вам не нужно использовать 'this' здесь – wudzik

+1

@wudzik Точка взята. Тем не менее, неопытные пользователи могут найти 'lambdas', чтобы быть несколько грязными. Также я не пытался делать никаких предположений о целевой версии CLR. «Итераторы» были представлены в версии 2.0. –

+0

Какая версия .NET поддерживает 'IEnumerable ', но не LINQ? –

1

Попробуйте

public class Node 
{ 
    public object Data {get;set;} 
    public bool Active {get;set;} 
    public List<Node> Nodes {get;set;} 
    public IEnumerable<Node> ActiveNodes 
    { 
     get 
     { 
      return Nodes.Where(n => n.Active); 
     } 
    } 
} 

в вашем TreeView использования ActiveNodes вместо от Nodes

Смежные вопросы