5

在我当前的项目中,我无法控制的方法向我发送了一个此类对象:

public class SampleClass
{
    public SampleClass();

    public int ID { get; set; }
    public List<SampleClass> Items { get; set; }
    public string Name { get; set; }
    public SampleType Type { get; set; }
}

public enum SampleType
{
    type1,
    type2,
    type3
}

我在 a 中显示这些数据TreeView,但我只想显示以属性设置为的SampleClass对象结尾的路径,无论这片叶子的深度如何。Typetype3

我完全不知道该怎么做,有人可以帮助我吗?

提前致谢 !

编辑

为了解释我在 Shahrooz Jefri 和 dasblinkenlight 提出的解决方案中遇到的问题,这里有一张图片。左列是原始数据,没有过滤,右列是过滤后的数据。两种方法提供相同的结果。红色是问题所在。

在此处输入图像描述

4

3 回答 3

2

使用此过滤器方法:

public void Filter(List<SampleClass> items)
{
    if (items != null)
    {
        List<SampleClass> itemsToRemove = new List<SampleClass>();

        foreach (SampleClass item in items)
        {
            Filter(item.Items);
            if (item.Items == null || item.Items.Count == 0)
                if (item.Type != SampleType.type3)
                    itemsToRemove.Add(item);
        }

        foreach (SampleClass item in itemsToRemove)
        {
            items.Remove(item);
        }
    }
}
于 2013-02-08T19:55:39.910 回答
1

除了最初确定要显示哪些项目之外,如果数据量很大并且您希望用户经常折叠和展开部分,那么在每次点击后过滤我会导致缓慢的 ui 响应。

考虑使用装饰器模式或使用相关信息标记每个节点的其他方式,以便在每次单击后不需要过滤。

于 2013-02-08T19:37:12.710 回答
0

试试这个方法:

static bool ShouldKeep(SampleClass item) {
    return (item.Type == SampleType.type3 && item.Items.Count == 0)
        || item.Items.Any(ShouldKeep);
}

static SampleClass Filter(SampleClass item) {
    if (!ShouldKeep(item)) return null;
    return new SampleClass {
        Id = item.Id
    ,   Name = item.Name
    ,   Type = item.Type
    ,   Items = item.Items.Where(ShouldKeep).Select(x=>Filter(x)).ToList()
    };
}

上面的代码假设Items叶子是空列表,而不是nulls。

于 2013-02-08T19:12:22.400 回答