2

我有两个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对象aparcels是顶级项目。他们RecipientID从来都不是另一个Parcel身份。

中的Parcel对象是对 中的对象bparcels的回复。他们总是一个身份。但是包含所有回复对象的对象,而不仅仅是.ParcelaparcelRecipientIDParcelbparcelsParcelParcelaparcel

我想创建一个新的Parcel对象列表,aparcelsCreatedOn.

但是,如果Parcelfrom (via )aparcels引用了Parcelfrom ,我想在列表中的from之后添加相应的from 。bparcelsRecipientIDParcelbparcelsParcelaparcel

然后我想检查引用“回复”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;
            }
        }

有什么办法可以提高此操作的性能吗?它可能会处理成百上千的Parcel对象。

4

2 回答 2

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));
    }
于 2013-09-11T18:12:53.837 回答
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));
}

更新

考虑到您希望遍历每个 bpost 回复以获取任何其他回复这一事实,我编写了一个迭代方法,该方法将循环直到所有父级 -> 子级 -> 孙辈 -> 等都得到解决。这应该会根据在现场创建的内容获得您想要的一切。

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;
}
于 2013-09-11T17:50:10.777 回答