0

希望有人可以评论一种更有效的方法来做到这一点:我有一个代表用户待办事项列表的通用工作项列表。目前,这仅按截止日期排序并显示在 Obout Treeview 中,并且工作正常。

现在我们希望通过允许用户通过将主要和次要“过滤器”(即,按截止日期,然后按接收日期或类似的)应用到该树视图来对他们的待办事项列表进行排序,以便树视图显示主排序作为父排序,次排序作为子排序。实际项目将显示为孙子项目,如下所示:

Due Date
- Received Date
-- Work Item
-- Work Item
- Received Date
-- Work Item 
Due Date

... ETC

据我所知,Obout Treeview 有一些关键的限制:

  1. 父节点必须在其子节点之前创建
  2. 节点一旦创建就不能删除
  3. 没有方法可以查看是否存在其他节点(父节点、兄弟节点、子节点),因此您无法以编程方式判断节点是否会在服务器端重复。

我正在修改一些旧代码,所以对我的例子要温柔。我不得不拿出很多东西来澄清它在做什么。

public void generateOboutTreeContent()
{
    // Add unique root nodes.
    switch (primarySort)
    {
        [...]
        case SortOption.ByDueDate:
            addNodesForDueDates(true);
            break;
        [...]
    }

    // Then add child nodes for each root node.
    switch (secondarySort)
    {
        [...]
        case SortOption.ByReceivedDate:
            addNodesForReceivedDates();
            break;
        [...]
    }

    // Finally, add all the actual items as grandchildren.
    foreach (WorkItem item in WorkQueue)
    {
        tree.Add(parentID, item.ID, item.url, false);
    }
}

private void addNodesForDueDates(bool isRootNode = false)
{
    var uniqueNodes = workQueue.GroupBy(i => i.DueDate).Select(group => group.First()).ToList();
    foreach (classWorkItem node in uniqueNodes)
    {
        var dueDate = node.DueDate;
        if (isRootNode)
        {
            tree.Add("root", dueDate, dueDate , false);
        }
        else
        {
            tree.Add(parentID, dueDate, dueDate, false);
        }
    }
}

我怎样才能更有效地从通用列表中为 Obout 树创建根优先层次结构,而一次又一次地遍历数据集以获取唯一值?

使用硬编码排序创建结构已经够麻烦了,但是尝试以一种干净利落地允许用户定义排序(没有子类或方法的爆炸式增长)的方式对其进行编码真的让我很难过。我很想听听任何建议!

谢谢你。

4

1 回答 1

2

您不是按这些日期对数据进行排序,而是按这些数据对数据进行分组(然后对这些组进行排序)。

要根据字段对项目进行分组,只需使用GroupBy.

您只需要按第一个字段对您的项目进行分组,在第二个字段上对每个组进行分组,并根据需要添加排序子句以对组本身进行排序。

var query = from item in data
            group item by item.DueDate into dueDateGroup
            orderby dueDateGroup.Key
            select from item in dueDateGroup
                    group item by item.RecievedDate into recievedDateGroup
                    orderby recievedDateGroup.Key
                    select recievedDateGroup;

或者,如果您更喜欢使用方法语法:

var query2 = data.GroupBy(item => item.DueDate)
    .OrderBy(group => group.Key)
    .Select(dueDateGroup =>
        dueDateGroup.GroupBy(item => item.RecievedDate)
            .OrderBy(group => group.Key));

将数据转换为适当的模型后,将该模型转换为 TreeView 应该很简单,您只需迭代每个组并为该组创建一个项目,然后迭代该组中的项目,为每个项目添加子节点,并为那些孩子(他们自己是组)做同样的事情来添加孙子。

于 2016-05-05T00:40:18.120 回答