Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于对父项的引用将项添加到列表中_C#_Linq - Fatal编程技术网

C# 基于对父项的引用将项添加到列表中

C# 基于对父项的引用将项添加到列表中,c#,linq,C#,Linq,我有两个相同类型的包裹列表 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&l

我有两个相同类型的
包裹
列表

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

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

我认为这有点过于复杂了

您可以通过原始帖子集合进行简单的循环,并使用以下工具轻松添加所需内容:

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;
}
foreach(aposts.OrderByDescending(p=>p.CreatedOn)中的变量a)
{
包裹。添加(a);
foreach(bpost.Where(bpost=>bpost.RecipientID==a.ID)中的变量b.OrderByDescending(bpost=>bpost.CreatedOn))
{
包裹。添加范围(迭代(b,bposts));
}
}
公共IList迭代(地块a、IList b)
{
var parcels=新列表();
foreach(b.Where中的var post(bpost=>a.ID==bpost.RecipientID).OrderByDescending(bpost=>bpost.CreatedOn))
{
包裹。添加(邮寄);
包裹。添加范围(迭代(post,b));
}
归还包裹;
}

我认为您应该在字典中存储对包裹本身的引用,它们已经在列表中,这样您就不必从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);
        }
    }

这行得通吗?听起来好像多个
回复
可能具有相同的
Id
,这将导致字典中出现
DuplicateKeyException
。您能否更改命名约定以使其更易于理解?另外,一个
回复
如何引用另一个
回复
收件人Id
=
Id
?@CodingGorilla每个
Id
都是唯一的,因为它们都是
包裹
对象。“回复”另一个包裹的每个
包裹
都引用了该
包裹
的唯一ID,该包裹使用
收件人ID
进行“回复”。这基本上是一个粗略的链表,我试图按照它来确定插入顺序。实际上,我认为您这里的功能应该表现得很好-您是否有特定的性能数字来指示问题?这里的问题是每次调用parcelFacade.GetById(val),即使所有回复包都已加载,因为数据可能位于不同的机器/进程中。这不符合排序或递归添加应答
包裹
对象的条件。回复
包裹
可能不是在其父项之后立即创建的——创建日期是任意的。另外,一个回复
包裹
可能会有另一个
包裹
回复它,等等。我需要获取所有回复并将它们添加到列表中,因此您正在寻找一个无限循环来运行回复,以确保每个可能有自己回复的回复都被添加?就像一个“评论”部分。我可以评论你的主要帖子,然后有人可以评论我的评论,然后其他人可以评论他们的评论,等等。好的,明白了。
    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));
    }