我有两个相同类型的List
Parcel
。
public class Parcel
{
int Id {get;set;}
int RecipientID {get;set;}
DateTime CreatedOn {get;set;}
}
List<Parcel> aparcels = postFacade.GetParcels()
.OrderByDescending(x => x.CreatedOn);
List<Parcel> bparcels = postFacade.GetReplyParcels();
来自Parcel
的{{1}}个对象是顶级项目。他们的aparcels
绝不是另一个RecipientID
ID。
来自Parcel
的{{1}}个对象是Parcel
中bparcels
个对象的回复。他们的Parcel
始终是aparcel
ID。但是,RecipientID
包含对象所有回复Parcel
个对象,而不仅仅是bparcels
中Parcel
个对象的列表。
我想创建Parcel
aparcel
对象的新列表,其中Parcel
按aparcels
排序。
但是,如果CreatedOn
Parcel
aparcels
引用了来自Parcel
的{{1}}(通过bparcels
),我想添加相应的RecipientID
} Parcel
之后bparcels
来自列表中的Parcel
。
然后,我想检查aparcel
以查找引用“回复”bparcels
的任何其他Parcel
个对象,并将其添加到列表中,递归检查Parcel
直到不再找到“回复”bparcels
个对象。
这就是我想出来的:
Parcel
有什么办法可以提高这项操作的性能吗?它可能会处理数百/数千个 List<Parcel> parcels = new List<Parcels>();
var replies = bposts.ToDictionary(u => u.RecipientID, p => p.Id);
foreach (var p in aparcels)
{
parcels.Add(p);
int commid = p.Id;
int val;
while (replies.TryGetValue(commid, out val))
{
parcels.Add(parcelFacade.GetById(val));
commid = val;
}
}
个对象。
答案 0 :(得分:1)
我认为您应该在字典中存储对Parcels本身的引用,这些引用已经在列表中,因此您不必再从Facade中加载它们,这可能会减慢您的代码速度。
List<Parcel> parcels = new List<Parcels>();
var replies = bposts.ToDictionary(u => u.RecipientID);
foreach (var p in aparcels)
{
parcels.Add(p);
Parcel parent = p;
while (replies.TryGetValue(parent.Id, out parent))
{
parcels.Add(parent);
}
}
或者,使它更短:
foreach (var p in aparcels)
{
var current = p;
do parcels.Add(current);
while (replies.TryGetValue(current.Id, out current));
}
答案 1 :(得分:0)
我认为你过分复杂了。
您可以通过原始帖子集合进行简单循环,并使用以下内容轻松添加您需要的内容:
foreach(var a in aposts.OrderByDescending(p => p.CreatedOn))
{
parcels.Add(a);
parcels.Add(bposts.Where(b => a.ID == b.RecipientID).OrderByDescending(p => p.CreatedOn));
}
<强>更新强>
考虑到你想循环遍历每个比利时回复以获得任何其他回复的事实,我已经编写了一个迭代方法,它将循环直到所有父级 - >儿童 - &gt;孙子 - &gt;等解决了。这应该根据在现场创建的所有内容获得。
foreach(var a in aposts.OrderByDescending(p => p.CreatedOn))
{
parcels.Add(a);
foreach(var b in bposts.Where(bpost => bpost.RecipientID == a.ID).OrderByDescending(bpost => bpost.CreatedOn))
{
parcels.AddRange(Iterate(b, bposts));
}
}
public IList<Parcel> Iterate(Parcel a, IList<Parcel> b)
{
var parcels = new List<Parcel>();
foreach(var post in b.Where(bpost => a.ID == bpost.RecipientID).OrderByDescending(bpost => bpost.CreatedOn))
{
parcels.Add(post);
parcels.AddRange(Iterate(post, b));
}
return parcels;
}