代码之家  ›  专栏  ›  技术社区  ›  bla

重构此代码[关闭]

  •  1
  • bla  · 技术社区  · 14 年前

    我正在尝试根据来自不同部门(lststaff)的员工列表填充树视图。

    public class Staff
    {
        public int StaffID { get; set; }
        public string StaffName { get; set; }
        public int DeptID { get; set; }
        public string DepartmentName { get; set; }
    }
    

    结果应该是这样的:

    部门A

    • 约翰
    • 戴夫

    部门乙

    • 安迪
    • 里昂

    我写了以下代码。但是,我认为代码应该进一步重构。

    RadTreeNode deptNode;
    RadTreeNode staffNode;
    var departments = (from d in lstStaff
                       where !string.IsNullOrEmpty(d.DepartmentName) 
                    select new { d.DeptId, d.DepartmentName })
                    .Distinct();
    
    foreach (var d in departments)
    {
        //add department node
        deptNode = new RadTreeNode()
        {
            Value = d.DeptId,
            Text = d.DepartmentName
        };
        tvwDepartmentCases.Nodes.Add(deptNode);
    
        //add staff nodes to department node
        var staffs = lstStaff
                        .ToList()
                        .Where(x => x.DeptId == d.DeptId);
    
        foreach (var s in staffs)
        {
            staffNode = new RadTreeNode()
            {
                Value = s.StaffID,
                Text = s.StaffName
            };
            deptNode.Nodes.Add(staffNode);
        }
    }
    

    欢迎发表任何评论。谢谢!

    6 回复  |  直到 14 年前
        1
  •  2
  •   Kirk Broadhurst    14 年前

    使用 GroupBy 接线员,很简单,看起来好多了。

    var departmentGroups = lstStaff.GroupBy(staff => 
        new { staff.DeptID, staff.DepartmentName });
    
    foreach (var department in departmentGroups)
    {
        var deptNode = new RadTreeNode()
        {
            Value = department.Key.DeptID,
            Text = department.Key.DepartmentName
        };
    
        tvwDepartmentCases.Nodes.Add(deptNode);
    
        foreach (var staffMember in department)
        {
            var staffNode = new RadTreeNode()
            {
                Value = staffMember.StaffID,
                Text = staffMember.StaffName
            };
            deptNode.Nodes.Add(staffNode);
        }
    }
    

    它还降低了复杂性,因为您不需要遍历 lstStaff 每个部门。

        2
  •  1
  •   cordialgerm    14 年前
    var grping = from staff in lstStaff
                 where !String.IsNullOrEmpty(staff.StaffName)
                 group staff.StaffName by staff.DepartmentName;
    
    foreach (var deptGrp in grping)
    {
             //add a high level node using deptGrp.Key
             foreach (var staffName in deptGrp) 
                   //add a lower level node
    }
    
        3
  •  0
  •   Cᴏʀʏ bcherry    14 年前

    我认为你所拥有的东西非常简单易读。它有提高性能的空间(可能可以忽略不计),但会牺牲一些可读性。有了这句话,您对当前的解决方案不喜欢什么,而您希望进一步重构?

        4
  •  0
  •   tia    14 年前

    我现在必须跑去工作,但我认为你在循环中做了太多的查询。你应该使用 .ToLookup 在循环之前为员工组创建查阅表格,并使用查阅表格来查找每个部门中的员工。

        5
  •  0
  •   Unmesh Kondolikar    14 年前

    我会写——

    foreach(var member in lstStaff)
     var deptNode = FindDeptNode(member.DeptId, member.DeptName);
     deptNode.Add(member.StaffId, member.StaffName);
    
    
    .. // in FindDeptNode
    
    if(!departmentsTreeView.ContainssNode(deptId, deptName))
     departmentsTreeView.Add(deptId, deptName);
    
    return departmentsTreeView[deptId, deptName];
    

    您可以将其转换为可编译的表单。

    干杯。

        6
  •  0
  •   Jeff Mercado    14 年前

    我将进一步从查询中创建人员节点。这在逻辑上对我来说更清楚了,因为我们拥有创建节点所需的所有信息。不幸的是,无法以清晰易读的方式在查询中创建department节点。

    var depts = from staff in lstStaff
                where !string.IsNullOrEmpty(staff.DepartmentName)
                group   //staff nodes
                    new RadTreeNode  //each item in the group is a node
                    {
                        Value = staff.StaffID,
                        Text = staff.StaffName,
                    }
                by      //departments
                    new
                    {
                        staff.DeptID,
                        staff.DepartmentName,
                    };
    foreach (var dept in depts)
    {
        var deptNode = new RadTreeNode
        {
            Value = dept.Key.DeptID,
            Text = dept.Key.DepartmentName,
        };
        deptNode.Nodes.AddRange(dept.ToArray());
        tvwDepartmentCases.Nodes.Add(deptNode);
    }