2

List同じタイプのものを 2 つ持ってい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は決して別のParcelIDではありません。

からのParcelオブジェクトは、内のオブジェクトbparcelsへの返信です。彼らは常にIDです。ただし、 には、 のオブジェクトのリストだけでなく、応答するすべてのオブジェクトが含まれます。ParcelaparcelRecipientIDParcelbparcelsParcelParcelaparcel

でソートされたParcelオブジェクトの新しいリストを作成したいと思います。aparcelsCreatedOn

ただし、Parcelfromがfromaparcelsによって参照されている場合( via )、対応するfromをfromの後にリストに追加します。ParcelbparcelsRecipientIDParcelbparcelsParcelaparcel

次に、「返信」を参照する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

パーセル自体への参照をディクショナリに保存する必要があると思います。これは既にリストに含まれているため、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 に答える