如何根据项目分层次地对列表重新排序'父母/子女关系?

时间:2016-06-13 15:56:37

标签: c# list

我的对象看起来像这样:

public class Transaction
{
   long Id;
   long Amount;
   DateTime Date;
   string ReferenceNumber;
   string ParentReferenceNumber;
}

它已按Date排序,但我需要做的是安排这些交易的列表,以便那些ParentReferenceNumberReferenceNumber匹配的交易{ {1}}按照" Parent然后Child"。

的顺序出现

这是我尝试过的。它产生错误"收集被修改;枚举操作可能无法执行。"这就是我所害怕的,因此这个问题。

Transaction

3 个答案:

答案 0 :(得分:0)

首先向每个节点添加一个子列表。例如:

public class WorkingTransaction
{
    public Transaction Details;
    public List<WorkingTransaction> Children;
    public bool HasParent;
}

然后,创建一个WorkingTransactions字典,键入Id。在这里,transactions是您的事务排序列表。

var workDict = transactions
    .Select(t => new WorkingTransaction
        { 
            Details = t, 
            Children = new List<WorkingTransaction, 
            HasParent = false
         })
    .ToDictionary(t => t.Details.Id, t);

现在,浏览字典并将具有父引用的那些添加到父项的子项列表中,并更新HasParent标志。同时,任何没有父项的项目都会添加到“根级别”列表中。

List<WorkingTransaction> rootParents = new List<WorkingTransaction>();

foreach (var kvp in workDict)
{
    WorkingTransaction parent;
    if (workDict.TryGetValue(kvp.Value.Details.ParentReferenceNumber, out parent)
    {
        parent.Children.Add(kvp.Value);
        kvp.Value.HasParent = true;
    }
    else
    {
        rootParents.Add(kvp.Value);
    }
}

现在,您可以通过每个父母处理每个孩子:

foreach (var t in rootParents)
{
    processChildren(t.Children);
}

void ProcessChildren(WorkingTransaction t)
{
    t.Children = t.Children.OrderBy(child => child.Details.Id).ThenBy(child => child.Details.Date);
    // and recursively process the children of this transaction
    foreach (var child in t.Children)
    {
        ProcessChildren(child);
    }
}

您可以使用类似的递归方法以正确的顺序输出子项。

答案 1 :(得分:0)

我必须创建一个新列表才能以简单的方式实现它。我不想改变客户端现有的对象结构。以下是我如何完成它:

var sortedList = new List<Transaction>();

foreach (var p in ListOfTransactions)
{
    if (sortedList.Contains(p))
    {
        continue; // Don't add duplicates
    }

    sortedList.Add(p); //  Add the transaction

    var child = ListOfTransactions.SingleOrDefault(x => x.ParentReferenceNumber == p.ReferenceNumber);

    if (child != null) // Add the child, if exists
    {
        sortedList.Add(child);
    }
}

答案 2 :(得分:-1)

您正在寻找有关对象排序的信息。在这里查看更多信息。 http://www.codeproject.com/Tips/761292/How-to-sort-an-object-list-in-Csharp

list.Sort(delegate(Member  x, Member y)
{
    // Sort by total in descending order
    int a = y.Total.CompareTo(x.Total);

    // Both Member has the same total.
    // Sort by name in ascending order
    a = x.Name.CompareTo(y.Name);

    return a;
});