根据对父项的引用将项添加到列表中

时间:2013-09-11 17:30:10

标签: c# linq

我有两个相同类型的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}}个对象是Parcelbparcels个对象的回复。他们的Parcel始终是aparcel ID。但是,RecipientID包含对象所有回复Parcel个对象,而不仅仅是bparcelsParcel个对象的列表。

我想创建Parcel aparcel对象的新列表,其中Parcelaparcels排序。

但是,如果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; } } 个对象。

2 个答案:

答案 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;
}