我的对象看起来像这样:
public class Transaction
{
long Id;
long Amount;
DateTime Date;
string ReferenceNumber;
string ParentReferenceNumber;
}
它已按Date
排序,但我需要做的是安排这些交易的列表,以便那些ParentReferenceNumber
与ReferenceNumber
匹配的交易{ {1}}按照" Parent然后Child"。
这是我尝试过的。它产生错误"收集被修改;枚举操作可能无法执行。"这就是我所害怕的,因此这个问题。
Transaction
答案 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;
});