使用递归属性 ASP.NET / C#

本文关键字:NET ASP 属性 递归 | 更新日期: 2023-09-27 17:53:32

我正在寻找一种方法来获取通用结果集,并使用jQuery Dyantree将其转换为具有 ASP.NET MVC的树结构。我有一个测试类,例如:

public class GenericResults
{
    public string ClaimId { get; set; }
    public string DrugName { get; set; }
    public int PatientId { get; set; }
    //simulates database call, this could be any type of result set
    public static List<GenericResults> MockDatabaseCall()
    {
        return new List<GenericResults>()
        {
            new GenericResults { ClaimId = "abc", DrugName="Drug 1",  PatientId=1 },
            new GenericResults { ClaimId = "bcd", DrugName="Drug 2",  PatientId=1 },
            new GenericResults { ClaimId = "def", DrugName="Drug 3",  PatientId=1 },
            new GenericResults { ClaimId = "fgi", DrugName="Drug 4",  PatientId=1 },
            new GenericResults { ClaimId = "ijk", DrugName="Drug 5",  PatientId=2 },
            new GenericResults { ClaimId = "klm", DrugName="Drug 6",  PatientId=2 },
            new GenericResults { ClaimId = "mno", DrugName="Drug 7",  PatientId=2 },
            new GenericResults { ClaimId = "pqr", DrugName="Drug 8",  PatientId=2 },
            new GenericResults { ClaimId = "qrs", DrugName="Drug 9",  PatientId=2 },
            new GenericResults { ClaimId = "stu", DrugName="Drug 10", PatientId=2 },
        };
    }
}

Dynatree的数据需要的结构是这样的:

public string Title { get; set; }
public List<TreeView> Children { get; set; }
public bool IsFolder
{
    get
    {
        return this.Children.Count > 0;
    }
}

在此示例中,我们确实不需要 ClaimId 属性,但我想重用我已经编写的存储过程来馈送到树,因此我想包含它。我需要已分组的内容成为其自己的TreeView对象,并且Children属性是具有分组内容值的所有记录。 到目前为止,MockDatabaseCallMethod,如果我分组PatientId我将需要两个TreeView对象:每个唯一的PatientId一个。 我希望能够以递归方式执行此操作,但不确定如何,因为某些项目将是叶子(没有子项(,这很好。 这是我的尝试:

public class TreeView
{
    public string Title
    {
        get;
        set;
    }
    public List<TreeView> Children { get; set; }
    public bool IsFolder
    {
        get
        {
            return this.Children.Count > 0;
        }
    }
    //made void for the time being to limit compilation errors
    public static void ListToTree(string displayName,string groupedOn)
    {
        //seed data
        List<GenericResults> results = GenericResults.MockDatabaseCall();
        //"group" on the property passed by the user
        var query = results.Select(x => x.GetType().GetProperty(groupedOn).GetValue(x,null)).Distinct();
        foreach (var i in query)
        {
            var treeView = new TreeView();
            treeView.Title = displayName;
            //iterate over results, if object has the property value of what's currently being iterated over
            //create a new TreeView object for it
            treeView.Children = results.Where(x => x.GetType().GetProperty(groupedOn).GetValue(x, null) == i)
                                       .Select(n => new TreeView
                                                    {
                                                        Title = displayName,
                                                        Children = x <--no idea what to do here
                                                    });
        }
    }
}

理想情况下,我想要一个ToTree扩展方法,但起初我想得到一些关于此的指示。 谢谢:)

使用递归属性 ASP.NET / C#

我不确定我是否正确理解了你,但如果我理解正确,我会建议以下解决方案:

-(在TreeView将属性public List<TreeView> Children { get; set; }更改为public IEnumerable<GenericResults> Children { get; set; }

-(将void ListToTree(string displayName方法替换为以下方法:

public static List<TreeView> ListToTree(string displayName, string groupedOn)
{
    //seed data
    List<GenericResults> results = GenericResults.MockDatabaseCall();
    List<TreeView> trees = new List<TreeView>();
    //"group" on the property passed by the user
    var query = results.Select(x => x.GetType().GetProperty(groupedOn).GetValue(x, null)).Distinct();
    foreach (int i in query)
    {
        var treeView = new TreeView();
        treeView.Title = displayName;
        treeView.Children = results.Where(x => ((int)x.GetType().GetProperty(groupedOn).GetValue(x, null)) == i);
        trees.Add(treeView);
    }
    return trees;
}

但是,我不确定,如果我正确理解了您;-(