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
}

これらのデータをに表示しますが、このリーフの深さに関係なく、プロパティがに設定されているオブジェクトでTreeView終わるパスのみを表示したいと思います。SampleClassTypetype3

私はそれを行う方法について全く手がかりがありません、誰かが私を助けることができますか?

前もって感謝します !

編集

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、葉のがsではなく空のリストであることを前提としていますnull

于 2013-02-08T19:12:22.400 に答える