c# - 根据对父项的引用将项添加到列表

标签 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();

aparcels 中的Parcel 对象是顶级项目。他们的 RecipientID 绝不是另一个 Parcel Id。

bparcels 中的Parcel 对象是对aparcel 中的Parcel 对象的回复。他们的 RecipientID 始终是 Parcel Id。但是 bparcels 包含对象 all 回复 Parcel 对象,而不仅仅是 aparcel 中的 Parcel 对象列表

我想从按 CreatedOn 排序的 aparcels 创建一个新的 Parcel 对象列表。

但是,如果 aparcels 中的 Parcelbparcels 中的 Parcel 引用(通过 RecipientID ) 我想在列表中 aparcelParcel 之后添加相应的 Parcel from bparcels .

然后我想检查 bparcels 是否有任何其他引用“回复”ParcelParcel 对象并将其添加到列表中,检查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 对象。

最佳答案

我认为您应该在字典中存储对 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));
    }

关于c# - 根据对父项的引用将项添加到列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18747659/

相关文章:

c# - 如果 c# 是类型安全语言,那么为什么允许使用 dynamic 和 object 关键字更改对象类型?

c# - 等待使用 AutoResetEvent 处理事件

c# - 如何设置从代码应用了样式的按钮的背景颜色?

C# 反射 : how to get an array values & length?

c# - 计算连续相等字符的数量

c# - 如何修复调用 Cv2.SolvePnP() 时未处理的 OpenCVException?

.net - Entity Framework 查询 - 按特定顺序获取对象

linq - 如何在 Linq 中过滤子集合

c# - 使用 LINQ 处理文本文件

c# - LINQ-to-XML 到 DataGridView : Cannot edit fields -- How to fix?